0

我正在尝试进一步了解 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,而不是 _,对吧?有人可以更好地解释我并纠正我的错误吗?

4

2 回答 2

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

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

于 2015-04-17T16:14:31.950 回答
0

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

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

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

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

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

有关详细信息,请参阅我的答案

于 2015-04-17T17:20:08.167 回答