我不太了解,如何理解这一事实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
答案 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 = H
,Y = T
并将其视为统一方程式。第一个进一步翻译成
a = H % list's head element
[b,c] = T % list's tail
因为[A|B]
代表列表中包含A
head 元素的列表,而B
代表列表的 tail ,即其他所有元素,除了头部。 H
和T
是这些逻辑变量的常用助记符名称。
总的来说,我们得到X = H = a
,Y = T = [b,c]
。
这个过程就是所谓的统一查询和规则的头部(两个以p
“仿函数”开头,并且都有3个“参数”)。
由于查询和规则的“子句”的头部匹配(具有相同的仿函数和相同数量的参数),并且它们的参数都成功统一,成对,使用上面的替换,我们只需要证明该规则的主体(因此被选中)。
由于它是true
,我们立即成功,成功替换为我们的结果。
这就是Prolog的工作原理。
TL; DR :是的,当您使用给定列表p(L,H,T)
致电L
时,它将解构进入其头部{{ 1}}和尾部H
。但是,您可以使用给定列表T
,值T
和变量H
来调用它,然后从头部构造新列表和尾巴。如果同时给出L
,则会检查其头部是否为L
,其尾部是H
。
这是因为Prolog的统一是双向的:T
与A = B
相同。与变量统一就像设置变量一样,与值统一就像检查与该值的(结构)相等。
调用B = A
实际上等同于统一p(L,H,T)
。
答案 1 :(得分:1)
在Prolog中,我们有 relations ,其方式类似于关系数据库。
然后p / 3它是列表(第一个参数)中的 relation ,它的头部H
及其尾部T
。
教程'作者恰当地使用描述性和合成符号作为变量。
从语法上讲,变量是以大写字母开头的符号,可以获得任何值,但仅一次(也就是说,不能“重新分配”)。