Prolog递归规则问询:member/2谓词的变量合一与执行顺序
理解Prolog中member/2谓词的递归与合一机制
先明确member/2的两个核心子句:
member(X,[X|T]). member(X,[H|T]):- member(X,T).
子句的作用与合一逻辑
- 第一个子句是基准匹配规则:只要列表的头元素能和变量
X完成合一(也就是绑定成同一个值),这个谓词直接成功。这里[X|T]表示任意非空列表,X是列表的第一个元素,T是剩下的尾部元素。 - 第二个子句是递归匹配规则:如果列表的头元素
H和X无法合一,就递归检查列表的尾部T,把问题缩小成“X是不是T的成员”。
针对查询的执行全过程
拿你的查询?- member(X,[yolanda,trudy,vincent,jules]).来拆解每一步:
- 第一次匹配:Prolog从上到下扫描子句,先尝试第一个子句。把查询里的列表
[yolanda,trudy,vincent,jules]和[X|T]合一:X绑定为yolanda,T绑定为[trudy,vincent,jules],直接返回结果X = yolanda。 - 第一次回溯(输入
;):Prolog放弃第一个子句的匹配,尝试第二个子句。此时列表的头H是yolanda,和X无法合一,于是递归调用member(X,[trudy,vincent,jules])。 - 第二次匹配:进入递归后,又优先尝试第一个子句,把
X和trudy合一,返回X = trudy。 - 第二次回溯(输入
;):再次放弃当前匹配,走递归规则,调用member(X,[vincent,jules]),重复逻辑得到X = vincent。 - 第三次回溯(输入
;):递归到member(X,[jules]),匹配第一个子句,X绑定jules,返回结果。 - 第四次回溯(输入
;):递归到member(X,[]),此时两个子句都无法匹配(第一个子句要求非空列表,第二个子句的[H|T]也匹配不了空列表),所以返回no,没有更多解。
内容的提问来源于stack exchange,提问作者Alex_Z
相关产品推荐
相关产品推荐

