如何在swi-prolog中对最终结果进行排序?(包括谓词)

时间:2019-03-14 07:14:25

标签: list sorting prolog typeerror

我是swi-prolog的新手,所以基本上我不知道如何编写代码... 无论如何,我需要写关于课程前提条件的说明。它将返回所有必修课程的列表。这是我的代码:

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]。然后我试图写一个新的preciate来处理它。但是,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 个答案:

答案 0 :(得分:3)

您将sort( pre2( C,L1), L)视为“嵌套表达式”。您希望对其内部表达式进行值评估,然后将其替换为该值,然后使用嵌套结果值替代嵌套表达式对外部表达式求值。类似Lisp的语言以这种方式工作。面向表达式评估的语言以这种方式工作。

Prolog无法以这种方式工作。它不会“评估”嵌套的“表达式”。相反,Prolog的编写方式使人联想起SSA(静态单分配)样式之一:代替

sort( nested( expression, nested_result), result)

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

人们称其为"unnesting"