Pregunta

Soy nuevo en Prolog, pero estoy atascado en este comando supuestamente simple.He cargado una base de conocimiento sin errores, y cada vez que lo intento. afirmar (e incluso ayuda) Recibo el siguiente mensaje:

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

¿Qué me estoy perdiendo exactamente?Apreciado.

¿Fue útil?

Solución

Usar assertz/1 o asserta/1 en cambio.GNU-Prolog no proporciona assert/1 porque solo asserta/1 y assertz/1 están definidos en la norma.

Tenga en cuenta que mientras asserta/1 siempre tuvo un significado de interpretación claro añadir 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 retract/1) no se verán afectados.Esto se conoce como el vista de actualización lógica.Para citar la norma (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
ejecutar una meta (por ejemplo, cuando el activador de una
el subobjetivo es un llamado de assertz/1 o retract/1) afectará
sólo una activación cuya ejecución comienza después.El
El 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 marcó una gran diferencia entre assert/1 y assertz/1.En la siguiente cita de la guía del usuario de DECsystem 10 de 1978, el término implementación definida sólo puede significar lo que se conoce en la norma como dependiente de la implementación (es decir, esencialmente indefinido).

5.5 Metalógico

...

assert(C)

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

asserta(C)

Como assert(C), excepto que la nueva cláusula se convierte en la primera
cláusula del procedimiento de que se trate.

assertz(C)

Como assert(C), excepto que la nueva cláusula pasa a ser la última
cláusula del procedimiento de que se trate.

También hoy existen sistemas donde assert/1 y assertz/1 diferir de.P.ej., .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top