统一算法实际上是如何工作的?
How does unification algorithm actually work?
我有这个 Prolog 代码:
bar(b).
bar(c).
baz(c).
这个查询:
bar(X), baz(X).
returns X = c
如果我有这个程序,有点不同:
bar(c).
bar(b).
baz(c).
关于同一个查询
bar(X), baz(X).
为什么会这样return
X = c;
false
Prolog 为回答查询而执行的计算可以表示为一棵树。 Prolog 使用 depth-first 策略 搜索此树,当它遇到失败节点时(或当用户按下键 ' ;' 以获得替代答案)。
在搜索过程中,子句按照它们在程序中声明的顺序使用(从第一个到最后一个)。
在搜索结束时,仅当树中 最后访问的节点 是失败节点[=35 时,Prolog 才显示 false
=].
因此,要了解 Prolog 在两种情况下表现不同的原因,您可以比较 Prolog 在每种情况下探索的搜索树:
- 第一种情况:
- 第二种情况:
我有这个 Prolog 代码:
bar(b).
bar(c).
baz(c).
这个查询:
bar(X), baz(X).
returns X = c
如果我有这个程序,有点不同:
bar(c).
bar(b).
baz(c).
关于同一个查询
bar(X), baz(X).
为什么会这样return
X = c;
false
Prolog 为回答查询而执行的计算可以表示为一棵树。 Prolog 使用 depth-first 策略 搜索此树,当它遇到失败节点时(或当用户按下键 ' ;' 以获得替代答案)。
在搜索过程中,子句按照它们在程序中声明的顺序使用(从第一个到最后一个)。
在搜索结束时,仅当树中 最后访问的节点 是失败节点[=35 时,Prolog 才显示 false
=].
因此,要了解 Prolog 在两种情况下表现不同的原因,您可以比较 Prolog 在每种情况下探索的搜索树:
- 第一种情况:
- 第二种情况: