Question

Je lis http: //cs.union.edu/~striegnk/learn-prolog-now/html/node3.html#subsec.l1.kb1 , mais je ne parviens pas à exécuter le prédicat suivant:

SICStus 4.0.1 (x86-win32-nt-4): Tue May 15 21:17:49 WEST 2007
| ?- woman(mia).
! Existence error in user:woman/1
! procedure user:woman/1 does not exist
! goal:  user:woman(mia)
| ?- 

Si, d'autre part, j'écrire dans un fichier et lancez consulter le fichier, il semble fonctionner très bien ...

Suis-je seulement permis de définir prédicats dans un fichier ayant plus tard les consulter? je ne peux pas le faire dans l'éditeur lui-même?

Était-ce utile?

La solution

Vous devez entrer woman(mia). dans un fichier pour l'affirmer comme un fait. Si vous écrivez dans l'interpréteur, il est pris comme une requête, pas un fait.

De la SWI Prolog FAQ :

Les termes que vous entrez au premier niveau des processus que les requêtes, alors que termes qui apparaissent dans un fichier qui sont chargées dans Prolog est traitée comme un ensemble de règles et de faits. Si un texte se lit comme ci-dessous, c'est une règle.

carnivore(X) :- animal(X), eats_meat(X).

Essayer d'entrer dans ce dans les résultats de l'erreur dans toplevel ci-dessous. Pourquoi? Parce qu'une règle est un terme :-( tête, corps), et parce que le premier niveau interprète termes comme requêtes. Il n'y a pas prédicat avec le nom: - et deux arguments.

?- carnivore(X) :- animal(X), eats_meat(X). ERROR: Undefined
procedure: (:-)/2 ERROR:   Rules must be loaded from a file ERROR:  
See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt

est-ce pas stupide? Et bien non. Supposons que nous ayons un terme eats_meat (Rataplan). Si cela apparaît dans un fichier, il indique le fait que mange de la viande de Rataplan. Si elle apparaît au premier niveau, il demande Prolog pour essayer de prouver que la viande Rataplan de Eats.

Si un texte lit

:- use_module(library(clpfd)).

Ceci est une directive. Les directives sont similaires aux requêtes, mais au lieu de demandant au toplevel de faire quelque chose, ils demandent au compilateur de faire quelque chose. Comme les règles et les faits, ces termes appartiennent dans les fichiers.

Au lieu d'écrire à un fichier que vous pouvez également utiliser assert dans le premier niveau (comme expliqué plus loin dans la FAQ ainsi).

Autres conseils

Il est un peu ennuyeux de faire prédicats dans le rempl. Vous pouvez faire

| ?- ['user'].
woman(mia).
^D

ie consulter l'entrée d'utilisateur, ou

| ?- assertz(woman(mia)).

l'affirmer. Les deux maladroits OMI - il pourrait y avoir une meilleure façon, cependant, je ne sais pas juste. En général, il est plus facile d'utiliser un script.

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