成功回溯后执行其余目标
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 序言中的值?
- 因为如果 b 失败,那么整个事情都会失败。但是,即使在 b 失败后,是否有可能继续执行?
- 是否可以在b成功后和c成功后选择性地return一个值?
- 你总是 "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)
就会成功原子 x
、y
或 z
.c(A)
成功,如果 A
可以与原子 y
.[=36 统一=]
通过以下查询尝试其行为方式:
?- a(A).
?- a(x).
?- a(y).
要查看具体情况,请尝试:
?- trace(a/1), trace(b/1), trace(c/1).
我似乎无法在序言中找到这个特定的结构。考虑三个谓词 a/2、b/2 和 c/2,这样:-
a(M, N) :- b(M, N), c(M, N)
现在谓词之间的实际依赖不完全是 AND。所需的是当 M 未绑定时对 b 和 c 进行评估,因此在这两种情况下评估的 M 都是 returned 。然而在这里,M 将被计算到最后,并且只有一个值将被 returned.
我的问题是:-
- 是否可以 return 序言中的值?
- 因为如果 b 失败,那么整个事情都会失败。但是,即使在 b 失败后,是否有可能继续执行?
- 是否可以在b成功后和c成功后选择性地return一个值?
- 你总是 "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)
就会成功原子 x
、y
或 z
.c(A)
成功,如果 A
可以与原子 y
.[=36 统一=]
通过以下查询尝试其行为方式:
?- a(A).
?- a(x).
?- a(y).
要查看具体情况,请尝试:
?- trace(a/1), trace(b/1), trace(c/1).