Prolog - flights

#1
Hallo Ich hab mal wieder eine Frage
Also ich habe diesen Code bekommen [ganzer Code unten] und muss nun am Dienstag von London wegfliegen und am Freitag wieder in London landen und dazwischen muss ich durch Mialno, Ljubljana und Zürich fliegen. Und jeden Tag kann man nur einmal fliegen

Ich habe es nun mit
Code:
travel0(london,london,tue,fri,[zurich,milano,ljubljana]).
versucht
aber es kommt immer nur false
was mach ich falsch? denn
Code:
travel0(City1,City2,Day,Arrival1,[City1-City3:Flight1:Departure1|Residual]):-
flight(City1,City3,Day,Flight1,Departure1,Arrival3),
possibleTransfer(Arrival1,Departure1),
travel0(City3,City2,Day,Arrival3,Residual).
City1 = London
City 2= London
Day = Tue
Arrival = Fri
City1-City3 = [Milano, Zürich, Ljubiljana]

oder hab ich da jz iwas falsch verstanden****? verzweifel schon langsam :(

Code:
% flights.pl:
:-op(50,xfy,:).
timeTable(edinburgh,london,
[9:40/10:50/ba4733/daily,
13:40/14:50/ba4753/daily, 19:40/20:50/ba4833/[mon,tue,wed,thu,fri,sun]]).
timeTable(london,edinburgh,
[9:40/10:50/ba4732/daily, 11:40/12:50/ba4752/daily, 18:40/19:50/ba4822/[mon,tue,wed,thu,fri]]).
timeTable(london,ljubljana,
[13:20/16:20/sa201/[fri], 13:20/16:20/sa213/[sun]]).
timeTable(ljubljana,london,
[11:10/12:20/sa200/[fri], 11:25/12:20/sa212/[sun]]).
timeTable(london,zurich,
[9:10/11:45/ba510/daily, 14:45/17:20/sr459/daily]).
timeTable(zurich,london,
[9:00/9:40/ba613/[mon,tue,wed,thu,fri,sat], 16:10/16:55/sr806/[mon,tue,wed,thu,fri,sun]]).
timeTable(london,milano,
[8:30/11:20/ba510/daily, 11:00/13:50/az459/daily]).
timeTable(milano,london,
[9:10/10:00/az458/daily, 12:20/13:10/ba511/daily]).
timeTable(ljubljana,zurich,
[11:30/12:40/sa322/[tue,thu]]).
timeTable(zurich,ljubljana,
[13:30/14:40/sa323/[tue,thu]]).
timeTable(zurich,milano,
[7:55/8:45/sr620/daily]).
timeTable(milano,zurich,
[9:25/10:15/sr621/daily,
12:45/13:35/sr623/daily]).
 
flight(City1,City2,Day,Flight,Departure,Arrival):-
timeTable(City1,City2,TimeTable),
member(Departure/Arrival/Flight/DayTimeTable,TimeTable),
dayOfFlight(Day,DayTimeTable).
 
dayOfFlight(Day,daily):-
member(Day,[mon,tue,wed,thu,fri,sat,sun]).
dayOfFlight(Day,List):-
member(Day,List).
 
travel(City1,City2,Day,Letovi):-
travel0(City1,City2,Day,0:0,Letovi).
 
% Arrival1 contains the time of arrival in City1;
% it limits the no. of flights with which one can continue travelling
travel0(City1,City2,Day,Arrival1,[City1-City2:Flight:Departure1]):-
flight(City1,City2,Day,Flight,Departure1,_),
possibleTransfer(Arrival1,Departure1).
 
travel0(City1,City2,Day,Arrival1,[City1-City3:Flight1:Departure1|Residual]):-
flight(City1,City3,Day,Flight1,Departure1,Arrival3),
possibleTransfer(Arrival1,Departure1),
travel0(City3,City2,Day,Arrival3,Residual).
 
timeOfDeparture([_-_:_:Departure|_],Departure).
 
possibleTransfer(Hour1:Minute1,Hour2:Minute2):-
60*(Hour2-Hour1)+Minute2-Minute1>=40.
 
member(X,[X|_]).member(X,[_|Rest]):-
member(X,Rest).
 

deepthroat

Erfahrenes Mitglied
#2
Hi.
Hallo Ich hab mal wieder eine Frage
Also ich habe diesen Code bekommen [ganzer Code unten] und muss nun am Dienstag von London wegfliegen und am Freitag wieder in London landen und dazwischen muss ich durch Mialno, Ljubljana und Zürich fliegen. Und jeden Tag kann man nur einmal fliegen

Ich habe es nun mit
Code:
travel0(london,london,tue,fri,[zurich,milano,ljubljana]).
versucht
aber es kommt immer nur false
was mach ich falsch? denn
Code:
travel0(City1,City2,Day,Arrival1,[City1-City3:Flight1:Departure1|Residual]):-
flight(City1,City3,Day,Flight1,Departure1,Arrival3),
possibleTransfer(Arrival1,Departure1),
travel0(City3,City2,Day,Arrival3,Residual).
City1 = London
City 2= London
Day = Tue
Arrival = Fri
City1-City3 = [Milano, Zürich, Ljubiljana]

oder hab ich da jz iwas falsch verstanden****?
Ja, da hast du was falsch verstanden. Du müßtest zu allererst mal das vorgegebene Listenformat einhalten.

Ein Element der Liste soll aus City1 <Bindestrich> City2 <Doppelpunkt> Flight <Doppelpunkt> Departure bestehen. M.a.W. man kann nicht einfach nur ein Atom wie "london" angeben.

Dann ist m.M.n. das travel0 nur ein Hilfsprädikat, das travel Prädikat ist was du verwenden müßtest:
Code:
| ?- travel(london, london, tue, X).

X = [london-edinburgh:ba4732:9:40,edinburgh-london:ba4753:13:40]  ;

X = [london-edinburgh:ba4732:9:40,edinburgh-london:ba4833:19:40]

 ...
Das Prädikat ermittelt alle Routen von City1 nach City2. Im einfachsten Fall würde man bswp. nach Edingburgh und zurück fliegen. Du müßtest jetzt noch weitere Einschränkungen definieren (nur 1 Flug pro Tag und Besuch aller Städte).
 
#3
Danke für die Antwort
leider weiß ich nur, wie ich eben mit travel von einer stadt zur nächsten fliege, aber wie kann ich es machen, dass man davor noch durch die anderen Städte fliegt (und ich ja eigentlich nicht die Reihenfolge der Städte aussuche)?
Da häng ich jetzt :/
sonst könnt ich ja travel(london,milano,tue,X). travel(milano, zurich, wen, X). usw machen aber das ist ja doch falsch ...
 

deepthroat

Erfahrenes Mitglied
#4
Danke für die Antwort
leider weiß ich nur, wie ich eben mit travel von einer stadt zur nächsten fliege, aber wie kann ich es machen, dass man davor noch durch die anderen Städte fliegt (und ich ja eigentlich nicht die Reihenfolge der Städte aussuche)?
Du müßtest halt am Dienstag von London aus Irgendwo hinfliegen, am Mittwoch von dort Irgendwoanders hin, am Do von dort wieder Woanders hin und am Fr. von dort wieder zurück nach London.

Dann formulierst du noch weitere Bedinungen, so das Irgendwo, Irgendwoanders und Woanders Milan, Zürich und Ljubljana (in beliebiger Reihenfolge) sein müssen.