Ошибка подтверждения GNU Prolog

Я новичок в Прологе, но я застрял в этой якобы простой команде. Я загрузил базу знаний без ошибок, и всякий раз, когда я пытаюсь выполнить assert (и даже help), я получаю следующее сообщение:

uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}

Что мне точно не хватает? Ценится.


person bellpeace    schedule 17.11.2013    source источник
comment
assert/1 не существует в GNU Prolog. (Вот что означает существование_ошибки.) Вам нужно использовать asserta/1 или assertz/1.   -  person lurker    schedule 17.11.2013


Ответы (1)


Вместо этого используйте assertz/1 или asserta/1. GNU-Prolog не предоставляет assert/1, потому что в стандарте определены только asserta/1 и assertz/1.

Обратите внимание, что в то время как asserta/1 всегда имел одно четкое толкование, означающее добавить предложение в начале, значение assertz/1 было труднее разрешить, поскольку «добавить предложение в конце» не полностью определяет семантику целей. которые были вызваны до утверждения предложения.

При использовании ISO-Prolog цели, которые были вызваны до assertz/1 (но также и retract/1), остаются незатронутыми. Это известно как представление логического обновления. Процитируем стандарт (ISO/IEC 13211-1:1995):

7.5.4 Логическое обновление базы данных

Любое изменение в базе данных, происходящее в результате
выполнения цели (например, когда активатором
подцели является вызов assertz/1 или retract/1), влияет
только на активацию, выполнение которой начинается позже . Изменение
не повлияет на любую активацию, которая
выполняется в данный момент.

ПРИМЕЧАНИЕ. Таким образом, база данных замораживается во время выполнения
цели, а список предложений, определяющих предикацию, фиксируется
на момент ее выполнения (см. 7.7.7 д).

Обратите внимание, что в DECsystem 10 Prolog в руководстве была сделана большая разница между assert/1 и assertz/1. В приведенной ниже цитате из руководства пользователя DECsystem 10 от 1978 года термин реализация определена может означать только то, что известно в стандарте как зависит от реализации (что означает практически не определено).

5.5 Металогический

...

assert(C)

Текущий экземпляр C интерпретируется как предложение и добавляется
в текущую интерпретируемую программу (с новыми частными переменными
, заменяющими любые неэкземплярные переменные). Положение предложения new
в рассматриваемой процедуре определяется реализацией.
C должно быть конкретизировано как непеременная.

asserta(C)

Аналогичен assert(C), за исключением того, что новое предложение становится первым
для рассматриваемой процедуры.

assertz(C)

Аналогично assert(C), за исключением того, что новое предложение становится последним
для рассматриваемой процедуры.

Также сегодня существуют системы, где assert/1 и assertz/1 различаются. Например, xsb.

person false    schedule 17.11.2013
comment
В XSB assertz/1 выдает предупреждение о попытке, а assert/1 нет (раздел 6.14). Еще одна странность: в документе упоминается, что логическое представление не используется и что asserta/1 может быть быстрее, чем assertz/1. - person Mostowski Collapse; 06.10.2015