请考虑以下内容:
我有一个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],
[]).
我的最高规则定义了两种情况。
其中单个句子可以作为输入
其中可以给出多个句子作为输入。
为此,它实现了对最高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
,此循环一直持续到我最终用完堆栈。如何避免这种情况?将附加轨迹的图像。 (请参阅两个小工具,然后重做...它们一直进行到我用完堆栈为止。)