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。
我正在努力加深对 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。