Вместо этого используйте 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
), влияет
только на активацию, выполнение которой начинается позже . Изменение
не повлияет на любую активацию, которая
выполняется в данный момент.
ПРИМЕЧАНИЕ. Таким образом, база данных замораживается во время выполнения
цели, а список предложений, определяющих предикацию, фиксируется
на момент ее выполнения (см. 7.7.7 д).
Обратите внимание, что в DECsystem 10 Prolog в руководстве была сделана большая разница между assert/1
и assertz/1
. В приведенной ниже цитате из руководства пользователя DECsystem 10 от 1978 года термин реализация определена может означать только то, что известно в стандарте как зависит от реализации (что означает практически не определено).
5.5 Металогический
...
assert(C)
Текущий экземпляр C
интерпретируется как предложение и добавляется
в текущую интерпретируемую программу (с новыми частными переменными
, заменяющими любые неэкземплярные переменные). Положение предложения new
в рассматриваемой процедуре определяется реализацией.
C
должно быть конкретизировано как непеременная.
asserta(C)
Аналогичен assert(C)
, за исключением того, что новое предложение становится первым
для рассматриваемой процедуры.
assertz(C)
Аналогично assert(C)
, за исключением того, что новое предложение становится последним
для рассматриваемой процедуры.
Также сегодня существуют системы, где assert/1
и assertz/1
различаются. Например, xsb.
person
false
schedule
17.11.2013
assert/1
не существует в GNU Prolog. (Вот что означает существование_ошибки.) Вам нужно использоватьasserta/1
илиassertz/1
. - person lurker   schedule 17.11.2013