如何检查Prolog中的循环?

时间:2017-12-06 03:52:30

标签: prolog

我有Prolog谓词:

gen(c1, c2). 
gen(c2, c1).
gen(c2, c3).
gen(c3, c1).

我想写一条规则来检查gen / 2谓词中没有循环。我应该怎么写这条规则?

1 个答案:

答案 0 :(得分:1)

一开始我们会尝试从上到下考虑它。

什么意思没有循环?

〜错误,它有任何循环。

它有什么意思吗?

〜我可以从一个节点到另一个节点,通过其他节点。

如何检查我是否可以通过其他节点转到同一节点?

〜附加到空列表节点,我可以从开始一个节点开始,然后添加我可以从这些节点存档的其他节点(并且不要添加我已经列入的NODES! !!!!!!!!

node(X) :- 
        gen(X,_) ; gen(_,X).

canGoTo(X,N, Nodes) :- 
        member(X2, [X|Nodes]), gen(X2, X1),
        \+ member(X1, Nodes), 
        canGoTo(X, N, [X1|Nodes]).

canGoTo(_,N,N).

canGoTo(X,Nodes) :- canGoTo(X,Nodes,[]).

canGoToSelf(X) :- canGoTo(X,Nodes), member(X,Nodes),!.

isCycle() :- node(X) , canGoToSelf(X),!. 

noCycles() :- \+ isCycle().