Метро в Прологе - PullRequest
       3

Метро в Прологе

2 голосов
/ 03 января 2011

Я делаю практику в Прологе, и мне нужна программа, в которой говорится, как добраться от станции до другой станции в Мадридском метро (Метро де Мадрид).

У меня есть файлк данным (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).

В моем программном файле:

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

Когда я советуюсь с Прологом, например «camino (sol, goya, [], L).», Яполучить различный ответ:

L = [sol, sevilla, banco_de_espana, retiro, principe_de_vergara, goya] ;
...
L = [<b>sol</b>, callao, opera, <b>sol</b>, sevilla, banco_de_espana, retiro, principe_de_vergara, goya] ;
...

Проблема в том, что "L" содержит два экземпляра "sol".Я не знаю, где проблема.Я думаю, что это не очень хорошо.

1 Ответ

5 голосов
/ 03 января 2011

В вашем решении есть крайний случай: самая первая станция (т. Е. Sol) никогда не помещается в список Visitados.Следовательно, эта конкретная станция не защищена от повторения условием not(member(...)).Изменение запроса на camino(sol, goya, [sol], L). дает ожидаемые результаты.Я предлагаю добавить этот предикат:

camino(A, B, L) :-
  camino(A, B, [A], L).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...