带Intersect谓词的Prolog无休止循环。(调度)

带Intersect谓词的Prolog无休止循环。(调度),prolog,scheduling,Prolog,Scheduling,我有一个包含许多attends/2谓词的基本文件,如下所示 attends(student_ID,course_iD). (Example: attends(2222,CSD101).) 谓词附表_e(W,IN,e): -W是一个包含3门课程的列表,代表一周的考试。例如W=[CSD101、CSD102、CSD103]。 它的基本作用是,对于一个学生来说,他选修了他所学的所有课程,并将它们与W列表相交,然后在相交的列表中返回该列表,以及该列表中包含的课程数。列表中基本上包含了该学生将要参加考

我有一个包含许多attends/2谓词的基本文件,如下所示

attends(student_ID,course_iD).   (Example: attends(2222,CSD101).)
谓词附表_e(W,IN,e):

-W是一个包含3门课程的列表,代表一周的考试。例如W=[CSD101、CSD102、CSD103]。 它的基本作用是,对于一个学生来说,他选修了他所学的所有课程,并将它们与W列表相交,然后在相交的列表中返回该列表,以及该列表中包含的课程数。列表中基本上包含了该学生将要参加考试的所有课程,E是该学生参加考试的课程数

谓词count_num只返回列表中大于2的数字数量

最后一个谓词:

W1,W2,W3是一周,一周,二周,三周,和上面的一样。 每个findall查找每个学生和每周的所有课程,然后将它们与本周本身相交,以便我们可以知道每个学生每周考试的课程数。然后,count_num统计每周有多少学生有2门以上的课程并返回

如果我运行?-计划_错误([CSD101,CSD102,CSD103],[CSD104,CSD105,CSD106],[CSD107,CSD108],E)。一切都很好

但是如果我运行schedule_errors(W1,W2,W3,0)(这样它将给出时间表,或者3周内有超过2门课程要考试的学生数量为0),在这种情况下,它表示出全局堆栈,我为其提升了全局堆栈,它似乎进入了一个无休止的递归。它还注意到这种情况发生在Intersect中。我还可以如何实现这一点?到底是什么问题

(前两周每次3个课程,第三周2个课程。)

intersect([],[uu,[])。
相交([H1|T1],L2[H1|Res]):-
成员(H1、L2),
相交(T1、L2、Res)。
相交([[u124; T1],L2,Res):-
相交(T1、L2、Res)。
%1
附表e(W1,IN,e):-
集合(C,attends(Y,C),L),相交(L,W1,IN),长度(IN,E)。
%2
count_num(_,[],0)。
count_num(A[H | L],N):-A=H,count_num(A,L,N)。
%3
附表_错误(W1、W2、W3、E):-
findall(E1,附表e(W1,E1),欧空局),
findall(E2,附表e(W2,E2),Esb),
芬德尔(E3,附表e(W3,E3),Esc),
追加(Esa、Esb、L)、追加(L、Esc、L1)、计数(2、L1、E)。

您一直在使用像
CSD101
这样的名称。你知道这些是变量,不是原子吗?或者你的代码真的引用它们使它们成为原子,就像在
'CSD101'
中那样?另外,请在您的问题中至少添加一些
注意事项
事实,请。注意事项(2222,c219)。出席(2222,c210)。
intersect([],_,[]).
intersect([H1|T1],L2,[H1|Res]):-
    member(H1,L2),
    intersect(T1,L2,Res).
    intersect([_|T1],L2,Res):-
    intersect(T1,L2,Res).
%1
schedule_e(W1,IN,E):-
    setof(C,attends(Y,C), L),intersect(L,W1,IN),length(IN,E).
%2
count_num(_,[],0).
    count_num(A,[H|L],N):-A<H,count_num(A,L,N1),N is N1+1.
    count_num(A,[H|L],N):-A>=H,count_num(A,L,N).
%3
schedule_errors(W1,W2,W3,E):-
    findall(E1, schedule_e(W1, _, E1), Esa),
    findall(E2, schedule_e(W2, _, E2), Esb),
    findall(E3, schedule_e(W3, _, E3), Esc),
    append(Esa,Esb,L),append(L,Esc,L1),count_num(2,L1,E).