Пролог бесконечный цикл с предикатом Intersect. (Планирование) - PullRequest
0 голосов
/ 24 мая 2018

У меня есть базовый файл, который я включаю, который содержит много предикатов посещаемости / 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], Е).все здорово.

Но если я запускаю 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).
...