Prolog列表统一

时间:2015-04-16 18:03:37

标签: list prolog 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,而不是_,对吗?有人可以更好地解释我并纠正我的错误吗?

2 个答案:

答案 0 :(得分:0)

请与翻译人员展示你的实际交往。

例如,

$ 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现在是一个循环术语。)

如果您展示了实际操作的内容,可能更容易为您提供帮助。只需编辑您的问题。

答案 1 :(得分:0)

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

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

头/尾构造[Head|Tail]同样是语法糖:

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

用点表示法替换列表表示法,您的谓词将完全相同。只是不方便。

See my answer here for details