Prolog/Primi passi: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Riga 74:
 
Osserva il punto '.' dietro ogni linea per mostrare la fine della stessa. Questo è molto importante, se lo dimentichi il tuo interprete non comprenderà il programma.
DovreestiDovresti anche essere consapevole che i nomi scelti per i predicatied i termini non dicono assolutamente nulla all'interprete di prlog. Devono essere scelti per consentire di comprendere bene il programma, la [[w:leggibilità|leggibilità]]. Potremmo sostituire facilmente la parola ''umano'' con qualsiasi altra parola e l'interprete non ne vedrebbe la differenza.
 
Se carichiamo il programma sopra illustrato nell'interprete possiamo interrogare il computer. Se digiti :
umano(john).
Riga 84:
Yes.
 
se digiti:
donna(john).
Riga 92:
No.
 
Questo sembrerà noiosamente ovvio, ma è importante vederlo nel modo giusto. Se chiedi a prolog '''umano(john).''', significa che stai chiedendo a prolog se quest'affermazione è vera. Chiaramente il prolog non può valutare se l'affermazione è vera, semplicemente sta consultando il suo file. Semplicemente controlla che qualcunauna della affermazioni contenutacontenute nella knowledgebase sia vera ed in tal caso risponde '''yes'''; '''no''' nel caso contrario.
Nota: se chiedi a prolog:
 
?- umano(david).
Riga 122:
Se prolog viene interrogato con più di una variabile esso mostrerà tutte le istanze delle variabili per la quale l'interrogazione è vera :
<pre><nowiki>
?- parentparente(Parent, Child).
 
Parent = david
Riga 140:
Per rendere le cose un po' difficili, possiamo usare due predicati nella stessa domanda, per esempio:
<pre><nowiki>
?- umano(A), parentparente(B,A).
</nowiki></pre>
Adesso stiamo chiedendo a prolog se c'è un umano A che ha un parente B. La virgola tra i due predicati equivale a un ''and'', indicando così che entrambi i predicati necessitano di essere veri affinché sia vera la domanda. Prolog troverà un' istanza che renda il primo predicato vero, quindi cercherà di rendere vero il secondo (servendosi dell'istanza del primo). Trovato un modo per rendere la proposizione vera, come nel caso precedente, se premi punto e virgola, Prolog cercherà altre soluzioni provando prima per altre istanze del secondo predicato e poi ripeterà il processo provando per le tutte le rimanenti istanze modificando di volta in volta il primo predicato.
 
Nell'esempio precedente prolog trova umano(david) nel programma ed unifica A con david. Per verificare il secondo predicato, crea una istanza per parentparente(B, david). Se non trova nulla cerca una nuova istanza per umano(A). Poi tenta A = john. Quindi istanzia parentparente(B, john). Trova B = david nella linea parentparente(david, john) e quindi risulta
A = john
Riga 153:
Esiste una variabile speciale chiamata anonima, per la quale viene usata il carattere sottolineatura (_). Quando usi questo carattere in una domanda, significa che non ti importa di come è istanziata la variabile, ie non ti importa a quale termine sia collegata, anche se è collegata a qualcosa. Se chiedi a prolog
<pre><nowiki>
?- parentparente(A, _).
</nowiki></pre>
Prolog risponderà
Riga 165:
?- abc(_,_,_).
</nowiki></pre>
Questo non sarà vero per default, prolog ha bisogno di un'istanza per tutte le tre variabili anonime nel database, come abc(d,e,f). Puoi usare anche la variabile anonima nel tuo database. Ponendo :
 
umano(_).
 
Nel tuo archivio si avrà che ogni termine,esista o meno, sarà umano. Così la domanda:
<pre><nowiki>
?- umano(abc)
Riga 207:
car(corvette) :- haruote(corvette), hafinestrini(corvette).
 
stabilisce che una corvette è un'auto se ha ruote e finestrini. Questa non è una affermazione molto utile, potremmo semplicemente stabilire che una corvette è una macchina con:
car(corvette).
Riga 217:
hafinestrini(corvette).
 
La prima linea stabilisce che affinché auto(A) sia vera, ha ruote(A) e ha finestrini(A) devono essere veri. Se chiediamo a prolog se la corvette è una macchina con :
 
?- car(corvette).
Riga 231:
Ritorniamo ora al nostro programma originale e aggiungiamo qualche regola.
umanumano(david).
umano(john).
umano(suzie).
umano(eliza).
manuomo(david).
manuomo(john).
womandonna(suzie).
womandonna(eliza).
parentparente(david, john).
parentparente(john, eliza).
parentparente(suzie, eliza).
fatherpadre(X,Y) :- parentparente(X,Y), manuomo(X).
mothermadre(X,Y) :- parentparente(X,Y), womandonna(X).
 
Chiediamo a prolog chi è il padre di eliza:
?- fatherpadre(X, eliza).
X = john ;
Riga 255:
Ora metti tutti i padri nel database con i loro rispettivi figli:
 
?- fatherpadre(Father, Child).
Father = david
Riga 267:
Adesso le madri
 
?- mothermadri(Mother,Child).
 
Mother = suzie
Riga 275:
 
== Esempi ==
?-mothermadre(Mother,Child)
 
== Esercizi ==