Вопрос

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

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 различаются.Например., .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top