2012-05-08 107 views
3

我在学习rooPlog,并在列表中遇到一些麻烦。我想返回一个指定类的先决条件的类的列表。这是我到目前为止...与Prolog列表

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

随时提防,因为这个“单变量”警告意味着什么是错的。如果你没有在特定的子句中使用某个变量,可以用'_'“先决条件(A,B)替换它,使其成为匿名: - not(prereq(A,C))。”会触发警告。 – Ihmahr

回答

3

也许你的意思是

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

你必须确保有在您的数据中没有循环这个工作......

+0

完美。谢谢! – MCR

+0

当试图确定某个类是否为另一个类的prereq时,此解决方案仅适用于前一个类。所以,prereq(262,221)。工程,但prereq(271,221)。才不是。 – MCR

+0

'prereq'这是一个事实。我们编写的'先决条件'建立一个列表,然后我们需要一个成员使用它:尝试'?-prerequistes(262,X),memberchk(221,X).' – CapelliC