Domanda

Sono nuovo in Prolog, ma sono bloccato su questo comando apparentemente semplice.Ho caricato una base di conoscenza senza errori e ogni volta che provo affermare (e persino aiuto) Ricevo il seguente messaggio:

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

Cosa mi manca esattamente?Apprezzato.

È stato utile?

Soluzione

Utilizzo assertz/1 O asserta/1 Invece.GNU-Prolog non fornisce assert/1 perché solo asserta/1 E assertz/1 sono definiti nella norma.

Tieni presente che mentre asserta/1 ha sempre avuto un chiaro significato interpretativo aggiungere la clausola all'inizio, il significato di assertz/1 è stato più difficile da risolvere poiché "aggiungere una clausola alla fine" non determina completamente la semantica degli obiettivi invocati prima di affermare la clausola.

Con ISO-Prolog, gli obiettivi invocati in precedenza assertz/1 (ma anche retract/1) rimangono inalterati.Questo è noto come vista di aggiornamento logico.Per citare la norma (ISO/IEC 13211-1:1995):

7.5.4 Un aggiornamento logico del database

Qualsiasi modifica nel database che si verifica come risultato di
eseguendo un obiettivo (ad esempio, quando l'attivatore di a
il sottoobiettivo è una chiamata di assertz/1 O retract/1) influirà
solo un'attivazione la cui esecuzione inizia successivamente.IL
la modifica non influirà sull'attivazione attualmente in corso
in corso di esecuzione.

NOTA — Pertanto il database viene congelato durante l'esecuzione di
un obiettivo e viene fissato l'elenco delle clausole che definiscono una predicazione
il momento della sua esecuzione (vedi 7.7.7 e).

Si noti che in DECsystem 10 Prolog, il manuale ha fatto una grande differenza tra assert/1 E assertz/1.Nella seguente citazione dalla Guida utente DECsystem 10 del 1978, il termine implementazione definita può significare solo ciò che nello standard è noto come dipendente dall'implementazione (che significa essenzialmente indefinito).

5.5 Meta-logico

...

assert(C)

L'attuale istanza di C viene interpretato come una clausola e viene aggiunto
al programma interpretato corrente (con nuove variabili private
sostituendo eventuali variabili non istanziate).La posizione del nuovo
clausola all'interno della procedura interessata è definita dall'implementazione.
C deve essere istanziato in una non variabile.

asserta(C)

Come assert(C), tranne che la nuova clausola diventa la prima
clausola relativa alla procedura in questione.

assertz(C)

Come assert(C), tranne che la nuova clausola diventa l'ultima
clausola relativa alla procedura in questione.

Anche oggi ci sono sistemi dove assert/1 E assertz/1 differire.Per esempio., .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top