Ошибка подтверждения GNU Prolog
-
21-12-2019 - |
Вопрос
Я новичок в Прологе, но застрял в этой, казалось бы, простой команде.Я загрузил базу знаний без ошибок, и всякий раз, когда я пытаюсь сделать утверждать (и даже помощь) Я получаю следующее сообщение:
uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}
Что именно мне не хватает?Ценю.
Решение
Использовать assertz/1
или asserta/1
вместо.GNU-Пролог не предоставляет 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
интерпретируется как предложение и добавляется
к текущей интерпретируемой программе (с новыми частными переменными
заменяя любые неконкретизированные переменные).Позиция нового
Предложение в соответствующей процедуре определяется реализацией.
C
должен быть создан как непеременная.
asserta(C)
Нравиться
assert(C)
, за исключением того, что новое предложение становится первым
положение о соответствующей процедуре.
assertz(C)
Нравиться
assert(C)
, за исключением того, что новое предложение становится последним
положение о соответствующей процедуре.
Также сегодня существуют системы, в которых assert/1
и assertz/1
различаются.Например., хсб.