Prolog/Primi passi: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Tux3 (discussione | contributi)
Nessun oggetto della modifica
 
BimBot (discussione | contributi)
m Robot: Automated text replacement (-([^'])a'([^']) +\1à\2)
Riga 5:
Umano(john).
 
Sii preciso, la maiuscola e' importante in prolog, come il punto. Questo sara'sarà il tuo programma (noto come '''database''' o '''conoscenza di base'''). Salvalo come prolog1.pl. ''Nota: L'estensione .pl non e' ufficialmente associata con prolog e questo puo' causare conflitti se programmi in Perl, che usa ugualmente .pl. Se questo costituisce un problema puoi usare .pro o .pr o una a tuo piacere.''
Adesso avvia l'interprete di prolog. Molti interpreti di prolog mostrano una finestra con un sacco di informazioni seguite da una linea come quella qui sotto:
 
Riga 30:
umano(john).
 
(non dimenticare il punto) e premi '''Invio'''. Prolog rispondera'risponderà con un sentito:
 
Yes.
Riga 38:
umano(Who).
 
e prolog rispondera'risponderà
 
Who = john
 
Premi invio e prolog terminera'terminerà con Yes per poi tornare alla linea di comando.
 
Per uscire da prolog digita
Riga 72:
parente(suzie, eliza).
 
Osserva il punto '.' dietro ogni linea per mostrare la fine della stessa. Questo e' molto importante, se lo dimentichi il tuo interprete non comprendera'comprenderà il programma.
Dovreesti 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:leggibilita'leggibilità|leggibilita'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
Riga 79:
umano(john).
 
prolog rispondera'risponderà
 
Yes.
Riga 87:
donna(john).
 
prolog rispondera'risponderà
 
No.
 
Questo sembrera'sembrerà noiosamente ovvio, ma e' importante vederlo nel modo giusto. Se chiedi a prolog '''umano(john).''', significa che stai chiedendo a prolog se quest'affermazione e' vera. Chiaramente il prolog non puo' valutare se l'affermazione e' vera, semplicemente sta consultando il suo file.Semplicemente controlla che qualcuna della affermazioni contenuta nella knowledgebase sia vera ed in tal caso risponde '''yes'''; '''no''' nel caso contrario.
Nota: se chiedi a prolog
 
?- umano(david).
 
Prolog rispondera'risponderà No perche' non trova niente nel database.
 
== Variabili ==
 
Quello che stiamo facendo non e' un vero e prorio linguaggio espressivo. Possiamo aumentare l'espresivita'espresività di un linguaggio utilizzando le ''variabili'' nel nostro percorso di apprendimento. UNa variabile e' una parola , proprio come termini e predicati , con l'eccezione che inizia con la lettera maiuscola ed ha dopo di se' lettere sia maiuscole che minuscole. Considera la seguente interrogazione:
 
umano(A).
 
Adesso il termine del predicato e' una variabile. Prolog tentera'tenterà di legare un termine alla variabile. In other words, tu stai chiedendo a prolog di cosa ha bisogno A affinche' umano(A) sia vera.
 
?- umano(A).
 
Prolog rispondera'risponderà
 
A = john
 
Vera'Verà perche' il database contiene la linea '''umano(john)'''. Se premi invio, prolog rispondera'risponderà Yes e rimandera'rimanderà il cursore. Se premi il punto e virgola (';') prolog mostrera'mostrerà il resto delle possibilita'possibilità:
 
A = suzie ;
Riga 118:
No.
 
Dopo eliza, prolog risponde No, indicando che le possibilita'possibilità ulteriori si sono esaurite.
Se prolog viene interrogato con piu' di una variabile esso mostrera'mostrerà tutte le istanze delle variabili per la quale l'interrogazione e' vera :
<pre><nowiki>
?- parent(Parent, Child).
Riga 135:
</nowiki></pre>
 
Quando prolog riceve una domanda con una variabile controlla tutte le linee del programma, e cerca di ''unificare'' ogni predicato con la domanda. Questo signifixa che controllera'controllerà se la domanda coincide con il predicato quando le variabili vengono istanziate in un certo modo. Prolog puo' unificare '''umano(A)''' con '''umano(john)''' mettendo insieme A e john, ma non puo' mettere insieme '''uomo(A)''' con '''umano(john)''', perche' i predicati sono diversi.
 
Per rendere le cose un po' difficili a prolog possiamo usare due predicati nella stessa domanda, per esempio:
Riga 141:
?- umano(A), parent(B,A).
</nowiki></pre>
Adesso stiamo chiedendo a prolog se c'e un umano A che ha un parente B. The comma significa ''and'', indicando che entrambi i predicati necessitano di essere veri affinche' sia vera la domanda. Per controllare questa domanda, prolog trovera'troverà un' istanza che rende la prima proposizione vera t, poi cerchera'cercherà di rendere vero il secondo predicato (con l'istanza del primo). If it can make the second predicate true, trovaera'trovaerà unaltro modo per rendere il secondo predicato vero (dopo premuto il punto e virgola) . Se non ci riesce , trovera'troverà una seconda possibilita'possibilità di rendere il primo predicato vero, prendendo in .
 
Nell'esempio precedente prolog trova '''umano(david)''' nel programma ed unifica A con david. Per verifivare il secondo predicato, crea una istanza per '''parent(B, david)'''. Se non trova nulla cerca una nuova istanza per umano(A). Poi tenta A = john. Quindi istanzia parent(B, john). Trova B = david nella linea parent(david, john) e quindi risulta
Riga 148:
B = david
 
Se premi il punto e virgola cerchera'cercherà una nuova istanza per il secondo predicato. Se fallisce trova una nuova istanza per il primo e cosi' fino alla fine del database.
 
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 e' istanziata la variabile, ie non ti importa a quale termine sia collegata, anche se e' collegata a qualcosa. Se chiedi a prolog
Riga 154:
?- parent(A, _).
</nowiki></pre>
Prolog rispondera'risponderà
 
A = david;
Riga 164:
?- abc(_,_,_).
</nowiki></pre>
Questo non sara'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 avra'avrà che ogni termine ,esista o meno, sara'sarà umano. Cosi' la domanda
<pre><nowiki>
?- umano(abc)
</nowiki></pre>
sarebbe vera . In questo contesto la variabile anonima e' usata per afferamare una proprieta'proprietà di tutti gli oggetti anziche' di uno solo . Se vogliamo affermare che un gruppo specifico di oggetti ha una verta proprieta'proprietà , abbiamo bisogno di '''regole'''.
La prossima sezione trattera'tratterà di questo.
 
== Examples ==
Riga 188:
== Regole ==
 
Siamo molto lontani da una vera e propria programmazione ,abbiamo appena definitto degli oggetti e le loro proprieta'proprietà. Il primo passo per programmare in prolog e' l'uso delle '''regole'''. With rules we state that a predicate is true, provided that other predicates are true. A rule looks like this:
 
a :- b, c, d.
Riga 204:
?- a.
</nowiki></pre>
prolog prendera'prenderà a (o obiettivo o '''goal''') a e generera'genererà i sottobiettivi o ''sub-goals'' b, c and d.Possiamo vedere che b e c sono veri, diretamente, dal momento che sono fatti, mentre d e' vera solo se e e' vera,con e sotto-obiettivo. Dal momento che anche e e' un fatto, prolog rispondera'risponderà yes.
 
== Regole con Variabili ==
Riga 226:
?- car(corvette).
 
leghera'legherà A a corvette, e otterra'otterrà i subgoal '''haruote(corvette)''' e '''hafinestrini(corvette)'''. Se proviamo queste affermazioni allora car(corvette) dev'essere vera.
Quando usiamo le variabili in un programma dobbimo ricordarci che una variabile non significa niente senza la sentenza ad essa legata. Se due affermazioni usano la stessa variabile A, non e' la stessa variabile . For example: