gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:21:43 30 4
gpt4 key购买 nike

我是 swi-prolog 的新手,所以基本上我不知道如何编写代码...无论如何,我需要写一个关于类(class)先决条件的预测。它将返回所有必修类(class)的列表。这是我的代码:

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

在这个阶段,我不知道如何解决这个问题...有人可以告诉我应该把这个排序命令放在哪里吗?谢谢....

最佳答案

您将 sort( pre2( C,L1), L) 视为“嵌套表达式”。您希望计算其内部表达式的值,然后用该值代替它的位置,然后使用嵌套结果值计算的外部表达式代替嵌套表达式。类似 Lisp 的语言就是这样工作的。面向表达式求值的语言以这种方式工作。

Prolog 不是这样工作的。它不会“评估”嵌套的“表达式”。相反,Prolog 的编写方式让人想起 SSA 之一。 (static single assignment) style: 而不是

sort( nested( expression, nested_result), result)

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

人们称之为 "unnesting" .

关于list - 如何在 swi-prolog 中对最终结果进行排序?(包括谓词),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55156845/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com