带有Intersect谓词的Prolog无限循环。(调度)

时间:2018-05-23 21:14:28

标签: prolog scheduling

我有一个我包含的基本文件,其中包含许多参加/ 2个谓词,如下所示。

attends(student_ID,course_iD).   (Example: attends(2222,CSD101).)

谓词schedule_e(W,IN,E):

-W是一个包含3门课程并代表一周考试的列表。例如,W = [CSD101,CSD102,CSD103]。 它基本上做的是,学生获取他拥有的所有课程并将其与W列表相交,然后返回相交的此列表IN以及此IN列表包含的课程数。 IN列表基本上包含了将要检查学生的所有课程,E是该学生在考试中的课程数。

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

最后一个谓词:

W1,W2,W3是第1周第2周第3周,与上述完全相同。 每个findall都会找到每个学生和每周的所有课程,然后将它们与周本身相交,这样我们就可以知道每个学生每周在考试中有多少课程。然后count_num计算每周有多于2门课程的学生并将其返回。

如果我运行? - schedule_errors([CSD101,CSD102,CSD103],[CSD104,CSD105,CSD106],[CSD107,CSD108],E)。一切都很棒。

但是,如果我运行schedule_errors(W1,W2,W3,0)(这样它就会给出时间表,或者3个星期,其中有超过2个课程的学生数量为0),它说的是全局堆栈,我提出了全局堆栈,它似乎进入了无休止的递归。它还指出,这发生在Intersect中。我怎么能实现这个?究竟是什么问题。

(前2周总共有3门课程,第3周有2门课程。)

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).

0 个答案:

没有答案