2 Stimmen

Unterirdisch in Prolog

Ich mache eine Übung in Prolog, und ich brauche ein Programm, das den Weg von einer Station zu einer anderen Station in der Madrider U-Bahn (Metro de Madrid) beschreibt.

Ich habe eine Datei mit Daten (datos.pl) und eine andere Datei mit Programmen (programa.pl). In die Datendatei schreibe ich die Wissensbasis. Zum Beispiel:

linea(2, cuatro_caminos). linea(2, canal). linea(2, quevedo). linea(2, san_bernardo). linea(2, noviciado). linea(2, santo_domingo). linea(2, opera). linea(2, sol). linea(2, sevilla). linea(2, banco_de_espana). linea(2, retiro). linea(2, principe_de_vergara). linea(2, goya). linea(2, manuel_becerra). linea(2, ventas).

linea(3, moncloa). linea(3, arguelles). linea(3, ventura_rodriguez). linea(3, plaza_de_espana). linea(3, callao). linea(3, sol). linea(3, lavapies). linea(3, embajadores). linea(3, palos_de_la_frontera). linea(3, delicias). linea(3, legazpi).

arista(2, cuatro_caminos, canal). arista(2, canal, quevedo). arista(2, quevedo, san_bernardo). arista(2, san_bernardo, noviciado). arista(2, noviciado, santo_domingo). arista(2, santo_domingo, opera). arista(2, opera, sol). arista(2, sol, sevilla). arista(2, sevilla, banco_de_espana). arista(2, banco_de_espana, retiro). arista(2, retiro, principe_de_vergara). arista(2, principe_de_vergara, goya). arista(2, goya, manuel_becerra). arista(2, manuel_becerra, ventas).

arista(3, moncloa, arguelles). arista(3, arguelles, ventura_rodriguez). arista(3, ventura_rodriguez, plaza_de_espana). arista(3, plaza_de_espana, callao). arista(3, callao, sol). arista(3, sol, lavapies). arista(3, lavapies, embajadores). arista(3, embajadores, palos_de_la_frontera). arista(3, palos_de_la_frontera, delicias). arista(3, delicias, legazpi).

In meiner Programmdatei:

:- consult(['datos.pl']).

camino(A, A, _, [A]).

camino(A, B, Visitados, [A|Resto]):-
   (arista(_, A, ASig); arista(_, ASig, A)),
   not(member(ASig, Visitados)),
   camino(ASig, B, [ASig|Visitados], Resto).

Wenn ich Prolog befrage, zum Beispiel "camino(sol, goya, [], L).", erhalte ich verschiedene Antworten:

L = \[sol, sevilla, banco\_de\_espana, retiro, principe\_de\_vergara, goya\] ;
...
L = \[**sol**, callao, opera, **sol**, sevilla, banco\_de\_espana, retiro, principe\_de\_vergara, goya\] ;
...

Das Problem ist, dass "L" zwei Instanzen von "sol" enthält. Ich weiß nicht, wo das Problem liegt. Ich denke, dass der Weg nicht gut gebaut ist.

5voto

Ihre Lösung hat eine Schwachstelle: Die allererste Station (d.h. Sol) wird nie in die Visitados Liste. Daher ist diese spezielle Station nicht durch die Bedingung vor Wiederholungen geschützt not(member(...)) . Ändern Sie die Abfrage in camino(sol, goya, [sol], L). führt zu den erwarteten Ergebnissen. Ich schlage vor, dieses Prädikat hinzuzufügen:

camino(A, B, L) :-
  camino(A, B, [A], L).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X