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

Prolog 为什么'X=1,X=1.'打印'X=1'而不是'true'`,prolog,prolog-toplevel,Prolog,Prolog Toplevel,我正在学习Prolog的基础知识,我想知道为什么下面这行打印的是X=1,而不是true ?- X=1,1=X. X = 1. -- 我的命令中的第一个X=1是赋值,第二个是相等性检查。查询中没有赋值或相等性测试,只有术语的统一。查询通过将变量X与1统一而成功,这就是顶层报告的内容:它告诉哪些变量绑定使查询成为真 在连接中的第一个目标,X=1成功后,第二个目标是统一1=1,这一目标非常成功 另请注意,Prolog系统报告成功查询的方式不同。一些打印true,另一些打印yes(报告成功查询的传统方

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

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


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

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

在连接中的第一个目标,
X=1
成功后,第二个目标是统一
1=1
,这一目标非常成功

另请注意,Prolog系统报告成功查询的方式不同。一些打印
true
,另一些打印
yes
(报告成功查询的传统方式)。

当答案为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与1的另一个统一,但由于此时X被绑定到1,它实际上是一个不同的统一

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

?- 1 == 1.
true.

?- 1 == 2.
false.
另外,
是逻辑and,因此如果

?- 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.

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

谢谢。我有点困惑。我从你那里了解到
1=1。
也是一个统一体。那么为什么
1=1.
打印
true
,而
X=1,1=X.
打印
X=1
?统一成功,无需绑定任何变量。因此,在这种情况下,顶级解释器只需打印
true
(或
yes
,具体取决于使用的Prolog系统)。非常简单,Prolog顶级解释器(也称为REPLs)就是这么做的。它们收集查询中的所有自由变量,并在每次成功时显示它们的值。这可能是一个任意的选择。某些实现可以选择不显示任何内容,除非在查询中明确请求。有些不显示以下划线开头的变量的值,如
\ux
。可能所有的变量都不会显示任何
(即匿名变量)的值。欢迎来到序言!:)谢谢,你能解释一下为什么
注意前三个答案有两个结果,而后两个答案有一个结果。
?如果你运行更多这样的示例,你会发现除非是最后一个结果,否则不会返回假结果。