Domanda

http: //cs.union.edu/~striegnk/learn-prolog-now/html/node3.html#subsec.l1.kb1 , ma sto avendo difficoltà di eseguire il seguente predicato:

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)
| ?- 

Se, d'altra parte, mi scrivere in un file ed eseguire consultare il file, esso sembra funzionare bene ...

I Am consentito solo a definire predicati in un file di dover poi consultarli? Non posso semplicemente farlo nell'editor stesso?

È stato utile?

Soluzione

Si dovrebbe entrare woman(mia). in un file di affermare come un dato di fatto. Se si scrive in l'interprete, è preso come una query, non è un dato di fatto.

SWI Prolog FAQ :

Termini immessi al livello superiore sono processi come query, mentre termini che compaiono in un file che viene caricato in Prolog vengono elaborati come un insieme di regole e di fatti. Se un testo si legge come di seguito, questa è una regola.

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

Cercando di entrare in questo i risultati livelli superiori nel l'errore sotto. Perché? A causa di una regola è un termine :-( testa, corpo), e perché il livello superiore interpreta termini come query. Non v'è alcun predicato con il nome di: - e due argomenti.

?- 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

Non è questo stupido? Beh no. Supponiamo di avere un termine eats_meat (Rataplan). Se questo appare in un file, si afferma il fatto che Rataplan mangia carne. Se appare al livello superiore, si chiede Prolog per cercare di dimostrare se mangia carne Rataplan.

Se un testo si legge

:- use_module(library(clpfd)).

Questa è una direttiva. Direttive sono simili alle domande, ma invece di chiedendo al toplevel di fare qualcosa, chiedono al compilatore di fare qualcosa. Come le regole e fatti, tali termini appartengono file.

Invece di scrivere su un file è anche possibile utilizzare assert nel primo livello (come spiegato più avanti nella FAQ pure).

Altri suggerimenti

E 'un po' fastidioso per fare predicati nel repl. Si potrebbe fare

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

cioè consultare l'input dell'utente, o

| ?- assertz(woman(mia)).

affermarla. Entrambi imbarazzante IMO - ci potrebbe essere un modo migliore, però, io non lo so. In generale, è più facile da usare uno script.

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