考虑一个带有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内使用切割时需要考虑一些额外的暗角?