Ошибка утверждения Пролога GNU

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

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

Что мне точно не хватает? Оценил.

1 ответ

Решение

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

Другие вопросы по тегам