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

为何含cut的Prolog示例未呈现depth-first resolution预期结果?

Prolog截断符与归结策略问题解析

为什么只得到M=pizza的解?

核心原因是截断符!直接阻断了回溯路径,和你对深度/广度优先的误解无关,具体执行流程如下:

  1. 执行查询?- meal(M,F).时,Prolog按规则体左到右顺序匹配目标:先匹配homemade(Main),第一个匹配到的事实是homemade(pizza),此时Main=pizza。
  2. 紧接着执行!,这个操作会锁定当前已选择的分支——也就是说,后续回溯时,Prolog再也不会尝试homemade(Main)的下一个备选事实homemade(soup)。
  3. 最后匹配ripe(Fruit),会依次匹配到apple和orange,因此只生成两组M=pizza的解。

关于Prolog归结策略的澄清

Prolog的归结策略始终是深度优先+规则体左到右匹配,不存在“首个候选解深度优先,解搜索广度优先”的情况:

  • 规则体中的目标严格按照书写顺序从左到右执行;
  • 每个目标内部的备选事实/规则,会按定义的先后顺序依次尝试,只有当前备选失败时才会回溯到下一个备选;
  • 这里homemade(Main)的解析本身就是深度优先过程,但!的存在直接切断了回溯到该目标下一个备选的可能。

验证:移除截断符后的结果

如果把规则中的!删除,修改为:

meal(Main, Fruit) :- homemade(Main), ripe(Fruit).

执行查询?- meal(M,F).会得到四组预期的解:

M = pizza, F = apple
M = pizza, F = orange
M = soup, F = apple
M = soup, F = orange

这完全符合深度优先+左到右的归结逻辑:先遍历homemade的所有备选,再为每个homemade结果遍历ripe的所有备选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:40:25