Prolog-如何理解列表

Prolog-如何理解列表,prolog,Prolog,我不知道多少,如何理解这个事实p([H | t],H,t)。我知道C/C++/Java等等。。但这看起来不同。所以当我把第一个参数传递给“function”p时,它把它分为H和T,并使它可以通过这个变量访问?我不知道如何从逻辑上理解这一点 你提到的页面上写着:“考虑以下事实 p([H | T],H,T)。 所以我们必须把这当作一个事实。这意味着,这就像有一个谓词 p([H|T], H, T):- true. % or, p(L,H,T) :- L=[H|T]. 现在,当您查

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


你提到的页面上写着:“考虑以下事实

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
是列表的头元素,而
B
是列表的尾元素,即除头元素之外的所有其他元素
H
T
是这些逻辑变量的常用助记符名称

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

这个过程被称为查询和规则头的统一(这两个东西从一个
p
“functor”开始,都有3个“参数”)

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

因为它是
真的
,我们立即成功了,成功的替换就是我们的结果

Prolog就是这样工作的

TL;DR:是的,当你用给定的列表调用
p(L,H,T)
时,它将被分解为头部
H
和尾部
T
。但是您可以使用给定的列表
T
、值
H
和变量
L
来调用它,然后将从头部和尾部构造一个新列表。如果同时给出了
L
,则将检查其头部是否为
H
,尾部是否为
T

这是因为Prolog的统一是双向的:
A=B
B=A
相同。与变量的统一类似于设置该变量,与值的统一类似于检查与该值的(结构)相等性

调用
p(L,H,T)
实际上相当于统一
L=[H | T]

在Prolog中,我们有关系,在某种程度上类似于relationals DBs

然后p/3它是一个列表(第一个参数)、它的头
H
和它的尾
T
之间的关系

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

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

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