0
私はPrologの述語があります。Prologのサイクルを確認するには?
gen(c1, c2).
gen(c2, c1).
gen(c2, c3).
gen(c3, c1).
私はGEN/2述語にはサイクルが存在しないことを確認するためにルールを書きたいです。このルールをどのように書くべきですか?
私はPrologの述語があります。Prologのサイクルを確認するには?
gen(c1, c2).
gen(c2, c1).
gen(c2, c3).
gen(c3, c1).
私はGEN/2述語にはサイクルが存在しないことを確認するためにルールを書きたいです。このルールをどのように書くべきですか?
最初は、上から順に考えてみます。
サイクルがないとはどういう意味ですか?
〜任意のサイクルがあることを偽ります。
どのようなサイクルがあるのでしょうか?
〜私はあるノードから他のノードを経由して同じノードに移動できます。
他のノードから同じノードに移動できることを確認するにはどうすればよいですか?
〜空のリストノードに追加して最初のノードから移動し、これらのノードからアーカイブできる他のノードを追加してください。既にリストにあるノードを追加しないでください!!!! !!!!!)
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().