我是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
在此阶段,我不知道如何解决此问题……有人可以告诉我应该在何处放置此排序命令吗?谢谢...。
答案 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)
minikanren人们称其为"unnesting"。