内容提要
- 判断两个语句是否相等
- 判断两个语句是否不等
判断两个语句是否相等
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就能够成功。