2017-09-30 54 views
1

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

回答

1

round/1floor/1没有内置谓词,round/2floor/2

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

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

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

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

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

+1

*由于以这种方式编写谓词有时很麻烦,您也可以将它写为:... *我会在这里小心。你可能会留下这样的印象:表达式的任何谓词'functor(...,X)'也可以表示为'X是函数(...)',这显然不是普遍适用的。它表明任何谓词都有一个功能形式。对于所有的算术函数也并非总是如此。例如,你可以写'X is min(2,3).'并得到'X = 2'。但'min(2,3,X)'失败,因为'min/3'不存在。 – lurker

+0

@lurker:已更新。更好? –

+1

我认为* functor *的定义太具体。对于带有参数的形式“foo(...)”的术语,“foo”被称为* functor *。它不是特定于算术函数。我可能会说Prolog中的某些内置谓词是*算术函数*,因此可以与'is/2'以及其他算术运算符(*例如*,'>/2')一起使用。我不确定我会说替代形式是因为另一种形式是“繁琐的”(它们都是大致相同的打字量)。他们只是替代品。一个被明确用作算术函数。其他不是。 – lurker

相关问题