prolog gnu-prolog iso-prolog prolog-assert

prolog - Error de afirmación del prólogo de GNU



gnu-prolog iso-prolog (1)

Use assertz/1 o asserta/1 lugar. GNU-Prolog no proporciona assert/1 porque solo asserta/1 y assertz/1 están definidos en el estándar.

Tenga en cuenta que aunque asserta/1 siempre tuvo una interpretación clara, lo que significa agregar la cláusula al principio , el significado de assertz/1 fue más difícil de resolver ya que "agregar una cláusula al final" no determina completamente la semántica de los objetivos que se han invocado antes de afirmar la cláusula.

Con ISO-Prolog, los objetivos que se han invocado antes de assertz/1 (pero también de retract/1 ) no se verán afectados. Esto se conoce como la vista de actualización lógica . Para citar el estándar (ISO / IEC 13211-1: 1995):

7.5.4 Una actualización lógica de la base de datos

Cualquier cambio en la base de datos que ocurra como resultado de
ejecutando un objetivo (por ejemplo, cuando el activador de un
subgoal es una llamada de assertz/1 o retract/1 ) afectará
solo una activación cuya ejecución comienza después. los
cambio no afectará ninguna activación que esté actualmente
ser ejecutado.

NOTA - Por lo tanto, la base de datos se congela durante la ejecución de
un objetivo, y la lista de cláusulas que definen una predicación se fija en
el momento de su ejecución (ver 7.7.7 e).

Tenga en cuenta que en DECsystem 10 Prolog, el manual hizo una gran diferencia entre assert/1 y assertz/1 . En la siguiente cita de la guía de usuario DECsystem 10 de 1978, el término implementación definida solo puede significar lo que se conoce en la norma como dependiente de la implementación (es decir, esencialmente indefinido).

5.5 Meta-Logical

...

assert(C)

La instancia actual de C se interpreta como una cláusula y se agrega
al programa interpretado actual (con nuevas variables privadas
reemplazando cualquier variable desinstalada). La posición del nuevo
cláusula dentro del procedimiento en cuestión está definido por la implementación.
C debe ser instanciado a una no variable.

asserta(C)

Like assert(C) , excepto que la nueva cláusula se convierte en la primera
cláusula para el procedimiento en cuestión.

assertz(C)

Like assert(C) , excepto que la nueva cláusula se convierte en la última
cláusula para el procedimiento en cuestión.

También hoy hay sistemas en los que assert/1 y assertz/1 . Por ejemplo, xsb .

Soy nuevo en Prolog, pero estoy atascado en este comando supuestamente simple. He cargado una base de conocimiento sin errores, y siempre que lo intento afirmo (e incluso ayudo ) obtengo el siguiente mensaje:

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

¿Qué es exactamente lo que me falta? Apreciado.