Prolog中的列表

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.

始终注意“单例变量”警告,因为这意味着出现了问题。如果您在特定子句中不使用某个变量,请用“_”替换它以使其匿名化。例如,“prerequisites(A, B):- not(prereq(A, C))”将会触发该警告。 - Ihmahr
1个回答

3
也许你的意思是:
prerequisites(A, []) :- not(prereq(A, _)).
prerequisites(A, [C|B]) :- prereq(A, C), prerequisites(C, B).

您必须确保数据中没有循环才能使其正常运行...


当尝试确定一个类是否是另一个类的先决条件时,这个解决方案仅适用于直接前置课程。因此,prereq(262, 221)可以工作,但prereq(271, 221)则不行。 - MCR
prereq 是一个事实。我们编写了 prerequisites 列表,然后需要使用 memberchk 函数来使用它:尝试执行 ?-prerequistes(262,X),memberchk(221,X). - CapelliC
太好了。我不知道memberchk。谢谢! - MCR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接