Я начал копаться в мета-предикатах 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, но возвращает false, когда я вызвал inner_failing_rule().
, поскольку предложение удаляется из базы данных из-за вызова retract
. Однако я хотел бы иметь другое поведение, а именно: я только хочу, чтобы inner_failing_rule()
отказался, если в конце правило оценивается как истинное. Обратите внимание, что я не могу переместить откат к концу предиката, потому что потенциально могут быть вызовы предикатов, в которых chunk(dummy1)
должен давать ложь.
?- chunk(dummy1).
true.
?- inner_failing_rule().
false.
?- chunk(dummy1).
false. % This shall become true, because inner_failing_rule() was false.
Следовательно, мой вопрос заключается в том, можно ли автоматически повторно утверждать предложение после того, как оно было отозвано в нарушающем правиле. Я достиг такого поведения, используя мета-интерпретатор, но мне было интересно, может ли это быть также закодировано непосредственно в соответствующем предикате.