Я пытаюсь сделать базу знаний для курсов колледжа. В частности, прямо сейчас я пытаюсь создать аккумулятор, который будет принимать курс и предоставлять список всех классов, которые необходимо пройти в первую очередь, т.е. предварительные требования курса, предварительные требования к этим предварительным требованиям и т. д. На основе этой диаграммы.
Вот пример предикатов:
prereq(cst250, cst126).
prereq(cst223, cst126).
prereq(cst126, cst116).
prereq(cst105, cst102).
prereq(cst250, cst130).
prereq(cst131, cst130).
prereq(cst130, cst162).
prereq(anth452, wri122).
prereq(hist452, wri122).
А вот моя попытка аккумулятора:
prereq_chain(Course, PrereqChain):-
%Get the list of prereqs for Course
findall(Prereq, prereq(Course, Prereq), Prereqs),
%Recursive call to all prereqs in X
forall(member(X, Prereqs),
(prereq_chain(X, Y),
%Combine current layer prereqs with deeper
append(Prereqs, Y, Z))),
%Return PrereqChain
PrereqChain = Z.
Желаемый результат запроса будет следующим:
?- prereq_chain(cst250, PrereqList).
PrereqList = [cst116, cst126, cst162, cst130]
Вместо этого я получаю ответ true и предупреждение о том, что Z является синглтоном.
Я просмотрел другие сообщения, в которых задавались похожие вопросы, но все они имели одну полосу обратного обход, тогда как мое решение требует нескольких дорожек.
Заранее спасибо за любое руководство.
requires/2
, который просто принимает два курса и завершается успешно, если 1-й требует второго (или генерирует все требуемые курсы). - person Tomas By   schedule 10.08.2018Z
внутри телаforall/2
скрыта от внешней области, где она вам нужна. Более глубокая проблема заключается в том, что вы мыслите процедурно, пытаясь модифицировать Prereqs, добавляя к нему что-то в своем вызовеforall/2
. Окончательное заданиеPrereqChain = Z
безвредно, но демонстрирует, что вы все еще мыслите процедурно; если бы вместо этого у вас было простоappend(Prereqs, Y, PrereqChain)
и не было последней строки, значение было бы таким же, и проблема могла бы быть более очевидной. - person Daniel Lyons   schedule 10.08.2018