Prolog 序言中的地下

Prolog 序言中的地下,prolog,Prolog,我正在做一个Prolog的练习,我需要做一个程序,告诉我从一个车站到另一个车站的路,马德里地铁(Metro de Madrid) 我有一个数据文件(datos.pl)和另一个程序文件(programa.pl)。在数据文件中,我编写了知识库。例如: linea(2, cuatro_caminos). linea(2, canal). linea(2, quevedo). linea(2, san_bernardo). linea(2, noviciado). linea(2, santo_domi

我正在做一个Prolog的练习,我需要做一个程序,告诉我从一个车站到另一个车站的路,马德里地铁(Metro de Madrid)

我有一个数据文件(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).
当我咨询Prolog时,例如“camino(sol,goya,[],L)”,我会收到各种各样的响应:

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、塞维利亚、西班牙银行、雷蒂罗、普林西比维尔加拉、戈雅]; ... L=[sol、callao、opera、sol、塞维利亚、西班牙银行、雷蒂罗、普林西比、维尔加拉、戈雅]; ...
问题是“L”包含“sol”的两个实例。我不知道问题出在哪里。我认为这样做不好。

在您的解决方案中有一个优势:第一站(即sol)永远不会被推到
Visitados
列表中。因此,该特定电台不受条件
not(member(…)
的保护,以免重复。将查询更改为
camino(sol,goya,[sol],L)。
给出预期结果。我建议添加以下谓词:

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

哦,非常感谢你,伙计!!你的回答解决了我的问题。致以最良好的祝愿!!:)