匿名变量-序言-一些查询

时间:2018-07-28 07:36:00

标签: prolog

您能帮助我理解回答下一个查询的引擎吗?

?- _ = _.
?- _ = 1.
?- A = _, B = _, C = A + B + 1.

以及一些额外的查询(与匿名变量无关)

?- B = A + 1, A = C, C = B - 1.

我知道上述查询的答案,但我想了解序言如何找到这些答案:)

谢谢!

1 个答案:

答案 0 :(得分:0)

_被称为_anonymous变量。每次出现_是一个不同的变量。您可以使用标准的write_canonical/1内置谓词轻松观察它。例如:

| ?- write_canonical(_ = _).
=(_279,_280)

yes

变量可以与任何术语统一,包括您在查询中观察到的其他变量。请注意,标准=/2内置谓词执行 unification ,而不是等式或算术表达式求值。统一采用两个术语,并且如果两个术语相同或可以通过统一术语中的任何变量而使它们相同,则成功。例如:

| ?- A + 1 = 2 + B.

A = 2
B = 1

(1 ms) yes

查询,例如:

| ?- write_canonical(B = A + 1), nl, B = A + 1, write_canonical(B).
=(_279,+(_280,1))
+(_280,1)

B = A+1

yes

将变量B compound 术语+(A,1)统一。 _279_280分别是BA的内部变量表示。不同的Prolog系统以不同的方式打印这些内部表示。例如,使用SWI-Prolog:

?- write_canonical(B = A + 1), nl, B = A + 1, write_canonical(B).
=(_,+(_,1))
+(_,1)
B = A+1.

关于您的额外查询B = A + 1, A = C, C = B - 1,它会创建循环项。考虑更简单的查询:

| ?- X = f(X).

Prolog顶层的结果和相应的变量绑定报告取决于特定的Prolog系统处理循环术语。例如,在GNU Prolog中,您将获得:

| ?- X = f(X).

cannot display cyclic term for X

yes

SICStus Prolog报告时:

| ?- X = f(X).
X = f(f(f(f(f(f(f(f(f(f(...)))))))))) ? 

循环术语对于某些应用很有用,例如共归逻辑编程。但是循环术语的处理尚未标准化,并且在Prolog系统之间有所不同。 ISO Prolog标准提供了内置谓词unify_with_occurs_check/2,用于检查统一是否会创建循环项,从而防止循环项。例如:

| ?- unify_with_occurs_check(X, f(X)).

no

| ?- unify_with_occurs_check(X, Y).   

Y = X

(1 ms) yes