Dimostratori Automatici di Teoremi: Otter Sintassi Sintassi

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.