gpt4 book ai didi

Prolog:冗余导致涉及匿名变量的子句

转载 作者:行者123 更新时间:2023-12-01 12:18:54 24 4
gpt4 key购买 nike

考虑以下 Prolog 程序。

a(X) :- b(_), c(X).

b(1).
b(2).
b(3).

c(1).

运行查询:

a(X).

在 SWI-Prolog 中,我们得到三个结果,所有 X = 1。

鉴于我们不关心匿名变量,是什么阻止了 SWI-Prolog 返回单个结果?为什么不执行此优化?

谢谢

最佳答案

好吧,对于 Prolog,下划线只是一个匿名变量。所以 a/1 谓词等同于:

a(X) :-
b(<b>Y</b>),
c(X).

现在回溯 b(Y) 子句可能看起来毫无用处,因为一旦它被满足,Y 就不会被使用,因此不应该有影响在程序的其余部分。此外 YX 没有影响,所以 b(Y)X 应该没有丝毫影响。

然而,在真正的 Prolog 中,有些事情可能会产生影响:

  1. b/1 谓词可能执行 I/O。假设谓词实现为:

    b(a) :-
    print(a).
    b(a) :-
    print(b).

    然后它将在第一个分支中打印a,在第二个分支中打印b

  2. b/1 可能会在第二个、第三个...路径中引发异常。在这种情况下,我们可能想要处理错误;

  3. b/1 可能使用 asserta/1 , assertz/1修改程序。例如,它可能会为 c/1 添加事实,以便在第二次运行时 c/1 有其他结果。

  4. 很多 Prolog 解释器都有一个 non-backtrackable store这样不同的回溯路径可以相互共享信息。

  5. 其他编码工具,例如 b/1 的结果可能会影响 c/1

您可以使用 once/1b/1避免这种回溯元谓词。例如:

a(X) :-
<b>once(</b>b(_)<b>)</b>,
c(X).

关于Prolog:冗余导致涉及匿名变量的子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46018511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com