考虑一个带有 cut 的子句
f(X) :- g(X), !, h(X).
我认为我们可以将削减重构如下:
h1(X) :- !, h(X).
f(X) :- g(X), h1(X).
然而,对于 DCG 来说,这种类宏的削减重构似乎不起作用。例如,我尝试像这样重构 DCG 子句
f(X) --> g(X), !, h(X).
变成下面的东西
h1(X) --> !, h(X).
f(X) --> g(X), h1(X).
但它只是没有用。也就是说,h(X)
后者的失败,而在重构剪辑之前它没有在前者中回溯。
用削减重构 DCG 时是否有一般原则?或者,在 DCG 中使用剪辑时需要考虑一些额外的暗角?