Prolog/Primi passi: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
BimBot (discussione | contributi)
m Robot: Automated text replacement (-([^'])a'([^']) +\1à\2)
BimBot (discussione | contributi)
m Robot: Automated text replacement (-([^'])e'([^']) +\1è\2)
Riga 5:
Umano(john).
 
Sii preciso, la maiuscola e'è importante in prolog, come il punto. Questo 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 22:
['c:/my documents/prolog/prolog1.pl'].
 
L'interprete dovrebbe comunicarti che il file e'è stato caricato correttamente. Se non fosse cosi' consulta il file di aiuto o i documenti o il manuale a tua disposizione. Dopo alcune informazioni vedrai comparire:
 
?-
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 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:leggibilità|leggibilità]]. Potremmo sostituire facilmente la parola ''umano'' con qualsiasi altra parola e l'interprete non ne vedrebbe la differenza.
 
Riga 91:
No.
 
Questo 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 risponderà No perche'perchè non trova niente nel database.
 
== Variabili ==
 
Quello che stiamo facendo non e'è un vero e prorio linguaggio espressivo. Possiamo aumentare l'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 tenterà di legare un termine alla variabile. In other words, tu stai chiedendo a prolog di cosa ha bisogno A affinche'affinchè umano(A) sia vera.
 
?- umano(A).
Riga 112:
A = john
 
Verà perche'perchè il database contiene la linea '''umano(john)'''. Se premi invio, prolog risponderà Yes e rimanderà il cursore. Se premi il punto e virgola (';') prolog mostrerà il resto delle possibilità:
 
A = suzie ;
Riga 119:
 
Dopo eliza, prolog risponde No, indicando che le possibilità ulteriori si sono esaurite.
Se prolog viene interrogato con piu' di una variabile esso 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 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'perchè 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'affinchè sia vera la domanda. Per controllare questa domanda, prolog troverà un' istanza che rende la prima proposizione vera t, poi cercherà di rendere vero il secondo predicato (con l'istanza del primo). If it can make the second predicate true, trovaerà unaltro modo per rendere il secondo predicato vero (dopo premuto il punto e virgola) . Se non ci riesce , troverà una seconda 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 150:
Se premi il punto e virgola 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
<pre><nowiki>
?- parent(A, _).
Riga 172:
?- umano(abc)
</nowiki></pre>
sarebbe vera . In questo contesto la variabile anonima e'è usata per afferamare una proprietà di tutti gli oggetti anziche'anzichè di uno solo . Se vogliamo affermare che un gruppo specifico di oggetti ha una verta proprietà , abbiamo bisogno di '''regole'''.
La prossima sezione tratterà di questo.
 
Riga 184:
</center>
 
Questa sezione tratta delle regole cioe'cioè di un modo generico pers tabili re se un geneerico predicato e'è vero.
 
== Regole ==
 
Siamo molto lontani da una vera e propria programmazione ,abbiamo appena definitto degli oggetti e le loro 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.
 
Questo significa che a e'è vera se b, c e d sono vere. Se abbiamo il seguente database
 
a :- b, c, d.
Riga 200:
e.
 
e chiediamo a prolog se a e'è vera
<pre><nowiki>
?- a.
</nowiki></pre>
prolog prenderà a (o obiettivo o '''goal''') a e 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 risponderà yes.
 
== Regole con Variabili ==
Riga 212:
car(corvette) :- haruote(corvette), hafinestrini(corvette).
 
stabilisce che una corvette e'è un'auto se ha ruote e finestrini. Questa non e'è una affermazione molto utile, potremmo semplicemente stabilire che una macchina e'è una corvette e'è una macchina con
car(corvette).
 
Noi possiamo comunque usare le variabili nelle regole. Cosi' peresempio possiamo stabilire che un oggetto e'è una macchina ogniqualvolta abbia ruote e finestrini:
 
car(A) :- haruote(A), hafinestrini(A).
Riga 222:
hafinestrini(corvette).
 
La prima linea stabilisce che affinche'affinchè auto(A) sia vera, ha ruote(A) e ha finestrini(A) devono essere veri. Se chiediamo a prolog se la corvette e'è una macchina con
 
?- car(corvette).
 
legherà A a corvette, e 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:
 
bird(A) :- hapiume(A).
Riga 251:
mother(X,Y) :- parent(X,Y), woman(X).
 
Chiediamo a prolog chi e'è il padre di eliza:
?- father(X, eliza).