# Prolog - flights



## whasabi (11. Januar 2014)

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

```
travel0(london,london,tue,fri,[zurich,milano,ljubljana]).
```
versucht
aber es kommt immer nur false
was mach ich falsch? denn

```
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 


```
% 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 (13. Januar 2014)

Hi.





whasabi hat gesagt.:


> 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
> ...


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:

```
| ?- 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).


----------



## whasabi (13. Januar 2014)

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 (13. Januar 2014)

whasabi hat gesagt.:


> 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.


----------

