【问题标题】:Prolog backtracking positionProlog回溯位置
【发布时间】:2021-05-03 21:52:19
【问题描述】:

鉴于以下情况:

R(p):-
    a(p),
    b(p),
    c(p).

c失败时,会回溯到b并解除绑定b。但是,我希望它从a 回溯并取消绑定b 以及a。可以这样做吗?

【问题讨论】:

    标签: prolog backtracking


    【解决方案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].
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多