Question

Je suis nouveau sur le Prologue, mais je suis bloqué à cette soi-disant simple commande.J'ai chargé une base de connaissances sans erreurs, et à chaque fois que j'essaie de faire affirmer (et même aider) Je obtenez le message suivant:

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

Que suis-je exactement manquant?Apprécié.

Était-ce utile?

La solution

Utilisation assertz/1 ou asserta/1 au lieu de cela.GNU-Prolog ne fournit pas de assert/1 parce que seulement asserta/1 et assertz/1 sont définies dans la norme.

Note que bien que asserta/1 toujours eu une interprétation claire de la signification ajouter la clause au début, le sens de l' assertz/1 a été plus difficile à résoudre, car "ajouter une clause à la fin" n'est pas complètement déterminer la sémantique des objectifs qui ont été invoquée avant de faire valoir la clause.

Avec de l'ISO-Prolog, les objectifs qui ont été invoquée avant assertz/1 (mais aussi retract/1) restent inchangées.Ceci est connu comme la logique de mise à jour de la vue.Pour citer la norme (ISO/IEC 13211-1:1995):

7.5.4 Une logique de la base de données de mise à jour

Tout changement dans la base de données qui survient à la suite de
l'exécution d'un objectif (par exemple, lorsque l'activateur d'un
subgoal est un appel de assertz/1 ou retract/1) n'affecte
seulement une activation dont l'exécution commence par la suite.L'
le changement n'affecte pas l'activation qui est actuellement
en cours d'exécution.

NOTE — c'est Donc la base de données est gelé pendant l'exécution de
un but, et la liste des clauses définissant une prédication est fixé à
le moment de son exécution (voir 7.7.7 e).

Notez que dans DECsystem 10 Prolog, le manuel fait une grande différence entre assert/1 et assertz/1.Dans la citation suivante de la DECsystem 10 guide de l'Utilisateur de 1978, le terme la mise en œuvre définies ne peut dire ce qui est connu dans la norme dépendant de l'implémentation (ce qui signifie essentiellement définie).

5.5 Méta-Logique

...

assert(C)

L'instance actuelle de C est interprétée comme une clause et a ajouté
pour l'actuel programme interprété (avec de nouvelles variables privées
remplacement de tout uninstantiated variables).La position de la nouvelle
la clause dans la procédure en question est mise en œuvre définies.
C doit être instancié à un non-variable.

asserta(C)

Comme assert(C), sauf que le nouvel alinéa, qui devient le premier
clause pour la procédure en question.

assertz(C)

Comme assert(C), sauf que la nouvelle clause devient le dernier
clause pour la procédure en question.

Aussi, aujourd'hui, il existe des systèmes où assert/1 et assertz/1 diffèrent.E. g., .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top