成功回溯后执行其余目标

时间:2015-03-05 07:36:06

标签: prolog backtracking

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

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

现在,谓词之间的实际依赖性并不完全相同。期望的是当M未被约束时评估b和c,并且因此在两种情况下都返回评估的M.但是在这里,M将被评估到最后,并且只返回一个值。

我的问题是: -

  • 是否可以在prolog中返回值?
  • 因为如果b失败,整个事情都会失败。但是,即使在b失败后,是否可以继续执行?
  • 是否可以在b成功后和c成功后有选择地返回值?

1 个答案:

答案 0 :(得分:2)

  • 你总是在Prolog中“返回”一个值;这个值要么成功要么失败
  • 是的,可以“继续执行”;但是,这不是最有用的方式(见下文)
  • 是的,是的,但你的问题不够明确,无法回答“如何”。

首先要做的事情是:您是否尝试过教科书或教程?在继续之前,它可能会帮助您尝试这样做。

然后:在Prolog中,你没有“AND”和“OR”;你有连词 disjunctions 。为了使其更加混乱,连词和分离都不具有与逻辑或语法相同的含义。代替:

a, b最接近过程语言中AND布尔运算符的短路评估:它表示“a,如果成功,{{1}如果成功,b成功。“

然后,分离a, b 不像程序语言的短路OR 。相反,( a ; b )表示“( a ; b ),如果成功,a成功;然后( a ; b ),如果成功,b再次成功。”< / p>

在Prolog中,这样的分离:

( a ; b )

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

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

所以这是一个小程序:

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

NB :资本化很重要。

此程序说:“如果a(A) :- b(A), c(A). b(x). b(y). b(z). c(y). 成功,a(A)成功,b(A)成功,c(A)成功。b(A)如果A可以与其中一个成功统一如果x可以与原子y统一,原子zc(A)Ay会成功。“

尝试以下查询的行为:

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

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

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