Wnioskowanie w systemach sztucznych • Wnioskowanie dedukcyjne lub niezawodne jest realizowane zgodnie z zasadami logiki formalnej • Wnioskowanie redukcyjne zakładające, że przesłanka wynika z konkluzji nie jest realizowane zgodnie z zasadami logiki formalnej i w związku z tym jest zawodne Zasada rezolucji | A B C | C D E ____________ | A B D E rezolwenta Rachunek predykatów (przykład) Fakt1: część(w001,wałek) Fakt2: część(p04,panewka) Fakt3: twardość(w001,wysoka) Reguła1: współpracują(X1,X2) if część(X1,wałek) and część(X2,panewka) Reguła2: twardość (X2,X3) if współpracują (X1,X2) and twardość(X1,X3) wniosek Fakt: twardość(p04,wysoka) Dedukowanie | czesc (w001, walek ) ( A) ( p04, panewka) ( B) • Podstawiamy X1=w001, X2=p04 wspolpracu ja( w001, p 04) (C ) | wspolpracu ja(w001, p04) (C ) twardosc(w001, wysoka) ( D) twardosc( p 04, wysoka) ( E ) __________________________ | czesc (w001, walek ) ( A) ( p04, panewka) ( B) twardosc( w001, wysoka) ( D) twardosc( p 04, wysoka) ( E ) Klauzule • Literał – formuła postaci ~a lub a, gdzie a jest dowolna formułą atomową • Literały ~a i a nazywamy literałami komplementarnymi • Klauzula – alternatywa dowolnej skończonej liczby literałów (formuła bez kwantyfikatorów) • Każdy zbiór poprawnie zbudowanych formuł można przekształcić w zbiór klauzul Klauzule Horna • Klauzula Horna to klauzula , która ma jeden literał pozytywny • Pozytywna klauzula Horna: 1 n , n N • może być w sposób równoważny przedstawiona jako: 1 n Klauzule Horna • Z rachunku kwantyfikatorów mamy, że: | 1 n • wtedy i tylko wtedy 1 n | • Klauzula | 1 n jest tezą w rachunku kwantyfikatorów wtedy i tylko wtedy, gdy prawa jej strona wynika logicznie z lewej Klauzule Horna - zapis informatyków B1 if A1 and A2 współpracują(X1,X2) if część(X1,wałek) and część(X2,panewka) Wnioskowanie dedukcyjne • reguła modus ponens (reguła odrywania): ( A B ), A B |— A B |— A |— B Wnioskowanie dedukcyjne |— Jeżeli „X jest studentem”, to „X zdał maturę”. |— „X jest studentem”. |— „X zdał maturę”. |— Jeżeli „X jest studentem”, to „X zdał maturę”. |— „X nie jest studentem”. |— „X nie zdał matury”. |— Jeżeli „X jest studentem”, to „X zdał maturę”. |— „X zdał maturę”. |— „X jest studentem”. Wnioskowanie dedukcyjne • reguła modus tollens: ( A B ), B A |— A B |— ¬B |— ¬A Wnioskowanie dedukcyjne |— Jeżeli „X jest studentem”, to „X zdał maturę”. |— „X nie zdał matury”. |— „X nie jest studentem”. Wnioskowanie redukcyjne • schematy wnioskowania: ( A B ), A B |— A B |— ¬A |— ¬B ( A B ), B A |— A B |— B |— A Wnioskowanie redukcyjne |— Jeżeli „X jest studentem”, to „X zdał maturę”. |— „X nie jest studentem”. |— „X nie zdał matury”. |— Jeżeli „X jest studentem”, to „X zdał maturę”. |— „X zdał maturę”. |— „X jest studentem”. Metody wnioskowania • Wnioskowanie progresywne („w przód”) • Wnioskowanie regresywne („wstecz”) • Wnioskowanie mieszane Przykład – przewidywanie bankructwa • Oceniamy zagrożenie pewnej firmy bankructwem • Pod uwagę bierzemy jego sytuację ekonomiczną (zadłużenie, rentowność) oraz sytuację rynkową (atrakcyjność oferty, zagrożenie ze strony konkurencji) Typy i zmienne TYPES Ocena = "zły" , "dobry" OcenaZagrozenia = "wysokie" , "niskie" , "brak" VARIABLES Zadluzenie: Ocena Rentownosc: Ocena OcenaEkonomiczna: Ocena AtrakcyjnoscOferty: Ocena SytuacjaKonkurencyjna: Ocena OcenaRynkowa: Ocena ZagrozenieBakructwem: OcenaZagrozenia RULE R9 IF OcenaEkonomiczna = "zły" AND OcenaRynkowa = "zły" THEN ZagrozenieBakructwem = "wysokie" RULE R10 IF OcenaEkonomiczna = "zły" AND OcenaRynkowa = "dobry" THEN ZagrozenieBakructwem = "niskie" RULE R11 IF OcenaEkonomiczna = "dobry" AND OcenaRynkowa = "zły" THEN ZagrozenieBakructwem = "niskie" RULE R12 IF OcenaEkonomiczna = "dobry" AND OcenaRynkowa = "dobry" THEN ZagrozenieBakructwem = "brak" RULE R1 IF Zadluzenie = "zły" AND Rentownosc = "zły" THEN OcenaEkonomiczna = "zły" RULE R2 IF Zadluzenie = "zły" AND Rentownosc = "dobry" THEN OcenaEkonomiczna = "zły" RULE R3 IF Zadluzenie = "dobry" AND Rentownosc = "zły" THEN OcenaEkonomiczna = "dobry" RULE R4 IF Zadluzenie = "dobry" AND Rentownosc = "dobry" THEN OcenaEkonomiczna = "dobry" RULE R5 IF AtrakcyjnoscOferty = "zły" AND SytuacjaKonkurencyjna = "zły" THEN OcenaRynkowa = "zły" RULE R6 IF AtrakcyjnoscOferty = "zły" AND SytuacjaKonkurencyjna = "dobry" THEN OcenaRynkowa = "dobry" RULE R7 IF AtrakcyjnoscOferty = "dobry" AND SytuacjaKonkurencyjna = "zły" THEN OcenaRynkowa = "zły" RULE R8 IF AtrakcyjnoscOferty = "dobry" AND SytuacjaKonkurencyjna = "dobry" THEN OcenaRynkowa = "dobry" Wnioskowanie wprzód Wnioskowanie wprzód Wnioskowanie wprzód Wnioskowanie wprzód • Zaczynamy od faktu ‘Zadłużenie = zły’ • Szukamy odpowiednich reguł RULE R1 IF Zadluzenie = "zły" AND Rentownosc = "zły" THEN OcenaEkonomiczna = "zły" • Sprawdzamy, czy fakt ‘Rentownosc = zły’ Wnioskowanie wprzód • Fakt nie jest prawdziwy regułę zaznaczamy jako wykorzystaną i szukamy kolejnej RULE R2 IF Zadluzenie = "zły" AND Rentownosc = "dobry" THEN OcenaEkonomiczna = "zły" • Fakt ‘Rentownosc = dobry’ jest prawdziwy Wnioskowanie wprzód • „Odpalamy” regułę, rejestrujemy nowy fakt ‘OcenaEkonomiczna = zły’ i zapisujemy do stosu faktów • Szukamy kolejnej reguły, w przesłankach której mamy fakt ‘Zadłużenie = zły’ • Takiej reguły już nie ma – usuwamy fakt ze stosu faktów i pobieramy kolejny Wnioskowanie wprzód • Załóżmy, że jest to fakt ‘Rentowność = dobry’ • Wśród „niewykorzystanych” reguł poszukujemy odpowiedniej: RULE R4 IF Zadluzenie = "dobry" AND Rentownosc = "dobry" THEN OcenaEkonomiczna = "dobry" Wnioskowanie wprzód • Sprawdzamy czy fakt ‘Zadłużenie = dobry’ jest prawdziwy • Ponieważ nie jest, regułę zaznaczmy jako wykorzystaną i szukamy kolejnej odpowiedniej • Nie ma już żadnej takiej reguły – niczego nowego już nie wydedukujemy • Usuwamy fakt ze stosu i pobieramy kolejny Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz Wnioskowanie wstecz • Stawiamy hipotezę, np. ‘ZagrożenieBankructwem = brak’ • Silnik szuka reguł, w których konkluzją jest taki fakt: RULE R12 IF OcenaEkonomiczna = "dobry" AND OcenaRynkowa = "dobry" THEN ZagrozenieBakructwem = "brak" Wnioskowanie wstecz • Sprawdzamy, czy prawdziwe są przesłanki • Pierwsza to ‘OcenaRynkowa = dobry’ • Szukamy reguły, w której występuje taka konkluzja: RULE R8 IF AtrakcyjnoscOferty = "dobry" AND SytuacjaKonkurencyjna = "dobry" THEN OcenaRynkowa = "dobry" Wnioskowanie wstecz • Sprawdzamy, czy prawdziwe są przesłanki • Pierwsza to ‘SytuacjaKonkurencyjna = dobry’ • Szukamy reguły, w której występuje taka konkluzja – nie ma takiej reguły • Silnik pyta o wartość logiczną tego faktu • Jeżeli fakt jest prawdziwy to weryfikujemy kolejną przesłankę, jeśli nie to szukamy kolejnej reguły, która mogłaby potwierdzić, że ‘OcenaRynkowa = dobry’ Wnioskowanie mieszane - przykład Dane jeżeli InneCechyMateriału_są_dobre i Wytrzymałość_jest_dobra wtedy Materiał_jest_dobry Dane Dane Dane Dane Start i pierwsze kroki 1. Zakładamy, że wytrzymałość jest dobra 2. Szukamy wszystkich reguł, dla których zdanie jest przesłanką Kolejne kroki 3. Analizujemy pierwszą regułę i ustalamy, że ustalenie jej wartości wymaga oceny zdania: InneCechyMateriału_są_dobre 4. Sprawdzamy, czy znamy wartość zdania 5. Jeżeli nie, przeszukujemy konkluzje wszystkich reguł poszukując zdania 6. Jeżeli nie znajdujemy reguły to po prostu pytamy o zdanie Kolejne kroki 7. Załóżmy, że zdanie jest fałszywe 8. Zaznaczamy regułę jako odpaloną i powtarzamy, kroki 4, 5 i 6 dla kolejnej reguły 9. Jeżeli żadna reguła nie może być odpalona kończymy wnioskowanie 10. Załóżmy jednak że zdanie InneCechyMateriału_są_złe jest prawdziwe Kolejne kroki 11. Odpalamy regułę: jeżeli InneCechyMateriału_są_złe i Wytrzymałość_jest_dobra wtedy Materiał_jest_średni • i przyjmujemy, że zdanie Materiał_jest_średni jest prawdziwe Kolejne kroki 12. Szukamy wszystkich reguł, dla których zdanie jest przesłanką Kolejne kroki 13. Realizujemy kroki 3 do 9 dla zaznaczonych reguł 14. Załóżmy, że zdanie Powtarzalność_jest_dobra jest prawdziwe 15. Ustalamy, że zdanie Jakość_tak jest prawdziwe 16. Wracamy do punktu 12 Kolejne kroki Kolejne kroki 17. Załóżmy, że ustalamy wartość zdania Ekonomia_jest_dobra Kolejne kroki 18. Musimy ustalić wartość zdań: • Cena_jest_dobra i WarunkiPłatności_są_dobre 19. Powtarzamy kroki 3 do 6 dla obu zdań WybranyStart = wybierz zmienną startową() dodaj WybranyStart do StosZmiennychWprzod while nie pusty StosZmiennychWprzod { AktualnaZmienna = zdejmij ze StosZmiennychWprzod for each Wyrazenie in WyrazeniaZwiazaneZeZmienna(Aktualna _wyrazenie = EwaluujWyrazenie(Wyrazenie) for each Przeslanka in PrzeslankiDlaKtorychWyrazenieJestLewaStrona(_wyrazenie) { { WyrazenieZPrawejStrony = ZnajdzWyrazenieZPrawejStrony(Przeslanka) if (WartoscWyrazeniaZPrawejStrony == null) { EwaluujWyrazenie(WyrazenieZPrawejStr } EwaluujPrzeslanke(Przeslanka) ZmienWartoscPrzeslanki(Przeslanka) if (WartoscLogicznaPrzeslanki == true) { dodaj Przeslanka do StosPrzeslanek } for each Przeslanka in PrzeslankiDlaKtorychWyrazenieJestPrawaStrona(Wyrazenie) { WyrazenieZLewejStrony = ZnajdzWyrazenieZLewejStrony(Przeslanka) if (WartoscWyrazeniaZLewejStrony == null) { EwaluujWyrazenie(WyrazenieZLewejStro } EwaluujPrzeslanke(Przeslanka) ZmienWartoscPrzeslanki(Przeslanka) if (WartoscLogicznaPrzeslanki == true) { dodaj Przeslanka do StosPrzeslanek } while nie pusty StosPrzeslanek { AktualnaPrzeslanka = zdejmij ze StosPrzeslanek for each Regula in RegulyZwiazaneZPrzeslanka(Aktu { if SprawdzRegule(Regula) { EwaluujRegule(Regula) } } } } EwaluujWyrazenie(X) for each Zmienna in ZmienneZwiazaneZWyrazeniem(X) { if (WartoscZmiennej == null) // wartość zmiennej nie jest znana { WartoscZmiennej = EwaluujZmienna(Zmienna) } dodaj do ListaZmiennych WartoscZmiennej } return EwaluatorTekstuWyrazenia(X, ListaZmiennych) EwaluujPrzeslanke(X) Przeslanka = SzukajPrzeslanke(X) // pełny opis przesłanki WartoscWyrazeniaZLewejStrony = EwaluujWyrazenie(LewaStronaPrzeslanki) WartoscWyrazeniaZPrawejStrony = EwaluujWyrazenie(PrawaStronaPrzeslanki) return EwaluatorLogiczny(WartoscWyrazeniaZLewejStrony, WartoscWyrazeniaZPrawejStrony, Operator) EwaluujZmienna(X) Zmienna = SzukajZmienna(X) if (KategoriaZmiennej == intermediate) { return WnioskujWstecz(X) } else { Wyrazenie = SzukajWyrazeniaKonkluzjiOkreslajacejZmienna(X) Akcja = SzukajAkcjiDlaWyrazenia(Wyrazenie) return EgzekutorAkcji(X, Akcja) } SprawdzRegule(X) RegulaPrawdziwa = true for each Przeslanka in PrzeslankiZwiazaneZRegula(X) { if (WartoscLogicznaPrzeslanka == null) { EwaluujPrzeslanke(Przeslanka) } if (WartoscLogicznaPrzeslanka == false) { return false) break i } } return true EwaluujRegule(X) ZmienZmienna(ZmiennaOkreslanaPrzezRegule ,EwluujWyrazenie(WyrazenieWKonkluzjiReguly(X)) dodaj ZmiennaOkreslanaPrzezRegule do StosZmiennychWprzod WnioskujWstecz(X) for each Reguly in WszystkieRegulyOkreslajaceWartoscZmiennejX { if SprawdzRegule(Regula) { EwaluujRegule(Regula) } if (RegulaPrawdziwa == true) { EwaluujRegule(Regula) } }