为什么Prolog不能识别这些内置项?

为什么Prolog不能识别这些内置项?,prolog,Prolog,我在使用SWI Prolog中内置的round/1和floor/1时遇到问题。当在我的代码中使用它们时,它们不会被识别,并且当作为查询提交它们时;例如?-round(1.6)。,Prolog会告诉我该过程无法识别。我做错什么了吗?我在在线Swish版本和我自己安装的windows版本上都试过了,但在这两个版本上都出现了相同的错误。round/1和floor/1不是内置谓词,round/2和floor/2是 Prolog使用谓词。这意味着谓词只能是true或false(或error)。此外,它还可

我在使用SWI Prolog中内置的
round/1
floor/1
时遇到问题。当在我的代码中使用它们时,它们不会被识别,并且当作为查询提交它们时;例如
?-round(1.6)。
,Prolog会告诉我该过程无法识别。我做错什么了吗?我在在线Swish版本和我自己安装的windows版本上都试过了,但在这两个版本上都出现了相同的错误。

round/1
floor/1
不是内置谓词,
round/2
floor/2

Prolog使用谓词。这意味着谓词只能是
true
false
(或error)。此外,它还可以统一变量(进一步)

因此,计算1.6的
下限
的唯一方法是使用两个变量,并使第二个变量成为第一个变量的下限。例如:

?- 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(X, floor(0.4+0.4+0.4)).
在窗帘后面,
is/2
谓词将调用
floor/2
。但是请注意,您不能简单地以这种方式注入您自己的谓词。您不能简单地编写
is(X,foo(2))
并期望Prolog调用
foo(2.X)

,因为这样编写谓词有时很麻烦,您还可以将其编写为:。。。我会小心的。您可能会给人留下这样的印象,
functor(…,X)
形式的任何谓词也可以表示为
X是functor(…)
,这显然不是普遍正确的。它表明任何谓词都有函数形式。并非所有算术函数都是如此。例如,您可以编写
X为min(2,3)。
并获取
X=2
。但是
min(2,3,X)
失败了,因为
min/3
不存在。我认为函子的定义太具体了。对于带有参数的
foo(…)
形式的术语,
foo
被称为函子。它不是特定于算术函数的。我可能会说Prolog中的某些内置谓词是算术函数,因此可以与
is/2
以及其他算术运算符(例如
/2
)一起使用。我不确定我是否会说另一种形式是因为另一种形式“麻烦”(它们的打字量差不多)。它们只是替代品。一个显式用作算术函数。另一个不是。