You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]).来拆解每一步:

  1. 第一次匹配:Prolog从上到下扫描子句,先尝试第一个子句。把查询里的列表[yolanda,trudy,vincent,jules]和[X|T]合一:X绑定为yolanda,T绑定为[trudy,vincent,jules],直接返回结果X = yolanda。
  2. 第一次回溯(输入;):Prolog放弃第一个子句的匹配,尝试第二个子句。此时列表的头H是yolanda,和X无法合一,于是递归调用member(X,[trudy,vincent,jules])。
  3. 第二次匹配:进入递归后,又优先尝试第一个子句,把X和trudy合一,返回X = trudy。
  4. 第二次回溯(输入;):再次放弃当前匹配,走递归规则,调用member(X,[vincent,jules]),重复逻辑得到X = vincent。
  5. 第三次回溯(输入;):递归到member(X,[jules]),匹配第一个子句,X绑定jules,返回结果。
  6. 第四次回溯(输入;):递归到member(X,[]),此时两个子句都无法匹配(第一个子句要求非空列表,第二个子句的[H|T]也匹配不了空列表),所以返回no,没有更多解。

内容的提问来源于stack exchange,提问作者Alex_Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:13:15