使用Prolog在列表中搜索值

时间:2014-06-20 05:29:39

标签: list recursion prolog member

我正在Prolog中编写一个递归函数,以检查一个学期(SEM,一个列表)中的课程(Crs)是否在Prior(列表)中遇到了必修课程。第二个代码块中有2个Course的例子。但是当它运行时,csse1001(没有先决条件)失败,当它应该返回true,因为它必须不搜索任何东西。我错过了什么?

checkSem(Prior,[]). 
checkSem(Prior,SEM):-
    [Crs|Tail] = SEM,
    member(pre(Crs,List),Prior),
    checkSem(Prior,Tail).

课程:

partA(comp3506).
lvl3(comp3506).
s1(comp3506).
pre(comp3506,[csse2002]).

partA(csse1001).
lvl1(csse1001).
s1(csse1001).
pre(csse1001,[]).

1 个答案:

答案 0 :(得分:1)

您没有给checkSem/2提供示例查询,但我猜它的第一个参数Prior是一个课程列表。那么我认为您应该检查课程名称是Prior而不是pre(Crs, List)的成员。其次,由于您有一个先决条件列表而不仅仅是一个,您应该检查所有这些都是Prior中的成员。

checkSem(_,[]).
checkSem(Prior,[Crs|Tail]):-
    pre(Crs, List),
    \+ (member(Prereq, List), \+ member(Prereq, Prior)),
    checkSem(Prior,Tail).

如果\+ (member(Prereq, List), \+ member(Prereq, Prior))的成员Prereq不是List的成员并且它不是Prior的成员,则会满足此目标{{1}}。