我正在努力进一步了解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,而不是_,对吗?有人可以更好地解释我并纠正我的错误吗?
答案 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)
。用点表示法替换列表表示法,您的谓词将完全相同。只是不方便。