Prolog,避免无限的回溯循环

时间:2018-08-13 14:51:23

标签: prolog backtracking

请考虑以下内容:

我有一个DCG程序,该程序分析有关在2X2平面上拟合形状的小语法。句子被置于一个目标,例如下面的一个,每个目标之间用fullstop隔开。

test(ShapesOut,OpsOut, [circle,1, has, radius,5,fullstop, 
                       square, 1, has, height, 4,fullstop,
                       circle,3,has, radius,6,fullstop,
                       diamond,1,has,height,4,fullstop, 
                       circle,1, is, lower, than, square,1,fullstop,
                       circle,3, is,lower,than,diamond,1,fullstop], 
                             []).

我的最高规则定义了两种情况。

  1. 其中单个句子可以作为输入

  2. 其中可以给出多个句子作为输入。

为此,它实现了对最高DCG规则sentence/7的递归调用。

lpsolve(ShapesIn,ShapesOut,OpsIn,OpsOut,Subject) -->     
                sentence(ShapesIn,ShapesOut,OpsIn,OpsOut,Subject).

lpsolve(ShapesIn,ShapesOut,OpsIn,OpsOut,Subject) --> 
                 sentence(ShapesIn,ShapesMiddle,OpsIn,OpsMiddle,Subject),                                                
               lpsolve(ShapesMiddle,ShapesOut,OpsMiddle,OpsOut,_Subject2).

该程序的最下方是下面的DCG规则,该规则对Prolog谓词shape_lookup/3 and computeShapeBelow/2进行调用。

belowShapeId(ShapesIn,ShapesOut,OpsIn,OpsOut,Subject) --> below,                                         
      [Shape], [X],[fullstop],
      {append( [[Subject, below,[Shape,X]]],OpsIn,OpsOut), 
      append([],ShapesIn,ShapesOut),
      shape_lookup(Subject,ShapesOut,Shape1),  
      shape_lookup([Shape,X],ShapesOut,Shape2),
      computeShapeBelow(Shape1,Shape2)}.

如果只有一个句子通过该规则并且它是输入的末尾(该句子之后没有其他句子),那么我上面的DCG规则将非常有效。如果之后出现另一句话,则shape_lookup/3 and computeShapeBelow/2会导致我确定以下问题。

如果要分析一个句子,则DCG规则已到达句子的末尾,它将与[]与[]匹配,就像在正确输入的末尾进行DCG解析的情况一样。但是,如果在解析完一个句子之后存在另一个句子,则[]将与该句子匹配,并且将失败,导致程序重新执行先前计算的步骤。这是正常现象,因为基本情况失败,它将尝试遍历句子/ 7的下一个递归谓词。这便是出现问题的地方。 重做shape_lookup/3 and computeShapeBelow/2并成功,然后返回以将[]与句子的其余部分进行比较,并像以前一样失败。然后返回并重做shape_lookup/3 and computeShapeBelow/2,此循环一直持续到我最终用完堆栈。如何避免这种情况?将附加轨迹的图像。 (请参阅两个小工具,然后重做...它们一直进行到我用完堆栈为止。)

enter image description here

0 个答案:

没有答案