2010-07-24 11 views
25

mio SWI-Prolog knowledge base contiene i seguenti due fatti:Perché questa domanda del prologo è vera o falsa?

f(a,b). 
f(a,c). 

Ora, se mi pongo la domanda

?- f(a,c). 
true. 

Ma

?- f(a,b). 
true ; 
false. 

Perché è f (a, b) sia vero che falso? Questo succede anche quando ci sono tre fatti nel KB. Se aggiungo f (a, d). al KB, quindi f (a, d) è vero (solo), ma f (a, b) ed f (a, c) sono entrambi veri e falsi. Cosa sta succedendo e cosa posso fare in modo che Prolog risponda (solo) a queste domande?

+3

Accidenti, buona domanda. –

risposta

24

(Nota: questa risposta è un po 'di una supposizione)

considerare come Prolog determina se f(a,c) è vero o no. Controlla la prima regola, f(a,b), e non trova una corrispondenza, ma la seconda regola, f(a,c) corrisponde. Pertanto, f(a,c) è vero. Inoltre, poiché non ci sono più regole per f, non c'è motivo di consentire il ritorno a ritroso - non ci sono altre possibili soluzioni.

Considerare ora f(a,b). Prolog controllerà la prima regola e troverà una corrispondenza. Pertanto, f(a,b) è vero. Tuttavia, non tutte le regole sono state esaurite. Pertanto, Prolog consentirà alla ricerca di continuare (se si colpisce ;). Quando si continua la ricerca e il backtrack, scoprirà che le restanti regole, in particolare f(a,c), non corrispondono a f(a,b). Pertanto, il risultato è falso.

+11

Questa risposta è corretta. In Prolog, l'ordine in cui sono scritti i tuoi fatti sono le regole che determinano l'ordine in cui verranno trovate da una query. Più specificamente, l'opzione 'backtrack' ";" essenzialmente dice costringe il motore di query a scartare il risultato restituito e rispondere alla domanda "ci sono altre * altre * risposte?". Quindi, non è che f (a, b) sia sia vero che falso; ma piuttosto che è vero e se scegli di ignorare quel risultato il motore ti dirà che non ci sono altre voci di fatto f (a, b). Per provarlo, guarda cosa succede se aggiungi un secondo fatto f (a, b). – Assaf

+4

Questo illustra anche il motivo per cui dovresti prestare attenzione all'ordine dei tuoi argomenti se sei preoccupato per le prestazioni. Se l'ordine degli argomenti nel predicato 'f' è stato capovolto, allora questo non sarebbe successo perché gli argomenti iniziali non sono più gli stessi, e quindi non lasciare un punto di scelta. Ciò accade perché la maggior parte dei prologhi esegue l'indicizzazione degli argomenti, che consente di anticipare i predicati con argomenti incompatibili dallo spazio di ricerca. SWI Prolog indicizza solo il primo argomento per impostazione predefinita, ma può essere modificato. – nedned

11

Solo in aggiunta alla risposta di Michael Williamson. Se si vuole raccontare Prolog di smettere di cercare risposte, dopo il primo colpo andato a segno, quindi utilizzare il taglio (!):

?- f(a, b), !. 
true. 

?- f(a, c), !. 
true. 
Problemi correlati