Prolog - 如何理解列表

时间:2013-04-11 08:56:17

标签: prolog

我不太了解,如何理解这一事实p([H|T], H, T)。我知道C / C ++ / Java等..但这看起来不同。因此,当我将第一个参数传递给“function”p时,它将它分成H和T并使其可以通过此变量访问?我不知道如何从逻辑上理解这一点。

  

http://www.doc.gold.ac.uk/~mas02gw/prolog_tutorial/prologpages/lists.html

p([H|T], H, T).


Lets see what happens when we ask some simple queries.

?- p([a,b,c], X, Y).

X=a


Y=[b,c]


yes

2 个答案:

答案 0 :(得分:1)

您所引用的页面说:“请考虑以下事实。

p([H|T], H, T).

所以我们必须将此视为一个事实。这意味着,就像拥有一个谓词

p([H|T], H, T):- true.         % or,  p(L,H,T) :- L=[H|T].

现在,当您查询p([a,b,c], X, Y).时,除了另一个之外还有一个:

p([a,b,c], X, Y).              % a query
p([H|T],   H, T) :- true.      % a rule's clause: _head_ :- _body_.

注意到等价:[a,b,c] = [H|T]X = HY = T并将其视为统一方程式。第一个进一步翻译成

a = H                          % list's head element
[b,c] = T                      % list's tail

因为[A|B]代表列表中包含A head 元素的列表,而B代表列表的 tail ,即其他所有元素,除了头部。 HT是这些逻辑变量的常用助记符名称。

总的来说,我们得到X = H = aY = T = [b,c]

这个过程就是所谓的统一查询和规则的头部(两个以p“仿函数”开头,并且都有3个“参数”)。

由于查询和规则的“子句”的头部匹配(具有相同的仿函数和相同数量的参数),并且它们的参数都成功统一,成对,使用上面的替换,我们只需要证明该规则的主体(因此被选中)。

由于它是true,我们立即成功,成功替换为我们的结果。

这就是Prolog的工作原理。

TL; DR :是的,当您使用给定列表p(L,H,T)致电L时,它将解构进入其头部{{ 1}}和尾部H。但是,您可以使用给定列表T,值T和变量H来调用它,然后从头部构造新列表和尾巴。如果同时给出L,则会检查其头部是否为L,其尾部是H

这是因为Prolog的统一是双向的:TA = B相同。与变量统一就像设置变量一样,与值统一就像检查与该值的(结构)相等。

调用B = A实际上等同于统一p(L,H,T)

答案 1 :(得分:1)

在Prolog中,我们有 relations ,其方式类似于关系数据库。

然后p / 3它是列表(第一个参数)中的 relation ,它的头部H及其尾部T

教程'作者恰当地使用描述性和合成符号作为变量。

从语法上讲,变量是以大写字母开头的符号,可以获得任何值,但一次(也就是说,不能“重新分配”)。