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

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

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

что именно я упускаю? Оцененный.

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) не затрагивает
только активация, выполнение которой начинается позже. The
изменение не влияет на активацию, которая в настоящее время
казнь.

Примечание-таким образом, база данных заморожена во время выполнения
цель и список предложений, определяющих предикат, фиксируются в
момент его исполнения (см. 7.7.7 e).

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

5.5 Meta-Logical

...

assert(C)

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

asserta(C)

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

assertz(C)

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

также сегодня есть системы, где assert/1 и assertz/1 differ. Е. Г., xsb по.