2013-05-04 13 views
18

ho questo pezzo di codice:Prolog: clausole non sono insieme nella sorgente file

% Family tree 
female(pen). 
male(tom). 
male(bob). 
female(liz). 
female(pat). 
female(ann). 
male(jim). 

parent(pam, bob). 
parent(tom, bob). 
parent(tom, liz). 
parent(bob, ann). 
parent(bob, pat). 
parent(pat, jim). 

ottengo questo errore:

Warning: Clauses of female/1 are not together in source-file 
Warning: Clauses of male/1 are not together in source-file 

Qual è lo scopo di questo errore?
Voglio dire, il file viene compilato ed eseguito correttamente e sono consapevole del significato dell'errore. Ma perché?
Questo è solo un avviso per applicare le migliori pratiche?

Sono molto nuovo alla programmazione logica.
Grazie!

+0

Per coloro che non sanno come risolverlo: Raggruppa le relazioni (in questo caso 'maschile' e' femminile') per nome della relazione. –

risposta

12

Corretto, questo è un avviso per applicare le migliori pratiche, che consiste nel mettere tutte le clausole correlate insieme nel file sorgente. Oltre a ciò, la vicinanza delle clausole l'una all'altra nel file sorgente non ha importanza, purché il loro ordine relativo non cambi.

+0

c'è un modo per spegnerlo? A volte non riesco a scrivere codice in questo modo. – intelis

+1

@intelis C'è un modo per dire a Prolog che intendi diffondere clausole ([link a una risposta che spiega come farlo] (http://stackoverflow.com/q/2482101/335858)). – dasblinkenlight

+0

grazie, ma non sono solo clausole. Ricevo diversi avvertimenti, come le variabili Singleton, ecc. – intelis

5

L'avviso incoraggia le migliori pratiche e aiuta a individuare gli errori di battitura. Ecco un esempio di errore di battitura:

small(ant). 
small(fly). 
small(molecule). 

smell(sweet). 
smell(pungent). 
small(floral). 

L'errore è difficile da individuare, ma per fortuna il compilatore avverte:

Warning: /tmp/test.pl:7: 
Clauses of small/1 are not together in the source-file 

Con l'avvertimento e un errore di linea, si può trovare e correggere l'errore di battitura in modo più rapido.

ISO Prolog fornisce la direttiva discontiguous/1 per silenziare questo avviso per predicati specifici. Vedere la sezione 7.4.2.3 della specifica. Viene utilizzato in questo modo:

:- discontiguous small/1. 
Problemi correlati