Prolog合取查询回溯顺序是否统一?属规范要求吗?可依赖吗?
Prolog合取查询的回溯顺序问题
以下Prolog代码定义了一个非常简单的句子语法(句子=主语+动词+宾语),并提供了少量词汇:
% Example 05 - Generating Sentences % subjects, verbs and objects subject(john). subject(jane). verb(eats). verb(washes). object(apples). object(spinach). % sentence = subject + verb + object sentence(X,Y,Z) :- subject(X), verb(Y), object(Z). % sentence as a list sentence(S) :- S=[X, Y, Z], subject(X), verb(Y), object(Z).
在SWI-Prolog(以swish.swi-prolog.org为例)中执行查询?- sentence(S).,生成结果的顺序如下:
?- sentence(S). S = [john, eats, apples] S = [john, eats, spinach] S = [john, washes, apples] S = [john, washes, spinach] S = [jane, eats, apples] S = [jane, eats, spinach] S = [jane, washes, apples] S = [jane, washes, spinach]
问题
上述结果表明Prolog在合取查询中总是从右向左回溯。**所有Prolog实现都是如此吗?**这属于Prolog规范的一部分吗?如果不是,该行为是否普遍到可以依赖?
说明:为明确起见,“从右向左回溯”指的是:在X和Y的第一个匹配项确定后,Z会被解绑并重新绑定以寻找所有可能值;待Z的所有可能性耗尽后,Y被解绑并重新绑定,且针对每个Y测试不同的Z;最后X被解绑并重新绑定为新值,且针对每个X重新生成Y和Z的所有组合。
回答
- 并非所有Prolog实现都遵循此行为:多数主流Prolog实现(如SWI-Prolog、GNU Prolog、SICStus Prolog)默认采用从左到右执行子目标、深度优先搜索且最右子目标先回溯的策略,但存在小众或特殊用途的Prolog变体可能调整回溯顺序,以适配性能优化或特定场景需求。
- 不属于Prolog规范内容:ISO Prolog标准仅规定查询需返回所有合法解,并未强制解的生成顺序,只保证解的正确性,不对回溯顺序做约束。
- 不建议依赖该行为:尽管主流实现默认行为一致,但一旦更换Prolog环境或启用编译优化(如子目标重排),回溯顺序可能改变,导致代码行为偏离预期。若需严格控制解的顺序,应通过显式逻辑(如排序、自定义生成规则)实现,而非依赖默认回溯机制。
内容的提问来源于stack exchange,提问作者Prolog ByExample
相关产品推荐
相关产品推荐

