我正在与SWI Prolog合作。我希望定义一个add函数:add(X, Y)
,它返回X和Y的总和。但是,我不知道如何在Prolog中定义函数。我尝试使用谓词这样做:
add(X, Y, Z) :- Z is X+Y.
但是在执行add(2, 3, X)
形式的查询时,会出错:
错误:顶级:未定义的程序:添加/ 3(DWIM无法纠正目标)
另外,在编写规则时,我无法理解:-
和:=
之间的区别。我在某处读到:-
用于定义谓词,而:=
用于定义函数。我不确定这是否正确。我尝试使用:=
来定义函数,但它不起作用。
答案 0 :(得分:2)
将自己放在与prolog文件相同的目录中,键入以下内容以加载和编译源文件function.pl
:
[function].
现在测试运行(使用您在文件function.pl中发布的确切代码):
?- add(2,3,X).
X = 5.
使用Swi-prolog v 6.6.4。
另外,我无法理解: - 和:= while之间的区别 写规则。我在某处读到: - 用于定义谓词 while:=用于定义函数。我不确定这是不是 正确。我尝试使用:=来定义函数,但它不起作用。
逻辑程序是一组公理或规则(又称谓词),定义了对象之间的关系,不使用显式函数的概念,但由于函数实际上只是从输入集到输出的映射 - 设置你可以将它建模为关系,就像你使用add/3
关系一样。
:-
可以被理解为逻辑含义(实际上我认为该符号应该看起来像向后箭头)
您所指的:=
运算符我甚至无法在swi prolog文档中找到:search results for :=。如果您可以链接到您找到相关信息的位置,那就太棒了。
答案 1 :(得分:0)
要给出最简单的答案,我认为OP正在寻找:
在swipl / gprolog提示符下:
?- [user]. add(X, Y, Z) :- Z is X+Y. [control-D] ?- add(2,3,Answer). Answer = 5
说明:
Prolog的历史可以追溯到1980年代,当时它是围绕命令行而设计的。输入“ [foo]”。在命令提示符处(?-)表示``请咨询文件foo'',即从当前目录中将Prolog程序加载到名为``foo.pl''的文件中。 “ [user]”执行的操作完全相同,只是“ user”是保留的文件名,这表示用户键入内容,直到他们按下Control-D(代表文件结尾的通常字符)为止。