2010-12-14 61 views
0
% link(Origin,Destination,Speed,Length). 
link(paris,milano,140,360). 
link(paris,london,200,698). 
link(berlin,atena,110,714). 
link(atena,paris,90,370). 

je dois écrire ce prédicat d'itinéraire donc je reçois un Path de la ville X à la ville Y.Aide à la recherche des chemins

route(Origin,Destination,TrainType,Path,Length,Duration). 

Je suis nouveau à Prolog, j'ai donc écrit quelque chose comme ça. Je sais que ça corrige pas:

route(Origin,Destination,TrainType,Path,Legth,Duration) :- 
    link(Origin,City,Len), 
    City \= Origin, 
    NewLen is Length + Len, 
    route(City,Destination,TrainType,Path,NewLen,Duration). 

Répondre

2

Votre prédicat ne dispose pas d'un cas de base , qui lui indique quand arrêter. En ce moment, votre prédicat s'appellera toujours jusqu'à ce qu'il échoue (ou pire, boucle indéfiniment, en fonction de votre prédicat link). Ce qui suit vous donne un chemin inverse:

route(Goal, Goal, Path, Path). % base case 
route(From, To, Path0, Path) :- 
    direct_link(From, Via), 
    route(Via, To, [From|Path0], Path). 

où un lien direct signifie que vous pouvez obtenir de A à B; Je suppose les chemins de fer sont bidirectionnels:

direct_link(A,B) :- link(A, B, _Speed, _Length). 
direct_link(B,A) :- link(B, A, _Speed, _Length). 

Vous devrez appeler reverse sur le chemin et ajouter des arguments pour garder la trace de la longueur et la durée. Je vais laisser cela comme un exercice.