Logică ====== propoziție - interpretare. "Bogdan este un student foarte bun". - val de adevăr depinde de interpretarea conceptelor - cine este Bogdan, ce înseamnă un student foarte bun, etc Ne propunem să putem face demonstrații indiferent de interpretare P ^ ~P este fals, indiferent de interpretarea lui P Demonstrare simbolică -- fără a ne uita la fiecare posibilă interpretare. Bazată pe sintaxă, nu pe semantică p ^ q ^ t => c ~(p ^ q ^ t) V c ~p V ~q V ~t V c ~(p ^ q ^ t ^ ~c) ( p => q echivalent cu ~q => ~p și cu ~p V q (este echivalent cu q => p doar dacă p <=> q) ) ( fals implică orice p fals și p => q, q poate avea orice valoare de adevăr ) ( ~(p ^ q) echivalent cu ~p V ~q ) Logica cu predicate de ordinul I ================================ * termeni -- orice poate fi argument al unui predicat * constante * variabile * funcții -- aplicate peste termeni * propoziții * simple -- atomi -- aplicarea unui predicat pe niște argumente (termeni) * compuse -- aplicări de operatori logici peste alte propoziții - aplicări de cunatificatori Traducere din limbaj natural: - ce concepte am? - constante Ioana - variabile prietenul deștept al Ioanei, x - ce relații între concepte am? - funcții -- lucruri care întorc o valoare. E.g. sora(X) - predicate E.g. prieten/2, deștept/1 Există x . Prieten(Sora(Ioana), x) ^ Deștept(x) Altă modelare: Există y . Sora(Ioana, y) ^ (Există x . Prieten(y, x) ^ Deștept(x)) “Vrabia mălai visează.” ~~ "Toate vrăbiile visează mălai" ~~ "Orice vrabie visează mălai" visează -- predicat mălai -- constantă x -- variabilă, care este vrabie Oricare x . vrabie(x) => visează(x, mălai) Dacă x este varbie, *atunci* x visează mălai '=>' ~~ concluzia este adevărată de fiecare dată când premisa este adevărat '.' ~~ "astfel încât" NU: Oricare x . vrabie(x) ^ visează(x, mălai) ~~ "Toți sunt vrăbii și visează mălai" Oricare x . p(x) ^ q(x) <=> Oricare x . p(x) ^ Oricare x . q(x) “Unele vrăbii visează mălai.” Există x . vrabie(x) ^ visează(x, mălai) NU: Există x . vrabie(x) => visează(x, mălai) - corect dacă x este vrabie - *fals implică orice* ( p=>q <=> ~p V q ) - impicația este adevărată și pentru un x care nu este vrabie, fie că visează mălai sau nu - deci propoziția este adevărată oricând, atâta timp cât există x-și care nu sunt vrăbii *De obicei* folosim * implicația împreună cu oricare (pentru a exprima reguli) și * conjucția împreună cu există (pentru a exprima proprietățile unor cazuri particulare) “Nicio vrabie nu visează mălai.” ~Există x . vrabie(x) ^ visează(x, mălai) sau Oricare x . ~ (vrabie(x) ^ visează(x, mălai)) sau Oricare x . ~vrabie(x) V ~visează(x, mălai)) sau Oricare x . vrabie(x) => ~visează(x, mălai) ( ~Există x . p(x) <=> Oricare x . ~p(x) Există x . ~p(x) <=> ~Oricare x . p(x) ) Un alt exemplu la necumutativitate: Există y . Oricare x . visează(x, y) ~~ "Există ceva (y-ul) la care visează toată lumea. Test: ~(oricare x . nor(x) => alb(x) ) ^ (există y . mare(y) ^ ~negru(y)) există x . există y . (nor(x) ^ ~alb(x)) ^ (mare(y) ^ ~negru(y)) Sunt două propoziții același lucru? (sunt echivalente?) Pot ști prin transformare la o formă normală. Dacă două propoziții au aceeași formă normală, atunci ele sunt echivalente. - FNC este o mulțime de clauze / conjuncție de clauze / conjuncție de disjuncții de literali - Clauza este o mulțime de literali cu semnificație disjunctivă { prieten ( x , y ), ¬ doctor ( x )} ~~ prieten(x,y) V ~doctor(x) - Clauza Horn corespunde unei implicații cu o singură concluzie - nu orice propoziție poate fi reprezentată ca o clauză Horn Elimin cuantificare existențială prin Skolemizare Există x . p(x) aleg o constantă (nouă) c pentru care p(c) este adevărat (constantă Skolem) e.g. există x . există y . (nor(x) ^ ~alb(x)) ^ (mare(y) ^ ~negru(y)) skolemizez ca: nor(norul-negru) ^ ~alb(norul-negru) ^ mare(marea-roșie) ^ ~negru(marea-roșie) Oricare x . Există y . visează(x, y) -> oricine visează la ceva (acel ceva posibil specific lui x) Nu pot pune Oricare x . visează(x, cy) -> înseamnă că toți visează la același lucru cy construiesc o funcție Skolem fy(x) -> Oricare x . visează(x, fy(x)), unde fy(x) întoarce acel lucru la care visează x “Cine rezolvă toate laboratoarele este apreciat de cineva.” Oricare x . (Oricare y . lab(y) => rezolvă(x, y)) => Există z . apreciază(z, x) 1. Oricare x . ~ (Oricare y . ~lab(y) V rezolvă(x, y)) V (Există z . apreciază(z, x)) 2. ~Oricare y. p(y) <=> Există y . ~p(y) Oricare x . (Există y . ~(~lab(y) V rezolvă(x, y))) V (Există z . apreciază(z, x)) ~(p V q) <=> ~p ^ ~q Oricare x . (Există y . lab(y) ^ ~rezolvă(x, y)) V (Există z . apreciază(z, x)) 3.- 4. Oricare x . Există y . Există z . (lab(y) ^ ~rezolvă(x, y)) V apreciază(z, x) 5. Oricare x . (lab(lab-pe-care-nu-l-a-rezolvat(x)) ^ ~rezolvă(x, lab-pe-care-nu-l-a-rezolvat(x))) V apreciază(cine-apreciază(x), x) 6. (lab(lab-pe-care-nu-l-a-rezolvat(x)) ^ ~rezolvă(x, lab-pe-care-nu-l-a-rezolvat(x))) V apreciază(cine-apreciază(x), x) 7. ( lab(lab-pe-care-nu-l-a-rezolvat(x)) V apreciază(cine-apreciază(x), x) ) ^ ( ~rezolvă(x, lab-pe-care-nu-l-a-rezolvat(x)) V apreciază(cine-apreciază(x), x) ) "lab-pe-care-nu-l-a-rezolvat(x) este un laborator sau cineva îl apreciează pe x și x nu a rezolvat laboratorul sau cineva îl apreciază pe x" 8. { { lab(lab-pe-care-nu-l-a-rezolvat(x)), apreciază(cine-apreciază(x), x) }, { ~rezolvă(x, lab-pe-care-nu-l-a-rezolvat(x)), apreciază(cine-apreciază(x), x) } } Ne dorim să ajungem la o conjuncție între disjuncții de literali * eliminăm implicațiile, cuantificatori * aduse negațiile lângă atomi și eventual distribuirea disjuncției * (redenumire de variabile) * p => q <=> ~p V q * dulitatea cuantificatorilor * deMorgan * skolemizare * dacă cuantificatorul existențial *nu* este sub niciun cuantificator universal -> înlocuim variabila cu o constantă (alta decât cele existente) * dacă cuantificatorul existențial este sub unul sau mai mulți cuantificatori universali -> înlocuim variabila cu o funcție, care are ca argumente variabilele cuantificate universal de deasupra. Orice om are o mamă Oricare x . om(x) => (Există y . mama(x, y)) Oricare x . ~om(x) V (Există y . mama(x, y)) Oricare x . Există y . ~om(x) V mama(x, y) skolemizare greșită: Oricare x . ~om(x) V mama(x, Mama) -> greșit, toți au aceeași mamă skolemizare corectă: Oricare x . ~om(x) V mama(x, f_mama(x)) -> corect, mama depinde de fiecare om apoi: ~om(x) V mama(x, f_mama(x)) mulțimea de clauze: { { ~om(x), mama(x, f_mama(x)) } } (1 singură clauză) Pentru exemplul de pe S11:40: ∀x.∀y.( (p ( x ) ∧ q ( y )) ∨ r ( f_z ( x , y ))) ( (p ( x ) ∧ q ( y )) ∨ r ( f_z ( x , y ))) distribuim: ( (p ( x ) ∧ q ( y )) ∨ r ( f_z ( x , y ))) ( p(x) ∨ r(f_z(x, y)) ) ∧ ( q(y) ∨ r(f_z(x, y)) ) { { p(x), r(f_z(x, y)) }, { q(y), r(f_z(x, y)) } } Rezoluție ========= * funcționează peste o mulțime de clauze p V q V r ~r V t V s amândouă sunt premise, deci le considerăm adevărate. Avem două variante pentru r: r este fals, sau r este adevărat. * dacă r este fals, atunci sigur p V q este adevărat * dacă r este adevărat, atunci sigur t V s este adevărat => este adevărat că p V q V t V s p V q V r ~r V t V s ------------ p V q V t V s Dacă am două clauze C1 și C2, iar C1 conține L1 și C2 conține L2, și L1 = ~L2 (cele două clauze *rezolvă*, atunci este adevărat (C1 \ {L1}) V (C2 \ {L2}) Facem sau între C1 și C2 și eliminăm L1 și L2, literali care *au rezolvat*. În LPOI: Orice om are o inimă. Marcel este om. Oricare x . om(x) => are_inimă(x) om(Marcel) ? are_inimă(Marcel) În loc să demonstrăm concluzia din premise, vom folosi reducerea la absurd: este contradictoriu să avem adevărate în același timp premisele și negarea concluziei. Înainte să începem procesul de rezoluție, construim o mulțime de clauze formată din premise și din negarea concluziei. La pasul de rezoluție, doi literali rezolvă dacă atomii lor *unifică* (același predicat și argumente care unifică). În literalii care rămân în rezultatul pasului de rezoluție trebuie efectuată substituția sub care au unificat literalii care au rezolvat. Ținta este să obțin clauza vidă. O clauză este o disjuncție (sau) de literali (atom sau atom negat). ~iepure(z) V mrapid(Harry, z) - ca disjuncție {~iepure(z), mrapid(Harry, z) } - ca mulțime Mulțimea de clauze: 1: ~om(x) V are_inimă(x) 2: om(Marcel) 3: ~are_inimă(Marcel) 1+3: ~om(x) V are_inimă(x) ~are_inimă(Marcel) ---------------------- are_inimă(x) rezolvă cu ~are_inimă(Marcel), pentru că are_inimă(x) unifică cu are_inimă(Marcel), sub substituția { x <- Marcel } ~om(x) [ Marcel / x ] 4: ~om(Marcel) 2+4: om(Marcel) ~om(Marcel) ----------- {} - clauza vidă -- echivalentă cu o contradicție (se notează cu un pătrat) Exemplu ------- ∀x. ∀y . cal(x) ^ câine(y) => mrapid(x, y) ∃x . ogar(x) ^ ( ∀ y. iepure(y) => mrapid(x, y) ) cal(Harry) ^ iepure(Ralph) ? mrapid(Harry, Ralph) Bun simț: ∀ x . ogar(x) => câine(x) ∀ x,y,z . mrapid(x, y) ^ mrapid(y, z) => mrapid(x, z) 1. ~cal(x) V ~câine(y) V mrapid(x, y) 2. ogar(Greg) 3. ~iepure(y) V mrapid(Greg, y) 4. cal(Harry) 5. iepure(Ralph) 6. ~mrapid(Harry, Ralph) negarea concluziei, pentru reducere la absurd 7. ~ogar(x) V câine(x) 8. ~mrapid(x, y) V ~mrapid(y, z) V mrapid(x, z) 1+4 ~cal(x) V ~câine(y) V mrapid(x, y) cal(Harry) ----------------- { x = Harry } 9. ~câine(y) V mrapid(Harry, y) 7+9 ~ogar(x) V câine(x) ~câine(y) V mrapid(Harry, y) ----------------------------- { x = y } 10. ~ogar(x) V mrapid(Harry, x) 10+8 ~ogar(t) V mrapid(Harry, t) // am redenumit variabila pentru coerență ~mrapid(x, y) V ~mrapid(y, z) V mrapid(x, z) -------------------------------------------- { x = Harry, y = t } 11. ~ogar(t) V ~mrapid(t, z) V mrapid(Harry, z) 3+11 ~iepure(y) V mrapid(Greg, y) ~ogar(t) V ~mrapid(t, z) V mrapid(Harry, z) -------------------------------------------- { t = Greg, y = z } 12. ~iepure(z) V ~ogar(Greg) V mrapid(Harry, z) 12+2 ~iepure(z) V ~ogar(Greg) V mrapid(Harry, z) ogar(Greg) ---------------------------------- {} 13. ~iepure(z) V mrapid(Harry, z) 13+6 ~iepure(z) V mrapid(Harry, z) ~mrapid(Harry, Ralph) -------------------------- { z = Ralph } 14. ~iepure(Ralph) 14+5 iepure(Ralph) ~iepure(Ralph) ---------------- {} - clauza vidă = contradicție = am demonstrat = q.e.d.