Подтвердите предложение после того, как оно было отозвано в несоблюдении правила - PullRequest
1 голос
/ 18 апреля 2019

Я начал копаться в мета-предикатах 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.

Следовательно, мой вопрос заключается в том, можно ли автоматически повторно утверждать предложение после того, как оно было отозвано в нарушающем правиле. Я достиг такого поведения, используя мета-интерпретатор, но мне было интересно, может ли это быть также закодировано непосредственно в соответствующем предикате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...