Ошибка утверждения 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 по.