List 使用Prolog在列表中搜索值

List 使用Prolog在列表中搜索值,list,recursion,prolog,member,List,Recursion,Prolog,Member,我正在Prolog中编写一个递归函数,以检查一个学期(SEM,a list)中的一门课程(Crs)是否在preor(a list)中满足了其先决课程的要求。当然,在第二段代码中有两个示例。但当它运行时,csse1001(没有先决条件)会失败,因为它必须不搜索任何内容,所以应该返回true。我错过了什么 checkSem(Prior,[]). checkSem(Prior,SEM):- [Crs|Tail] = SEM, member(pre(Crs,List),Prior),

我正在Prolog中编写一个递归函数,以检查一个学期(SEM,a list)中的一门课程(Crs)是否在preor(a list)中满足了其先决课程的要求。当然,在第二段代码中有两个示例。但当它运行时,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,[]).

您没有给出
checkSem/2
的示例查询,但我猜它的第一个参数
Prior
是一个课程列表。然后我想你应该检查课程名称是否是
pre
中的成员,而不是
pre(Crs,List)
。第二,由于您有一个先决条件列表,而不仅仅是一个,所以您应该检查它们是否都是Previor中的成员

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

如果不存在属于
List
的课程
Prereq
且不是
preor

的成员,则满足此目标。哦,我明白了,我在检查名单是否是Preor的成员,而不是单个项目?这很有道理。谢谢,这很好:)