2017-12-06 5 views
0

私はPrologの述語があります。Prologのサイクルを確認するには?

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

私はGEN/2述語にはサイクルが存在しないことを確認するためにルールを書きたいです。このルールをどのように書くべきですか?

答えて

0

最初は、上から順に考えてみます。

サイクルがないとはどういう意味ですか?

〜任意のサイクルがあることを偽ります。

どのようなサイクルがあるのでしょうか?

〜私はあるノードから他のノードを経由して同じノードに移動できます。

他のノードから同じノードに移動できることを確認するにはどうすればよいですか?

〜空のリストノードに追加して最初のノードから移動し、これらのノードからアーカイブできる他のノードを追加してください。既にリストにあるノードを追加しないでください!!!! !!!!!

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(). 
関連する問題