/* * Title: ISK - 4. Abgabe * Description: einfaches "lernen" in Prolog * authors Gerald Haider, Thomas Scheichenstein, Christoph Bartenstein * version 0.1 * This document is copyright (C) 2002 Gerald Haider, and it's free. * You can distribute it under the terms of the GNU General Public License, * which you can get at http://www.gnu.org/copyleft/gpl.html. */ /*PROGRAMMSTART - unter Umständen (Konfigurationsfrage des Prol. Editors muß in den 1. eckigen Klammern der Source zum File bestellungen.pro eingegeben werden zb. ['c:/prolog/bestellungen.pro'] damit Programm nach Eingabe von go. ordnungsgemäss funktioniert */ go :- ['bestellungen.pro'], %[wissensbasis], write('Bitte geben Sie Ihre Kundenummer ein:'), nl, readln(Text1), nl, nth0(0, Text1, Kdnr), /*Einlesen der Kundendaten mit Überprüfung der Eingabedaten auf Richtigkeit*/ kundenname(Kdnr, Kundenname) -> ( %kdadresse(Kdnr, Kdadr), write('Herzlich Willkommen '), write(Kundenname), % write(' aus '), write(Kdadr), nl, nl, bestellungen(Best), /*Aufrufen der Methode zur Analyse des Bestellverhaltens des Kunde*/ getBestellung(Kdnr, Best, Sort), /*Aufruf derMethode zur Kundenbefragung*/ abfragen(Kdnr,Sort)); write('Ihre Kundennummer ist ungültig!!!'), write('Bitte beantragen Sie beim Administrator einen neuen Account'). /*Gesamtauswahl*/ gesbest(Kdnr):- write_ln('Folgende Angebote sind derzeit verfügbar:'), write_ln('1: Großes Wellenreiten mit Sepp'), write_ln('2: Hochseefichen mit Fritz'), write_ln('3: Tennis mit Anna Kurnikova'), write_ln('4: Schwimmtraining für den Iron-Man mit Horst'), write_ln('5: Ganzkörpermassage mit Gina :-)'), write_ln('6: Surfen für Anfänger mit Detlef als Trainer'), write_ln('Bitte geben Sie die gewünschte Nummer ein:'), nl, readln(Text2), nth0(0, Text2, Sportnr),nl, sportkontrolle(Kdnr, Sportnr). /*Kontrolle der Sportartenauswahl*/ sportkontrolle(Kdnr, Sportnr):- kundenname(Kdnr, Kundenname), %kdadresse(Kdnr, Kdadr), sportname(Sportnr, Sportname, Art) -> ( write('Ihr gewählter Sport: '), write_ln(Sportname), write_ln('Bitte geben Sie die gewünschte Uhrzeit ein:'), write_ln('Die Eingabe muss im Format HHMM erfolgen!'), readln(Text3),nl, nth0(0, Text3, Uhrzeit), @=<(Uhrzeit, 2400) -> ( (@>(Uhrzeit, 0), integer(Uhrzeit)) -> ( nl, /*Einlesen der Bestellzeit*/ get_time(Zeit), convert_time(Zeit, Jahr, Monat, Tag, Stunde, Minute, _Second, _Milliseconds), Bestellzeit = (Stunde ':' Minute '-' Tag '-' Monat '-'Jahr), /*Ausgabe der Bestelldaten auf den UserScreen*/ write(' Kundennummer: '), write_ln(Kdnr), write(' Kundenname: '), write_ln(Kundenname), nl, write(' Sportart: '), write_ln(Art), write(' Sportname: '), write_ln(Sportname), write(' Sportnummer: '), write_ln(Sportnr), write(' Uhrzeit: '), write_ln(Uhrzeit), nl, /*Speichern der Bestellung in der Liste und Sortierung dieser*/ bestellungen(List), append(List, [[Kdnr, Sportnr, Art, Bestellzeit, Uhrzeit]], New), sort(New,SL), write_ln('Danke das Sie unser Service in Anspruch genommen haben!'), tell('bestellungen.pro'), write_ln('bestellungen('), write_ln(SL), write(').'), told ) ; (write_ln('Die eingegebene Uhrzeit ist ungültig!'),nl, fail) ); (write_ln('Die eingegebene Uhrzeit ist ungültig!'), nl, fail) ); write('Sportnummer ungültig! Bitte überprüfen Sie Ihre Eingabe'). /*Methode zur Analyse des Bestellverhaltens vom Kunden*/ getBestellung(Nr,Liste, Sol) :- findall(Vart,member([Nr,_,Vart,_,_],Liste),Lis), suche_best(Lis, Sol). /* Untermethode zu getBestellung sucht für alle Dienstleistungen die zugehörige Anzahl speichert das ergebnis in der Form [[max_anzahl,name],[max_anzahl-1,name],..] */ suche_best(Lst,SortierteListe) :- forall(member(X,Lst), (count_elem(Lst,X,N),assert(abo_count(N,X)))), findall([A,S],abo_count(A,S),Lt), abolish(abo_count,2), sort(Lt,SortL), reverse(SortL,SortierteListe). /* gibt die Anzahl einer Veranstaltungsart mit der Art in eine Liste aus */ count_elem(Lst,Vart,N) :- findall(Vart,member(Vart,Lst),Li), zaehle_elem(_,Li,N). zaehle_elem(_,[],0). zaehle_elem(X,[X|T],N1) :- !, zaehle_elem(X,T,N), N1 is N + 1. zaehle_elem(X,[_|T],N) :- zaehle_elem(X,T,N). abfragen(Kdnr, []):- write('Keine Bestelldaten gespeichert!!! -> Keine Eingrenzung möglich!!!'), gesbest(Kdnr). abfragen(Kdnr, [[_Anz, Art1]|Rest]):- write('Wollen Sie folgende Sportart ausüben?: '), write(Art1),nl, write('Geben Sie'),nl, write(' j ein um dies zu Bestellen,'),nl, write(' n ein um erneut einen Vorschlag zu erhalten'), nl, write(' a ein um die komplette Angebotsliste zu sehen,'), nl, write(' x um den Reservierungsvorgang abzubrechen!'), nl, readln(Text),nl, nth0(0,Text,Answer), abfrageFortsetzen(Kdnr, Art1, Rest, Answer). abfrageFortsetzen(Kdnr, Art2, _L, 'j') :- artikelBestellen(Kdnr, Art2). abfrageFortsetzen(Kdnr, _Art2, _L, 'a') :- gesbest(Kdnr). abfrageFortsetzen(_Kdnr, _Art2, _L, 'x') :- write('Schauen Sie bald wieder bei uns vorbei!!!'). abfrageFortsetzen(Kdnr, _Art2, L, _Answer) :- abfragen(Kdnr, L). abfrageFortsetzen(Kdnr, _Art2, [], _Answer) :- write('Leider wurde kein Passender Vorschlag mehr gefunden,'), write(' Sie müssen aus unserer gesamten Angebot auswählen!'), nl, gesbest(Kdnr). artikelBestellen(Kdnr, 'surfen') :- write('Folgende Angebote sind derzeit verfügbar:'), nl, nl, write('1: Großes Wellenreiten mit Sepp'),nl, write('6: Surfen für Anfänger mit Detlef als Trainer'), nl, nl, write('Bitte geben Sie die gewählte Sportnummer ein:'), nl, readln(Text2), nth0(0, Text2, Sportnr),nl, sportkontrolle(Kdnr, Sportnr). artikelBestellen(Kdnr, 'tennis') :- write('Folgende Angebote sind derzeit verfügbar:'), nl, nl, write('3: Tennis mit Anna Kurnikova'), nl, nl, write('Bitte geben Sie die gewählte Sportnummer ein:'), nl, readln(Text2), nth0(0, Text2, Sportnr),nl, sportkontrolle(Kdnr, Sportnr). artikelBestellen(Kdnr, 'schwimmen') :- write('Folgende Angebote sind derzeit verfügbar:'), nl, nl, write('4: Schwimmtraining für den Iron-Man mit Horst'), nl, nl, write('Bitte geben Sie die gewählte Sportnummer ein:'), nl, readln(Text2), nth0(0, Text2, Sportnr),nl, sportkontrolle(Kdnr, Sportnr). artikelBestellen(Kdnr, 'massage') :- write('Folgende Angebote sind derzeit verfügbar:'), nl, nl, write('5: Ganzkörpermassage mit Gina :-)'), nl, nl, write('Bitte geben Sie die gewählte Sportnummer ein:'), nl, readln(Text2), nth0(0, Text2, Sportnr),nl, sportkontrolle(Kdnr, Sportnr). artikelBestellen(Kdnr, 'fischen') :- write('Folgende Angebote sind derzeit verfügbar:'), nl, nl, write('2: Hochseefichen mit Fritz'), nl, nl, write('Bitte geben Sie die gewählte Sportnummer ein:'), nl, readln(Text2), nth0(0, Text2, Sportnr),nl, sportkontrolle(Kdnr, Sportnr). valid_time(T) :- sub_string(T,0,2,Temp,H), %überprüfen ob zeitformat gültig ist write('string H: '), write(H), write('string Temp: '), write_ln(Temp), sub_string(T,2,2,Temp2,M), write('string M: '), write(M), write('string Temp2: '), write_ln(Temp2), valid(H,M), nl. valid(Hh,Mm) :- valid_hours(Hh), valid_minutes(Mm). valid_minutes(Minutes) :- % simple checking if this is a valid time... % a little complicate but it works ;-) %IF ( Minutes =< 59 ) % THEN -> ( true ) % ELSE ; ( fail ) . valid_hours(Hours) :- % simple checking if this is a valid time... % a little complicate but it works ;-) %IF ( Hours =< 23 ) % THEN -> ( true ) % ELSE ; ( fail ) . /*WISSENSBASIS*/ kdnr(1111). kdnr(2222). kdnr(3333). kdnr(4444). kundenname(1111, 'Gerald'). kundenname(2222, 'Thomas'). kundenname(3333, 'Chris'). kundenname(4444, 'Max'). sportnr(1). sportnr(2). sportnr(3). sportnr(4). sportnr(5). sportnr(6). sportname(1, 'Großes Wellenreiten mit Sepp', 'surfen'). sportname(2, 'Hochseefichen mit Fischer Fritz', 'fischen'). sportname(3, 'Tennis mit Anna Kurnikova', 'tennis'). sportname(4, 'Schwimmtraining für den Iron-Man mit Horst', 'schwimmen'). sportname(5, 'Ganzkörpermassage mit Gina :-)', 'massage'). sportname(6, 'Surfen für Anfänger mit Detlef als Trainer', 'surfen').