как отсортировать окончательный результат в swi-прологе? (в том числе предикат) - PullRequest
3 голосов
/ 14 марта 2019

Я новичок в swi-прологе, поэтому в принципе я не знаю, как написать код ... в любом случае мне нужно написать предварительный курс о предварительных условиях курса.Он вернет список всех курсов, которые требуются.И вот мой код:

course(cmput325).
course(cmput175).
course(cmput201).
course(cmput204).
prerequisite(cmput204, cmput325).
prerequisite(cmput175, cmput201).
prerequisite(cmput175, cmput204).

/*required(+C,?L)*/

pre(X,C) :- prerequisite(X,C).
pre(X,C) :- prerequisite(X,Y), pre(Y,Z).


pre2(C,L) :-  findall(L1,pre(L1,C),L).

required(C,L) :- sort(pre2(C,L1),L).

Я получил все правильно, кроме последнего требуемого (C, L), pre2 (cmput325, L) вернет [cmput204, cmput175], и я хочу отсортировать этосписок, так что он станет [cmput175, cmput204].Затем я попытался написать новый кандидат для решения этой проблемы.Однако, swi-prolog только что дал мне ошибку:

ERROR: Type error: `list' expected, found `pre2(cmput325,_3718)' (a 
compound)
ERROR: In:
ERROR:    [9] sort(pre2(cmput325,_3770),_3764)
ERROR:    [8] required(cmput325,_3796) at c:/users/mxu3/desktop/a3.pl:19
ERROR:    [7] <user>
Exception: (9) sort(pre2(cmput325, _3322), _3110) ? creep
Exception: (8) required(cmput325, _3110) ? creep

На данном этапе я понятия не имею, как решить эту проблему ... Может кто-нибудь сказать мне, где я должен поместить эту команду сортировки?Спасибо ....

1 Ответ

3 голосов
/ 14 марта 2019

Вы видите sort( pre2( C,L1), L) как «вложенное выражение».Вы ожидаете, что его внутреннее выражение будет оценено для значения, затем это значение будет подставлено на его место, а затем внешнее выражение будет оценено с использованием этого вложенного значения результата, используемого вместо вложенного выражения.Подобные Lisp языки работают таким образом.Языки, ориентированные на оценку выражений, работают таким образом.

Пролог не работает таким образом.Он не «оценивает» вложенные «выражения».Вместо этого Пролог написан так, что напоминает один из стилей SSA (статическое одиночное назначение): вместо

sort( nested( expression, nested_result), result)

запись

nested(       expression, nested_result), 
sort(                     nested_result,  result)

люди называют это "unnesting" .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...