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