Prolog:检查 yes \= yes 输出 yes 的谓词

Prolog: Predicate that checks yes \= yes outputs yes

foo(X) :-
    bar(X) \= baz(X).

?- bar(2).
yes
?- baz(2).
yes
?- foo(2).
yes

为什么foo(2)输出yes?如果我们查询 yes \= yes,我们得到一个 no.

foo(2) 输出 yes 因为 \=/2 不能 将左参数与右参数统一时成功。

左边的参数是bar(2),右边的参数是baz(2),所以它们不会统一,因为每一项的主函子都不同(bar vs baz ).这两个术语的参数 (2) 相同并不重要。

bar(X) \= bar(X) 我们也得到了否定。但是 baz 不是 bar.

在 Prolog 中,没有术语的“评估”。条款就是条款。

  • 如果我们 调用 bar(X) 我们会 X=2 返回(显然)。
  • 如果我们调用 bar(2),我们会得到肯定的答复。
  • 如果我们调用 1 \= 2,我们会得到肯定的答复。
  • 如果我们调用 bar \= baz,我们会得到肯定的答复。

如果我们调用 bar(1) \= baz(2)bar(2) \= baz(2)bar(X) \= baz(X) 相同。

\=谓词的意思是“不能统一”。 yes可以yes统一,但bar(2)不能与baz(2)统一。与 X 相同,而不是 2

\= 是这里调用的谓词,bar(X)baz(X) 都是它的参数——它们是符号项。

Prolog 中没有术语的自动“评估”。