为什么Prolog不承认这些内置插件?

时间:2017-09-30 18:27:45

标签: prolog

我在使用SWI-Prolog中的round/1floor/1内置插件时遇到问题。在我的代码中使用它们时,它们无法识别,并且在将它们作为查询提交时;例如?- round(1.6).,Prolog会告诉我该程序未被识别。难道我做错了什么?我在网上Swish版本和我自己的Windows安装版本上尝试过,但两者都有相同的错误。

1 个答案:

答案 0 :(得分:1)

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

Prolog适用于谓词。这意味着谓词只能是truefalse(或错误)。此外,它可以统一变量(进一步)。

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

?- round(1.6,X).
X = 2.

?- floor(1.6,X).
X = 1.

因为以这种方式编写谓词有时很麻烦。 Prolog定义了一些仿函数,这些仿函数可以使用is/2谓词进行解释。 round/1floor/1is/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)