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回溯位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Prolog 回溯期间获取值列表?

在Python中实现Prolog统一算法?回溯

如何具体化 Prolog 的回溯状态以执行与 Clojure 中的“lazy seq”相同的任务?

Prolog 中的 Tron lightcycles AI

Angular:位置回溯历史

AOJ894 种花图的搜索+回溯