Termini immessi al livello superiore sono processi come query, mentre termini che compaiono in un file che viene caricato in Prolog viene elaborato come un insieme di regole e di fatti. Se un testo si legge come sotto, questa è una regola.
carnivore(X) :- animal(X), eats_meat(X).
Cercando di inserire questo al livello superiore si verifica l'errore di seguito. Perché? Perché una regola è un termine :-(Testa, Corpo), e perché il primo livello interpreta i termini come query. Non esiste un predicato con il nome: - 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 è stupido questo? 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, chiede a Prolog di provare a provare se rataplan mangia carne.
Se un testo recita
:- use_module(library(clpfd)).
Questa è una direttiva. Le direttive sono simili alle query, ma invece di che chiede al toplevel di fare qualcosa, chiedono al compilatore di fare qualcosa . Come regole e fatti, tali termini appartengono ai file.
Quindi, in questo caso * asserire (donna (mia)) *. farei proprio quello che voglio? –
@devoured: Sì. – sepp2k
Il messaggio di errore può essere fuorviante per un principiante. Poiché le regole possono anche essere caricate dall'utente, che non è esattamente un file. Ma questo è un problema generale nella creazione di buoni messaggi di errore. –