Otter Dimostratori Automatici di Teoremi: • Otter = Organized Techniques for Theorem-proving and Effective Research OTTER • È basato su logica del primo ordine – Esercitazione – Dipartimento di Elettronica per l’Automazione Università degli Studi di Brescia Alessandro Saetti [email protected] • Sistema semi-automatico • Funziona anche in batch mode: otter < input > output • Indirizzi Internet utili: Home Page di Otter: http://www.mcs.anl.gov/AR/otter/ Materiale per il Corso di Intelligenza Artificiale A (Prof. Alfonso Gerevini) Manuale: http://www-unix.mcs.anl.gov/AR/otter/otter3 manual.pdf Sintassi - Clausole Sintassi • Formula atomica: stringa composta da alfanumerici, • Caratteri speciali: – %: commenti – . : fine espressione – ,() : punteggiatura e simboli di raggruppamento • Nomi che iniziano con $ sono riservati (Es. $AND) Operatori Negazione Disgiunzione • Forma prefissa: • Forma infissa: Simbolo | Priorità 1 3 |( -(a), |( -(b), c) ). -a | -b | c. • Spaziatura obbligatoria prima di “–” • Tutte le clausole terminano con “.” Liste di Clausole/Formule Sintassi - Formule Operazione Negazione Congiunzione Disgiunzione Implicazione Equivalenza Simbolo & | -> <-> Priorità 1 2 3 4 4 • Tutte le formule terminano con “.” • Otter trasforma le formule in clausole Otter utilizza la strategia basata su insieme di supporto • usable: clausole/formule usate per l’inferenza • sos: clausole/formule che partecipano alla ricerca • passive: clausole/formule usate per controllare il processo in dimostrazioni difficili (sussunzioni/unit-conflict) • demodulators: uguaglianze utilizzate per la riscrittura di clausole/formule inferite Comandi e File di Input • Otter riconosce due tipi di opzioni: – flag: opzioni booleane assegnate con set e clear ES: set(binary res); – parametri: valori interi assegnati con assign ES: assign(max seconds,100). • Le liste iniziano con list(list_name)., formula_list(list_name). list name è usable, sos, demodulators, oppure passive • Le liste terminano con end_of_list. Comandi e File di Input Comando include(file name) op(precedenza,tipo,nome) make evaluable(simb,simb valutato) set(flag name) clear(flag name) assign(parameter name,integer) list(list name) Descrizione include file name nel file corrente dichiara un operatore dichiara un alias di simbolo valutato setta il flag flag name resetta il flag flag name parameter name=integer lista delle clausole formula list(list name) weight list(weight list name) lex(symbol list) lista delle formule lista dei pesi assegna un ordinamento ai simboli Modalità Automatica • Impostata tramite il flag auto: set(auto) • set(auto) DEVE essere il primo comando Esempio – Logica Proposizionale Scrivere le rappresentazioni logiche delle seguenti formule secondo la sintassi di otter. Due talpe vivono in una buca. Nessuna delle due vuole condividere la tana con l’altra. • La KB è interamente in list(usable) • Otter decide: - regole di inferenza; - strategia di ricerca; - lista sos. Regole di inferenza • Binary resolution (flag bin res) Date 2 clausole in contraddizione Otter deriva la clausola vuota. inf ermiera(Roberta),¬inf ermiera(Roberta) F alse • Unit resulting resolution (flag ur res) Il risultato è una clausola unitaria. Data una clausola con n termini e n−1 clausole unitarie le risolve in un colpo solo. ¬P (x,y)∨Q(y,z)∨¬R(u,v)∨S(x,z), P (John,M ary), ¬Q(M ary,Cats),R(Birds,M ice) S(John,Cats) • Hyper-Resolution (flag hyper res) Una clausola ha almeno un letterale negativo, mentre le altre non ne hanno. Il risultato non contiene letterali negativi. ¬P (x,y)∨Q(x)∨¬R(y) P (Spock,Data) R(z)∨S(z) Q(Spock)∨S(Data) set(auto). list(usable). % Ogni talpa vive in un buco. ViveT1B1. ViveT2B1. % Nella buca vive al piu’ una talpa. -ViveT1B1 | -ViveT2B1. end_of_list. Regole di inferenza • Paramodulation Uno degli argomenti del predicato di uguaglianza deve unificare con un sottotermine dell’altra clausola. dif f erence(two squared, b) equal(two squared, f our) dif f erence(f our, b) – Paramodulation from the given clause (flag para from): la given clause contiene un predicato di uguaglianza – Paramodulation into the given clause (flag para into): il predicato di uguaglianza non è contenuto nella given clause, ma il risultato dell’inferenza è la sostituzione di un parametro della given clause. Caratteristiche • La KB è specificata tramite clausole oppure formule del primo ordine • Forward demodulation: semplifica le clausole inferite • Backward Demodulation: semplifica le clausole esistenti • Forward Sussumption: cancella le clausole inferite • Backward Sussumption: cancella le clausole esistenti Algoritmo di Otter while (sos non vuota & nessuna dimostrazione e’ stata trovata) begin given_clause := migliore_clausola(sos); usable := usable U given_clause; sos := sos - given_clause; new_clauses := inferisci(given_clause, clause_usables) if retention_test(new_clauses) then sos:=sos U new_clauses; endwhile. • pesi e ordinamento lessicale Esempio – Dimostrazione Due talpe vivono in una buca. Nessuna delle due vuole condividere la tana con l’altra. Utilizzare OTTER per dimostrare che non è possibile una convivenza civile. given clause #1: (wt=3) 3 [] ViveT2B1. ** KEPT (pick-wt=0): 4 [hyper,3,2,1]. -----> EMPTY CLAUSE at 0.00 sec ----> 4 [hyper,3,2,1] $F. In conclusione, la dimostrazione è la seguente: 1 2 3 4 [] ViveT1B1. [] -ViveT1B1| -ViveT2B1. [] ViveT2B1. [hyper,3,2,1] $F. Esercizio 1 - Logica Proposizionale John lo sfregiato, Bill lo squartatore e Jack il duro vengono interrogati con l’accusa di aver rubato la cassetta delle elemosina della parrocchia. Jack dice che il furto e’ stato commesso da Bill; Bill si professa innocente e John afferma di non aver compiuto il furto. Sapendo che solo uno dei tre dice la verità, chi è il ladro. Scrivere le rappresentazioni logiche delle seguenti formule secondo la sintassi di OTTER ed utilizzare il dimostratore di teoremi per scoprire chi tra Bill, John e Jack ha commesso il furto. Soluzione Esercizio 1 set(ur_res). list(usable). % le testimonianze dei tre ceffi -FurtoBill | VeritaJack. FurtoBill | VeritaBill. FurtoJohn | VeritaJohn. % solo uno dei tre ceffi dice la verita -VeritaJack | -VeritaBill. -VeritaJack | -VeritaJohn. -VeritaJohn | -VeritaBill. end_of_list. Esercizio 2 - Logica Proposizionale Estensione dell’esempio delle 2 talpe a 3 talpe: Tre talpe vivono in una valle con due buche. Nessuna delle talpe vuole condividere la tana con un’altra talpa. Scrivere le rappresentazioni logiche delle seguenti formule secondo la sintassi di otter ed utilizzare il dimostratore di teoremi per dimostrare che non è possibile una convivenza civile. list(sos). -FurtoJohn. end_of_list. Soluzione Esercizio 2 set(auto). list(usable). % Ogni talpa vive in un buco. ViveT1B1 | ViveT1B2. ViveT2B1 | ViveT2B2. ViveT3B1 | ViveT3B2. % In ciascun buco vive al piu’ una talpa. -ViveT1B1 | -ViveT2B1. -ViveT1B1 | -ViveT3B1. -ViveT2B1 | -ViveT3B1. -ViveT1B2 | -ViveT2B2. -ViveT1B2 | -ViveT3B2. -ViveT2B2 | -ViveT3B2. end_of_list. Sintassi - Logica del Primo Ordine • Costanti, variabili, simboli di funzione e predicati: stringa composta da alfanumerici, • Predicati/funzioni: simbolo ( argomenti separati da , ) NO spaziatura tra simbolo di predicato/funzione e ( • Nel contesto di clausole: – Le variabili iniziano con u, v, w, x, y, z. – Se il flag prolog style variables é ON: le variabili iniziano con oppure con una lettera maiuscola • Nel contesto di formule: – Il simbolo é una variabile se e solo se è quantificato. Sintassi Operazione Quantificatore esistenziale Quantificatore universale Simbolo exists all Esercizio - Logica del Primo Ordine Priorità - Scrivere le rappresentazioni logiche delle seguenti formule secondo la sintassi di OTTER • Quantificazione richiesta in formule, da evitare in clausole • Ogni persona lavora o come infermiere oppure come insegnante • Forma prefissa: $Quantified(all, x, y, exists, z, |(P(x,y), -(Q(z)))). • Tutti gli infermieri sono maschi • Forma infissa: all x all y exists z (P(x,y) | -Q(z)). Forma semplificata: all x y exists z (P(x,y) | -Q(z)). • Tutte le persone sono o maschi o femmine • Obbligatoria parentesi dopo uno (o più) quantificatori • Spaziatura obbligatoria prima/dopo “all” e “exists” e prima “–” • =, eq, Eq, EQ sono predicati di uguaglianza • != è il predicato di disuguaglianza Soluzione Esercizio set(hyper_res). formula_list(usable). % Ogni persona lavora come infermiera oppure come insegnante all x (Lavora(x,Insegnante) <-> -Lavora(x,Infermiere)). • Steve è un maschio e Roberta è una femmina • Roberta non è una insegnante Utilizzare OTTER per mostrare che Roberta insegna. Esercizio su Circuiti Digitali (AND+OR) Scrivere la rappresentazione logica del seguente dispositivo secondo la sintassi di OTTER. C1 % Tutti gli infermieri sono maschi all x (Lavora(x,Infermiere) -> Maschio(x)). % Tutte le persone sono maschi oppure femmine all x (-Maschio(x) <-> Femmina(x)). O1 A1 % Steve e’ un maschio e Roberta e’ una femmina Femmina(Roberta). Maschio(Steve). end_of_list. list(sos). -Lavora(Roberta, Insegnante). % Contraddizione end_of_list. Utilizzare OTTER per dimostrare che a fronte dell’ingresso 1, 0, 1 l’uscita è 1. Esercizio su Circuiti Digitali (AND+OR) Esercizio su Circuiti Digitali (AND+OR) set(auto). formula_list(usable). % Conoscenza del dominio dei circuiti all g (tipo(g,OR) ->((signal(out(1,g))=1)<->(signal(in(1,g))=1 | signal(in(2,g))=1))). all g (tipo(g,AND) ->((signal(out(1,g))=0)<->(signal(in(1,g))=0 | signal(in(2,g))=0))). all x y (conn(x,y) <-> conn(y,x)). all x y (conn(x,y) -> eq(signal(y),signal(x))). all x ((signal(x)=1) <-> -(signal(x)=0)). -(1=0). % Porte logiche tipo(A1,AND). tipo(O1,OR). % Connessioni conn(in(1,C1),in(1,O1)). conn(in(2,C1),in(2,O1)). conn(in(3,C1),in(2,A1)). conn(out(1,O1),in(1,A1)). conn(out(1,A1),out(1,C1)). % Segnali di Input/Output (signal(in(1,C1))=1). (signal(in(2,C1))=0). (signal(in(3,C1))=1). -(signal(out(1,C1))=1). end_of_list. Suggerimento Esercizio Esercizio - Logica del Primo Ordine • Informazione esplicite del problema: – Il gestore non ha fratelli. Mario ha fratelli. Scrivere le rappresentazioni logiche delle seguenti formule secondo la sintassi di OTTER Gianni, Mario e Diego sono gestore, cuoco e cameriere di un ristorante, non nell’ordine considerato. Gianni, amico del fratello di Mario, è più giovane di Mario e ha gli occhi neri. Il cameriere ha gli occhi azzurri, mentre il gestore è figlio unico ed è il più anziano dei tre. – Il cameriere ha gli occhi azzurri. Gianni non ha occhi azzurri. – Il gestore è il più vecchio. Gianni non è il più vecchio. • Informazione implicite del problema: – Due persone non possono fare lo stesso lavoro. – Ogni persona lavora come cuoco o cameriere o gestore. – Gianni, Mario e Diego sono persone differenti. Utilizzare OTTER per mostare quale è il lavoro di ciascuno. • Unica soluzione possibile: Mario fa il cameriere, Gianni il cuoco e Diego il gestore. Soluzione Esercizio set(auto). formula_list(usable). % Il gestore non ha fratelli all x y (lavora(x,gestore) -> -fratello(x,y)). % Mario ha fratelli exists y (fratello(Mario,y)). Soluzione Esercizio % Gianni non e’ il piu’ vecchio -piuvecchio(Gianni). % Due persone non fanno lo stesso lavoro all x y z (lavora(x,z) & -(x=y) -> -lavora(y,z)). % Ogni persona deve fare almeno un lavoro all x (lavora(x,cameriere) | lavora(x,cuoco) | lavora(x,gestore)). % Il cameriere ha gli occhi azzurri all x (lavora(x,cameriere) -> occhiazzurri(x)). % Gianni non ha occhi azzurri -occhiazzurri(Gianni). % I simboli di costante fanno riferimento ad oggetti diversi -(Gianni=Mario). -(Gianni=Diego). -(Mario=Diego). % Contraddizione -lavora(Mario,cameriere) | -lavora(Gianni,cuoco) | -lavora(Diego,gestore). end_of_list. % Il gestore e’ il piu’ vecchio all x (lavora(x,gestore) -> piuvecchio(x)). Esercizio su Circuiti Digitali R&N Scrivere la rappresentazione logica del seguente dispositivo C1 secondo la sintassi di OTTER. C1 X1 X2 A2 O1 A1 Utilizzare OTTER per dimostrare che a fronte dell’ingresso 1, 0, 1 l’uscita è 0, 1. Esercizio su Circuiti Digitali R&N set(auto). formula_list(usable). % Conoscenza del dominio dei circuiti all g (tipo(g,OR) ->((signal(out(1,g))=1)<->(signal(in(1,g))=1 | signal(in(2,g))=1))). all g (tipo(g,AND) ->((signal(out(1,g))=0)<->(signal(in(1,g))=0 | signal(in(2,g))=0))). all g (tipo(g,XOR) ->((signal(out(1,g))=1)<->(-(signal(in(1,g))=signal(in(2,g)))))). all g (tipo(g,NOT) -> (-(signal(out(1,g))=signal(in(1,g))))). all x y (conn(x,y) <-> conn(y,x)). all x y (conn(x,y) -> eq(signal(y),signal(x))). all x ((signal(x)=1) <-> -(signal(x)=0)). -(1=0). % Porte logiche tipo(X1,XOR). tipo(X2,XOR). tipo(A1,AND). tipo(A2,AND). tipo(O1,OR). Esercizio su Circuiti Digitali R&N % Connessioni conn(out(1,X1),in(1,X2)). conn(out(1,X1),in(2,A2)). conn(out(1,A2),in(1,O1)). conn(out(1,A1),in(2,O1)). conn(out(1,X2),out(1,C1)). conn(out(1,O1),out(2,C1)). conn(in(1,C1),in(1,X1)). conn(in(1,C1),in(1,A1)). conn(in(2,C1),in(2,X1)). conn(in(2,C1),in(2,A1)). conn(in(3,C1),in(2,X2)). conn(in(3,C1),in(1,A2)). % Segnali di Input/Output (signal(in(1,C1))=1). (signal(in(2,C1))=0). (signal(in(3,C1))=1). (signal(out(1,C1))=1). (signal(out(2,C1))=1). end_of_list.