我在使用SWI-Prolog中的round/1
和floor/1
内置插件时遇到问题。在我的代码中使用它们时,它们无法识别,并且在将它们作为查询提交时;例如?- round(1.6).
,Prolog会告诉我该程序未被识别。难道我做错了什么?我在网上Swish版本和我自己的Windows安装版本上尝试过,但两者都有相同的错误。
答案 0 :(得分:1)
round/1
和floor/1
不是内置谓词,round/2
和floor/2
。
Prolog适用于谓词。这意味着谓词只能是true
或false
(或错误)。此外,它可以统一变量(进一步)。
因此,计算1.6的floor
的唯一方法是使用两个变量,并使第二个变量成为第一个变量。例如:
?- round(1.6,X).
X = 2.
?- floor(1.6,X).
X = 1.
因为以这种方式编写谓词有时很麻烦。 Prolog定义了一些仿函数,这些仿函数可以使用is/2
谓词进行解释。 round/1
和floor/1
是is/2
谓词中具有语义的仿函数:
?- X is round(1.6).
X = 2.
?- X is floor(1.6).
X = 1.
is
也可以使用更高级的表达式树,例如:
?- X is floor(0.4+0.4+0.4).
X = 1.
但请注意is
实际上也是一个谓词。我们写了:
is(X, floor(0.4+0.4+0.4)).
窗帘后面的,is/2
谓词将调用floor/2
。但请注意,你不能简单地用这种方式注入你自己的谓词。你不能简单地写is(X, foo(2))
并期望Prolog打电话给foo(2.X)
。