Правильное использование findall / 3, особенно первый аргумент шаблона - PullRequest
2 голосов
/ 15 марта 2011

Я знаю, что в прологе есть встроенная функция findall / 3, и я пытаюсь найти общее количество часов (Thrs) и сохранить их в списке, а затем суммировать список.но это не работает для меня.вот мой код:

totalLecHrs(LN,THrs) :-
    lecturer(LN,LId),
    findall(Thrs, lectureSegmentHrs(CC,LId,B,E,THrs),L),
    sumList(L,Thrs).

подскажите, что с ним не так?Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 15 марта 2011

Вам необходимо использовать переменную "фиктивная" для Часов в подцели findall / 3 . То, что вы написали, использует THrs как возвращаемое значение для sumList / 2 и как переменную, которая будет указана в L как findall / 3 . Используйте X в качестве первого аргумента findall и в соответствующей подцели * lectureSegmentHrs / 5 в качестве последнего аргумента.

1 голос
/ 15 марта 2011

Похоже, проблема в том, что вы используете одну и ту же переменную (Thrs) дважды для разных вещей.Однако это трудно сказать, поскольку вы также использовали разные заглавные буквы в разных местах.Измените строку findall таким образом, чтобы начальная переменная имела одинаковую прописную букву в вызове lectureSegmentHrs.Затем полностью используйте другую переменную, чтобы получить окончательное выходное значение (то есть значение, которое появляется в sumList и в слоте возврата всего предиката).

Вам необходимо использовать другую переменную, потому что Prolog неподдержка переназначения переменных.На логическом языке понятие переназначения переменной по своей сути невозможно.Что-то вроде следующего может показаться разумным ...

...
X = 10,
X = 11,
...

Но вы должны помнить, что , в Прологе является оператором соединения.Вы фактически говорите Prolog найти решение вашей проблемы, где X равно 10 и 11 одновременно .Так что, очевидно, он скажет вам, что это не может быть сделано.

Вместо этого вы должны просто создавать новые имена переменных по мере продвижения.Иногда это немного раздражает, но это просто связано с территорией логических языков.

...