Prolog回溯位置
Posted
技术标签:
【中文标题】Prolog回溯位置【英文标题】:Prolog backtracking position 【发布时间】:2021-05-03 21:52:19 【问题描述】:鉴于以下情况:
R(p):-
a(p),
b(p),
c(p).
当c
失败时,会回溯到b
并解除绑定b
。但是,我希望它从a
回溯并取消绑定b
以及a
。可以这样做吗?
【问题讨论】:
【参考方案1】:您可以使用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].
【讨论】:
以上是关于Prolog回溯位置的主要内容,如果未能解决你的问题,请参考以下文章