在失败的规则中将其撤回后,重新声明该子句

时间:2019-04-18 13:55:04

标签: prolog

我已经开始研究Prolog的assert/1retract/1元谓词,现在我想知道它们是否可用于实现“类似于资源的”评估,即消耗子句在评估过程中。

以下代码描述了一个最小,完整且可验证的示例:

:- (dynamic chunk/1).

chunk(dummy1).

inner_failing_rule() :-
    chunk(dummy1),
    retract(chunk(dummy1)),
    % a potential predicate call might happen here in which chunk(dummy1) should be false
    fail, % models a failing predicate call (just for the sake of this example) 
    true.

正如我在下面的跟踪中所述,最初调用chunk(dummy1).会产生true,但是一旦我调用inner_failing_rule().就会产生false,因为由于retract调用该子句从数据库中删除了。但是,我想要一个不同的行为,即,如果规则最后评估为true,我希望inner_failing_rule()撤消。请注意,我无法将缩进移至谓词的末尾,因为可能存在谓词调用,其中chunk(dummy1)会产生false。

?- chunk(dummy1).
true.

?- inner_failing_rule().
false.

?- chunk(dummy1).
false. % This shall become true, because inner_failing_rule() was false.

因此,我的问题是,在失败的规则中将其撤回后,是否可以自动重新声明该子句。我已经使用元解释器实现了这种行为,但是我想知道是否也可以在相应的谓词中直接对其进行编码。

0 个答案:

没有答案