成功回溯后执行其余目标

Execute rest of the goals after successful backtracking

我似乎无法在序言中找到这个特定的结构。考虑三个谓词 a/2、b/2 和 c/2,这样:-

a(M, N) :- b(M, N), c(M, N)

现在谓词之间的实际依赖不完全是 AND。所需的是当 M 未绑定时对 b 和 c 进行评估,因此在这两种情况下评估的 M 都是 returned 。然而在这里,M 将被计算到最后,并且只有一个值将被 returned.

我的问题是:-

  • 你总是 "return" Prolog 中的一个值;这个值要么是成功,要么是失败
  • 是的,可以"continue the execution";然而,这并不是最有用的查看方式(见下文)
  • 是的,是的,但是你的问题不够清楚,无法回答"how"。

首先要做的是:您是否曾尝试按照自己的方式学习教科书或教程?它可能会帮助您在继续之前尝试并执行此操作。

然后:在 Prolog 中,您没有 "AND" 和 "OR";你有 连词 分离词 。更令人困惑的是,连词和析取词在逻辑或语法中都没有相同的含义。相反:

a, b最接近过程语言中AND布尔运算符的短路求值:表示“a,如果成功, b, 如果成功, a, b 成功。"

那么,析取( a ; b )不像过程语言的短路OR。相反,( a ; b ) 表示“a,如果成功,( a ; b ) 也会成功;然后,b,如果成功,( a ; b ) 会再次成功。”。 =36=]

在 Prolog 中,这样的析取:

foo(A) :-
    (   bar(A)
    ;   baz(A)
    ).

相当于定义了两个独立的子句:

foo(A) :-
    bar(A).
foo(A) :-
    baz(A).

所以这是一个小程序:

a(A) :- b(A), c(A).

b(x). b(y). b(z).
c(y).

注意: 大写很重要。

这个程序说:“如果b(A)成功然后c(A)成功,a(A)就会成功。如果A可以与一个统一,b(A)就会成功原子 xyz.c(A) 成功,如果 A 可以与原子 y.[=36 统一=]

通过以下查询尝试其行为方式:

?- a(A).
?- a(x).
?- a(y).

要查看具体情况,请尝试:

?- trace(a/1), trace(b/1), trace(c/1).