Prolog列表统一

Prolog list unification

我正在努力加深对 Prolog 的理解,以及它如何处理列表统一。所以我坚持这个例子,我在执行代码时知道答案,但我不明白它是如何工作的。

[X,a,X,f(X,a)|Y] = [Z,Z|Y]

答案是:

X=Z
Z=a
Y=_
L=[a,f(a,a)|Y]

我知道这个头与另一个头是一体的,所以如果我做一些改变,比如这些:

let C=[X,a,X,f(X,a)]
let D=[Z,Z]

统一应该是这样的:

[C|Y]=[D|L]

所以 Y 必须等于 L,而不是 _,对吗?谁能更好地解释一下并纠正我的错误?

请展示您与口译员的实际互动。

例如,

$ swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.1.36-18-ga5e157c)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- [X,a,X,f(X,a)|Y] = [Z,Z|Y].
X = Z, Z = a,
Y = [a, f(a, a)|Y].

(注意 Y 现在是一个循环项。)

如果你展示了你实际在做什么,可能会更容易帮助你。只需编辑您的问题。

列表没有什么特别或独特之处。列表就是数据结构./2。 Prolog 的列表符号只是其之上的语法糖。简而言之:

  • []是一个原子,表示空列表。
  • [a] 完全等同于 .(a,[]).
  • [a,b] 完全等同于 .(a,.(b,[])).
  • 等等

head/tail结构[Head|Tail]同样是语法糖:

  • [H|T] 完全等同于 .(H,T).

用点符号替换列表符号,您的谓词将完全相同。就是没那么方便。

See my answer here for details