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