为什么`X = 1,X = 1.`打印`X = 1`而不是`true`

时间:2020-03-06 14:00:35

标签: prolog prolog-toplevel

我正在学习Prolog的基础知识,并且想知道为什么以下行打印X = 1而不是true

?- X=1,1=X.
X = 1.

-

我命令中的第一个X=1是一个赋值,第二个是相等性检查。

2 个答案:

答案 0 :(得分:3)

查询中没有赋值或相等性测试,只有词的统一。该查询通过将变量X1统一而成功,这就是顶层报告的内容:它告诉哪些变量绑定使查询为真。

在并列中的第一个目标X = 1成功之后,第二个目标是统一的1 = 1,这一次成功了。

P.S。还要注意,Prolog系统报告成功查询的方式有所不同。一些打印true,另一些打印yes(报告成功查询的传统方式)。

答案 1 :(得分:2)

当答案为 true 且在顶层将值绑定到变量时,将显示该变量的值,这表示结果为true。

这里有一些例子。

test_01 :-
    X = 1,
    X = 1.

test_02 :-
    X = 1,
    X = 2.

test_03(X) :-
    X = 1,
    X = 1.

test_04(X) :-
    X = 1,
    X = 2.

以及使用SWI-Prolog从顶层运行示例时

?- test_01.
true.

?- test_02.
false.

?- test_03(X).
X = 1.

?- test_04(X).
false.

这里有一些仅在顶层完成的示例

?- X=1.
X = 1.

?- 1=1.
true.

?- 1=0.
false.

?- 1==0.
false.

我命令中的第一个X = 1是一个赋值,第二个是相等性检查。

X=1不是赋值,它是整数1与变量 X 的统一形式。第二个X=1不是对相等性的检查,它是 X 的另一种统一形式,但是由于 X 这次已绑定为1,因此确实是一个不同的统一。

要在Prolog中进行相等性检查,请使用==,例如

?- 1 == 1.
true.

?- 1 == 2.
false.

逻辑上也是,,所以

?- X = 1.
X = 1.

然后1绑定到 X ,对于问题的第二行,它是真实的


但是代码也必须被视为

?- true,true.
true.

相对于

?- true,false.
false.

;是合乎逻辑的或

?- true;true.
true ;
true.

?- true;false.
true ;
false.

?- true;false;true.
true ;
true.

?- false;true.
true.

?-  false;false.
false.

请注意,前三个答案有2个结果,但后两个答案有1个结果。