我有Prolog谓词:
gen(c1, c2).
gen(c2, c1).
gen(c2, c3).
gen(c3, c1).
我想写一条规则来检查gen / 2谓词中没有循环。我应该怎么写这条规则?
答案 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().