带Prolog的列表

带Prolog的列表,prolog,Prolog,我正在学习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). 它可以工作,但会在末端添加垃圾 ?- prerequis

我正在学习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.
也许你是说

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

您必须确保您的数据中没有周期,这样才能工作…

当尝试确定某个类是否是另一个类的预请求时,此解决方案仅适用于直接的前置类。因此,prereq(262221)。工作,但预请求(271221)。没有。
prereq
这是事实<代码>先决条件我们编写了一个列表,然后我们需要一个memberchk来使用它:try
?-prerequirests(262,X),memberchk(221,X)。
太好了。我不知道memberchk的事。谢谢始终要警惕“singleton variable”警告,因为这意味着出现了问题。如果在某个特定的子句中不使用某个变量,则将其替换为“25;”将触发警告。前提条件(a,B):-not(prereq(a,C))”会触发警告。