Learn Prolog Now 翻译

内容提要

  • 判断两个语句是否相等
  • 判断两个语句是否不等

判断两个语句是否相等

Prolog中有一个用于判断两个语句是否相等的重要谓词,即==/2。这个谓词可以用来判断两个语句是否相等,但是不能用于初始化变量,所以这一点是和谓词=/2有所区别的。让我们来看一些具体的例子:

?- a == a.
true

?- a == b.
false

?- a == 'a'
true

Prolog回答上面查询的答案的原因是很明确的,但是特别提一下最后一个查询,因为a和'a'在Prolog中被认为是同一个原子。

接下来,我们看一些包含了变量的例子,也可以明确比较谓词==/2和合一谓词=/2的不同:

?- X == Y.
false

?- X = Y.
X = _2808
Y = _2808
true

在上面的查询中,X和Y都是没有初始化的变量,我们没有给它们任何值。所以这一个查询结果是正确的:因为X和Y不是相同的对象,所以==验证返回false。另一方面,使用=可以成功,因为X和Y能够合一。

让我们继续看包含了初始化值的变量的查询:

?- a = X, a == X.
X = a
true

查询的第一个部分,a=X,将X和a合一,X就被初始化为a。所以当a == X运算时,左右两边都是相同的Prolog对象,所以检查通过。

类似的情况也发生在下面的查询中:

?- X = Y, X == Y.
X = _4500
Y = _4500
true

查询的第一个子句,X = Y,将变量X和Y合一,它们共享同一个Prolog对象,然后使用 X == Y检查是否相等,就能够成功。

可以看出,=和是明确不同的,尽管如此,它们之间有一个重要的关联:可以看作是比=更强的验证两个语句相等的方式,因为,如果term1和term2都是Prolog的语句,并且查询 term1 == term2能够成功,那么查询 term1 = term2也必然能够成功。

判断两个语句是否不等

另外一个值得一提的谓词是:==,这个谓词的作用和正好相反,当失败时成功。即,当两个语句不相等时,==返回为真,看例子:

?- a == a.
false

?- a == b.
true

?- a == 'a'
false

上面的查询及其结果都很好理解:这些都是使用==的相反结果。思考下一个例子:

?- X == a.
X = _3719
true

为什么会有这样的答案?我们知道之前查询 X == a 是 false,所以查询 X == a 是 true,Prolog也确实是这样运行的。

类似地:

?- X == Y.
X = _798
Y = _799
true

同样地,我们知道之前查询 X == Y失败了,所以查询 X == Y就能够成功。

原文地址:https://www.cnblogs.com/seaman-h-zhang/p/4670419.html