我已经开始研究Prolog的assert/1
和retract/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.
因此,我的问题是,在失败的规则中将其撤回后,是否可以自动重新声明该子句。我已经使用元解释器实现了这种行为,但是我想知道是否也可以在相应的谓词中直接对其进行编码。