2011-01-03 6 views
2

私はPrologで練習をしています。私は駅から、マドリード地下鉄(マドリード地下鉄)の駅に行く方法を言うプログラムが必要です。プロローグの地下

私はデータ(datos.pl)へのファイルと、プログラム(programa.pl)による他のファイルを持っています。データファイルには知識ベースが書かれています。例えば:私のプログラムファイルで

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

: "カミノ(ゾル、ゴーヤー、[]、L)"

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

私はプロローグ、例えばに相談したとき、私は様々な応答を受信します。

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

"L"は "sol"の2つのインスタンスに該当します。私はどこに問題があるのか​​分からない。私はそれが道をうまく構築しないと思う。

答えて

5

ソリューションにエッジケースがあります。最初のステーション(つまりゾル)がVisitadosリストにプッシュされることはありません。したがって、この特定のステーションは、条件not(member(...))によって繰り返しから保護されていません。クエリをcamino(sol, goya, [sol], L).に変更すると、予想される結果が得られます。私はこの述語を追加することをお勧めします:

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

おはよう、ありがとうございます!あなたの答えは私に問題を解決します。宜しくお願いします!! :) – Israel

+0

はい、あなたは私の答えを受け入れなかったし、1-up'edでした! –