图的Prolog连通边

图的Prolog连通边,prolog,graph-theory,Prolog,Graph Theory,我想做一个谓词,检查一个节点是否可以到达prolog中图形中的另一个节点。e、 gConnected(1,X,[[1,3],[3,4],[2,5]])第一个参数是我要开始的节点,第二个是我要到达的节点,第三个是边列表。到目前为止,我已经成功地做到了这一点,但是当我尝试使用findall/3获取我到达的所有节点时,我得到了一个无限循环 有没有办法阻止无限循环,或者我应该从一开始就解决这个问题 以下是我目前的代码: match([X,Y],List):- member([X,Y], List).

我想做一个谓词,检查一个节点是否可以到达prolog中图形中的另一个节点。e、 g
Connected(1,X,[[1,3],[3,4],[2,5]])
第一个参数是我要开始的节点,第二个是我要到达的节点,第三个是边列表。到目前为止,我已经成功地做到了这一点,但是当我尝试使用findall/3获取我到达的所有节点时,我得到了一个无限循环

有没有办法阻止无限循环,或者我应该从一开始就解决这个问题

以下是我目前的代码:

 match([X,Y],List):- member([X,Y], List).
 match([X,Y],List):- member([Y,X], List).


go(X,Y,List):-match([X,Y],List).
go(X,Y,List):-match([X,Z],List),go(Z,Y,List).

goes(X,List,List2):-findall(Y,go(X,Y,List),List2).

我是Prolog新手,我不知道自己做错了什么。

看看
?-gtrace,goes(1,[[1,3],[3,4],[2,5]],X)。

对于所有递归
go:-go
当它停止时需要一个条件

在您的情况下,我建议添加一个参数
Traversed
,它是您访问过的所有节点(或边)的列表。然后,如果已经访问了节点,则不会再次检查它们。 因此,递归地查看的元素越来越少,并且恢复在某个点结束


许多递归使用谓词
。请看一看。

对代码的可能更正

match([X,Y], List, Rest):- select([X,Y], List, Rest).
match([X,Y], List, Rest):- select([Y,X], List, Rest).

go(X,Y,List) :- match([X,Y],List,_).
go(X,Y,List) :- match([X,Z],List,Rest), go(Z,Y,Rest).

goes(X,List,List2) :- findall(Y, go(X,Y,List), List2).

现在匹配“消耗”一条边,然后避免无限循环

一条边的常见表示是
X-Y
而不是
[X,Y]