2012-05-08 9 views
3

私はrooPlogを学んでいて、リストに問題があります。私は指定されたクラスの前提条件であるクラスのリストを返す。ここに私がこれまで持っていたものがあります...プロローグ付きリスト

prereq(262, 221). 
prereq(271, 262). 
prereq(331, 271). 

prerequisites(A, B) :- not(prereq(A, C)). 
prerequisites(A, [C|B]) :- prereq(A, C), prerequisites(C, B). 

これは機能しますが、最後にジャンクを追加します。

?- prerequisites(331, A). 
A = [271, 262, 221|_G327] ; 
false. 
+0

...あなたは、これが機能するためには、あなたのデータにはサイクルが存在しないことを確認しなければなりません

prerequisites(A, []) :- not(prereq(A, _)). prerequisites(A, [C|B]) :- prereq(A, C), prerequisites(C, B). 

を意味します何かが間違っていることを意味する特定の節で変数を使用しない場合は、前提条件(A、B)で置き換えて匿名にします。 - not(prereq(A、C))。 "警告を発したはずです。 – Ihmahr

答えて

3

たぶん、あなたは常にこのため、「シングルトン変数」警告を警戒する

+0

パーフェクト。ありがとうございました! – MCR

+0

クラスが別のクラスの前提条件であるかどうかを判断しようとすると、この解決策は直前の先祖に対してのみ機能します。したがって、前提条件(262,221)。しかし、prereq(271、221)。ではない。 – MCR

+0

'prereq'それは事実です。私たちが書いた '前提条件'は、リストを作成し、それを使用するにはmemberchkが必要です。 '' -prerequistes(262、X)、memberchk(221、X) 'を試してください。 – CapelliC