【发布时间】:2021-05-03 21:52:19
【问题描述】:
鉴于以下情况:
R(p):-
a(p),
b(p),
c(p).
当c失败时,会回溯到b并解除绑定b。但是,我希望它从a 回溯并取消绑定b 以及a。可以这样做吗?
【问题讨论】:
标签: prolog backtracking
鉴于以下情况:
R(p):-
a(p),
b(p),
c(p).
当c失败时,会回溯到b并解除绑定b。但是,我希望它从a 回溯并取消绑定b 以及a。可以这样做吗?
【问题讨论】:
标签: prolog backtracking
您可以使用if->then 构造来提交您不想回溯的目标的更改(将它们放在->/2 的左侧)。
例如,如果您想跳过 b/1 目标的回溯,您可以这样做:
r(P):-
a(P),
(
b(P)
-> c(P)
).
这些测试事实:
a([a1|_]).
a([a2|_]).
b([_,b1|_]).
b([_,b2|_]).
c([_,_,c1]).
c([_,_,c2]).
这个示例查询:
?- r(P).
P = [a1, b1, c1] ;
P = [a1, b1, c2] ;
P = [a2, b1, c1] ;
P = [a2, b1, c2].
【讨论】: