Metody reprezentacji wiedzy – cz. 4. Andrzej Macioł
Prolog Inference Engine
Dialog
Prolog Wykorzystano materiały z „Programowanie w logice. Prolog” c 2007–2009 by P. Fulmanski (ostatnia modyfikacja: 18 maja 2009) -
Proste fakty Spółka A jest rentowna, spółka B jest rentowna …. jest_rentowna(spolka_A). jest_rentowna(spolka_B). jest_rentowna(spolka_C). spolka_A(jest_rentowna). spolka_B(jest_rentowna). spolka_C(jest_rentowna). predykat stała
Weryfikacja prostych faktów 1 ?- jest_rentowna(spolka_A). true. 2 ?- spolka_A(jest_rentowna). true. 3 ?- jest_rentowna(spolka_X). false.
Zmienne w zapytaniach 4 ?- jest_rentowna(Ktore_spolki). Ktore_spolki = spolka_A ; Ktore_spolki = spolka_B ; Ktore_spolki = spolka_C. 5 ?- spolka_A(Jaka_jest). Jaka_jest = jest_rentowna. 6 ?- spolka_B(Jaka_jest). Jaka_jest = jest_rentowna. Zmienna
Więcej predykatów jest_rentowna(spolka_A). jest_rentowna(spolka_B). jest_rentowna(spolka_C). jest_nierentowna(spolka_D). jest_nierentowna(spolka_E). spolka_A(jest_rentowna). spolka_B(jest_rentowna). spolka_C(jest_rentowna). spolka_D(jest_nierentowna). spolka_E(jest_nierentowna).
Nowe zapytanie 1 ?- jest_nierentowna(Ktore_spolki). Ktore_spolki = spolka_D ; Ktore_spolki = spolka_E.
Predykat dwuargumentowy rentownosc(spolka_A, jest_rentowna). rentownosc(spolka_B, jest_rentowna). rentownosc(spolka_C, jest_rentowna). rentownosc(spolka_D, jest_nierentowna). rentownosc(spolka_E, jest_nierentowna). spolka_A(rentownosc, jest_rentowna). spolka_B(rentownosc, jest_rentowna). spolka_C(rentownosc, jest_rentowna). spolka_D(rentownosc, jest_nierentowna). spolka_E(rentownosc, jest_nierentowna).
Predykat dwuargumentowy 2 ?- rentownosc(KtoraSpolka,JakaJest). KtoraSpolka = spolka_A, JakaJest = jest_rentowna ; KtoraSpolka = spolka_B, JakaJest = jest_rentowna ; KtoraSpolka = spolka_C, JakaJest = jest_rentowna ; KtoraSpolka = spolka_D, JakaJest = jest_nierentowna ; KtoraSpolka = spolka_E, JakaJest = jest_nierentowna.
Predykat dwuargumentowy 3 ?- spolka_A(CoOceniamy,JakiWynik). CoOceniamy = rentownosc, JakiWynik = jest_rentowna. 4 ?- spolka_A(rentownosc,JakiWynik). JakiWynik = jest_rentowna. 6 ?- spolka_A(CoOceniamy,jest_rentowna). CoOceniamy = rentownosc.
Dodajemy fakty zadluzenie(spolka_A, brak). zadluzenie(spolka_B, przecietne). zadluzenie(spolka_C, wysokie). zadluzenie(spolka_D, brak). zadluzenie(spolka_E, brak). spolka_A(zadluzenie, brak). spolka_B(zadluzenie, przecietne). spolka_C(zadluzenie, wysokie). spolka_D(zadluzenie, brak). spolka_E(zadluzenie, brak).
Wnioskujemy 1 ?- spolka_A(zadluzenie, JakieJestZadluzenie). JakieJestZadluzenie = brak. 2 ?- spolka_A(Atrybut, Wartosc). Atrybut = rentownosc, Wartosc = jest_rentowna ; Atrybut = zadluzenie, Wartosc = brak. 4 ?- zadluzenie(Spolka,brak). Spolka = spolka_A ; Spolka = spolka_D ; Spolka = spolka_E.
Wnioskujemy 3 ?- zadluzenie(Spolka,JakieJestZadluzenie). Spolka = spolka_A, JakieJestZadluzenie = brak ; Spolka = spolka_B, JakieJestZadluzenie = przecietne ; Spolka = spolka_C, JakieJestZadluzenie = wysokie ; Spolka = spolka_D, JakieJestZadluzenie = brak ; Spolka = spolka_E, JakieJestZadluzenie = brak.
Predykat, w którym argumentami są predykaty kredyt(zadluzenie(spolka_A,brak), rentownosc(spolka_A, jest_rentowna)). 1 ?- kredyt(JakieJestZadluzenie, JakaJestRentownosc). JakieJestZadluzenie = zadluzenie(spolka_A, brak), JakaJestRentownosc = rentownosc(spolka_A, jest_rentowna).
Reguły zdolnosc_kredytowa_OK(Spolka):- zadluzenie(Spolka,brak), rentownosc(Spolka,jest_rentowna). IF AND 1 ?- zdolnosc_kredytowa_OK(spolka_A). true. 2 ?- zdolnosc_kredytowa_OK(ZdolnoscKredyto waMaja). ZdolnoscKredytowaMaja = spolka_A ; false.
Dodatkowa reguła zdolnosc_kredytowa_OK(Spolka):- zadluzenie(Spolka, przecietne), rentownosc(Spolka,jest_rentowna). 1 ?- zdolnosc_kredytowa_OK(ZdolnoscKredytowaMaja). ZdolnoscKredytowaMaja = spolka_A ; ZdolnoscKredytowaMaja = spolka_B. 2 ?- zdolnosc_kredytowa_OK(spolka_C). false. 3 ?- zdolnosc_kredytowa_OK(spolka_B). true.
Zastosowanie predykatu dwuargumentowego zdolnosc_kredytowa(Spolka,ok):- zadluzenie(Spolka,brak), rentownosc(Spolka,jest_rentowna). zdolnosc_kredytowa(Spolka,ok):- zadluzenie(Spolka, przecietne), rentownosc(Spolka,jest_rentowna). zdolnosc_kredytowa(Spolka,warunkowo):- zadluzenie(Spolka,brak), rentownosc(Spolka,jest_nierentowna).
Wnioskowanie 2 ?- zdolnosc_kredytowa(Spolka, Ocena). Spolka = spolka_A, Ocena = ok ; Spolka = spolka_B, Ocena = ok ; Spolka = spolka_D, Ocena = warunkowo ; Spolka = spolka_E, Ocena = warunkowo.
Wnioskowanie 3 ?- zdolnosc_kredytowa(Spolka, ok). Spolka = spolka_A ; Spolka = spolka_B. 4 ?- zdolnosc_kredytowa(Spolka, warunkowo). Spolka = spolka_D ; Spolka = spolka_E. 5 ?- zdolnosc_kredytowa(spolka_A, Ocena). Ocena = ok ; false. 6 ?- zdolnosc_kredytowa(spolka_C, Ocena). false.
Nowe fakty i reguły obroty_mln(spolka_A, 0.1). obroty_mln(spolka_B, 1.5). obroty_mln(spolka_C, 2). obroty_mln(spolka_D, 5). obroty_mln(spolka_E, 12). zdolnosc_kredytowa(Spolka,ok):- zadluzenie(Spolka, przecietne), rentownosc(Spolka,jest_rentowna), obroty_mln(Spolka,X), X>1, X<3.
Wnioskowanie 8 ?- zdolnosc_kredytowa(X,Y). X = spolka_B, Y = ok. 9 ?- zdolnosc_kredytowa(Spolka,ok). Spolka = spolka_B.
Prolog – baza danych
Studenci - przedmioty jest_na_liscie('Jan Kot', 'TSI'). jest_na_liscie('Ala Osa', 'TSI'). jest_na_liscie('Adam Pies', 'TSI'). jest_na_liscie('Jan Słoń', 'TSI'). jest_na_liscie('Ewa Mysz', 'TSI'). jest_na_liscie('Jan Kot', 'BD'). jest_na_liscie('Ala Osa', 'BD'). jest_na_liscie('Adam Pies', 'BD'). jest_na_liscie('Jan Słoń', 'BD').
Prowadzący zjęcia egzaminuje('Andrzej Macioł', 'TSI'). egzaminuje('Jurek Duda', 'BD').
Reguła - zapisy zapisy(Prowadzacy,Przedmiot,Student):- jest_na_liscie(Student,Przedmiot), egzaminuje(Prowadzacy,Przedmiot).
Pełne listy zapisów 8 ?- zapisy(Prowadzacy,Przedmiot,Student). Prowadzacy = 'Andrzej Macioł', Przedmiot = 'TSI', Student = 'Jan Kot' ; Prowadzacy = 'Andrzej Macioł', Przedmiot = 'TSI', Student = 'Ala Osa' ; Prowadzacy = 'Andrzej Macioł', Przedmiot = 'TSI', Student = 'Adam Pies' ; Prowadzacy = 'Andrzej Macioł', Przedmiot = 'TSI', Student = 'Jan Słoń' ; Prowadzacy = 'Andrzej Macioł', Przedmiot = 'TSI', Student = 'Ewa Mysz' ……………..
Pytania szczegółowe 9 ?- zapisy(Prowadzacy,Przedmiot, 'Ala Osa'). Prowadzacy = 'Andrzej Macioł', Przedmiot = 'TSI' ; N Prowadzacy = 'Jurek Duda', Przedmiot = 'BD'. 10 ?- zapisy(_,'TSI',Student). Student = 'Jan Kot' ; Student = 'Ala Osa' ; Student = 'Adam Pies' ; Student = 'Jan Słoń' ; Student = 'Ewa Mysz' wszystko jedno co
Dodatkowe dane egzamin(' ', 'Jan Kot', 'TSI', 3.0). egzamin(' ', 'Ala Osa', 'TSI', 3.5). egzamin(' ', 'Adam Pies', 'TSI', 4.0). egzamin(' ', 'Jan Słoń', 'TSI', 2.0). egzamin(' ', 'Ewa Mysz', 'TSI', 5.0). egzamin(' ', 'Jan Słoń', 'TSI', 3.0). egzamin(' ', 'Jan Kot', 'BD', 5.0). egzamin(' ', 'Ala Osa', 'BD', 4.0). egzamin(' ', 'Adam Pies', 'BD', 3.0). egzamin(' ', 'Jan Słoń', 'BD', 3.5).
Reguły – wyniki egzaminu uzyskal_ocene(Student, Przedmiot, Prowadzacy, Data, Ocena):- egzaminuje(Prowadzacy, Przedmiot), egzamin(Data, Student, Przedmiot, Ocena).
Pełny przegląd 7 ?- uzyskal_ocene(Student,Przedmiot,Prowadzacy,Data,Ocena). Student = 'Jan Kot', Przedmiot = 'TSI', Prowadzacy = 'Andrzej Macioł', Data = ' ', Ocena = 3.0 ; Student = 'Ala Osa', Przedmiot = 'TSI', Prowadzacy = 'Andrzej Macioł', Data = ' ', Ocena = 3.5 ; Student = 'Adam Pies', Przedmiot = 'TSI', Prowadzacy = 'Andrzej Macioł', Data = ' ', Ocena = 4.0 ………..
Pytania szczególowe 1 ?- uzyskal_ocene('Adam Pies', 'TSI',_,Data,Ocena). Data = ' ', Ocena = 4.0 ; false. 2 ?- uzyskal_ocene('Ewa Mysz', 'TSI', Prowadzacy,Data,Ocena). Prowadzacy = 'Andrzej Macioł', Data = ' ', Ocena = ?- uzyskal_ocene('Jan Słoń', 'TSI', Prowadzacy,Data,Ocena). Prowadzacy = 'Andrzej Macioł', Data = ' ', Ocena = 2.0 ; Prowadzacy = 'Andrzej Macioł', Data = ' ', Ocena = 3.0 ;
Związki między obiektami Wykorzystano źródła: sw.edu.au/~cs9414/Labs/family.pl.solution.html /~cs9414/Labs/lab.html
Rodzice - dzieci % parent(Parent, Child) parent(albert, jim). parent(albert, peter). parent(jim, brian). parent(john, darren). parent(peter, lee). parent(peter, sandra). parent(peter, james). parent(peter, kate). parent(peter, kyle). parent(brian, jenny). parent(irene, jim). parent(irene, peter). parent(pat, brian). parent(pat, darren). parent(amanda, jenny ).
Płeć % female(Person) female(irene). female(pat). female(lee). female(sandra). female(jenny). female(amanda). female(kate). % male(Person) male(albert). male(jim). male(peter). male(brian). male(john). male(darren). male(james). male(kyle ).
Rok urodzenia % yearOfBirth(Person, Year). % yearOfBirth(irene, 1923). yearOfBirth(pat, 1954). yearOfBirth(lee, 1970). yearOfBirth(sandra, 1973). yearOfBirth(jenny, 1996). yearOfBirth(amanda, 1979). yearOfBirth(albert, 1926). yearOfBirth(jim, 1949). yearOfBirth(peter, 1945). yearOfBirth(brian, 1974). yearOfBirth(john, 1955). yearOfBirth(darren, 1976). yearOfBirth(james, 1969). yearOfBirth(kate, 1975). yearOfBirth(kyle, 1976).
Szukamy dziadków i babć % grandparent(Grandparent, Grandchild) % means Grandparent is a grandparent of Grandchild % grandparent(Grandparent, Grandchild) :- parent(Grandparent, Child), parent(Child, Grandchild).
Wyniki 3 ?- grandparent(Grandparent, Grandchild). Grandparent = albert, Grandchild = brian ; Grandparent = albert, Grandchild = lee ; Grandparent = albert, Grandchild = sandra ; Grandparent = albert, Grandchild = james ; Grandparent = albert, Grandchild = kate ; Grandparent = albert, Grandchild = kyle ; Grandparent = jim, Grandchild = jenny; ……………..
Kto jest starszy? % older(A,B) % means A is older than B % older(A,B) :- yearOfBirth(A, Y1), yearOfBirth(B, Y2), Y2 > Y1.
Wyniki 5 ?- older(A,B). A = irene, B = pat ; A = irene, B = lee ; A = irene, B = sandra ; A = irene, B = jenny ; ……….. A = kate, B = kyle ; A = kyle, B = jenny ; A = kyle, B = amanda ; false.
Rodzeństwo % siblings(A,B) % means A and B are siblings % siblings(A,B) :- parent(X, A), % A & B share a common parent parent(X,B), % A \== B. % A is different from B
Wyniki 6 ?- siblings(A,B). A = jim, B = peter ; A = peter, B = jim ; A = lee, B = sandra ; A = lee, B = james ; A = lee, 7 ?- siblings(peter,B). B = jim ; false.
Starsi bracia % olderBrother(A,B) % means A is an older brother of B % olderBrother(A,B) :- siblings(A, B), male(A), older(A, B).
Wyniki 8 ?- olderBrother(A,B). A = peter, B = jim ; A = james, B = lee ; A = james, B = sandra ; A = james, B = kate ; A = james, B = kyle ; A = peter, B = jim ; A = brian, B = darren ; false.
Potomkowie % descendant(Person, Descendant) % means Descendant is a descendant of Person. % descendant(Person, Descendant) :- parent(Person, Descendant). descendant(Person, Descendant) :- parent(Person, Child), descendant(Child, Descendant).
Wyniki 9 ?- descendant(Person, Descendant). Person = albert, Descendant = jim ; Person = albert, Descendant = peter ; Person = jim, Descendant = brian ; Person = john, Descendant = darren ; Person = peter, Descendant = lee ; …………….. Person = irene, Descendant = kate ; Person = irene, Descendant = kyle ; Person = pat, Descendant = jenny ; false.
Przodkowie % ancestor(Person, Ancestor) % means Ancestor is an ancestor of Person. % % This is functionally equivalent to descendant(Ancestor, Person). % ancestor(Person, Ancestor) :- parent(Ancestor, Person). ancestor(Person, Ancestor) :- parent(Parent, Person), ancestor(Parent, Ancestor).
Wyniki 10 ?- ancestor(jenny, Ancestor). Ancestor = brian ; Ancestor = amanda ; Ancestor = jim ; Ancestor = pat ; Ancestor = albert ; Ancestor = irene ; false.
Sieć powiązań własnościowych Nazwa córki Udział matki
Baza wiedzy i fakty jest_spolka_zalezna(Matka,Zalezna):- jest_spolka_matka(Matka,Zalezna). jest_spolka_zalezna(Matka,Zalezna):- jest_spolka_matka(Matka,Corka), jest_spolka_zalezna(Corka,Zalezna). jest_spolka_matka(Matka,Corka):- udzial(Matka,Corka,X), X>50. udzial(ambergold,spolkaA,55). udzial(ambergold,spolkaB,60). udzial(spolkaA,spolkaC,90). udzial(spolkaA,spolkaD,60). udzial(spolkaC,spolkaE,75). udzial(spolkaC,spolkaF,51). udzial(spolkaB,spolkaG,23). udzial(spolkaB,spolkaH,71 ).
Wyniki 20 ?- jest_spolka_zalezna(Matka,Corka). Matka = ambergold, Corka = spolkaA ; Matka = ambergold, Corka = spolkaB ; Matka = spolkaA, Corka = spolkaC ; Matka = spolkaA, Corka = spolkaD ; Matka = spolkaC, Corka = spolkaE ; Matka = spolkaC, Corka = spolkaF ; Matka = spolkaB, Corka = spolkaH ; Matka = ambergold, Corka = spolkaC ; Matka = ambergold, Corka = spolkaD ; Matka = ambergold, Corka = spolkaE ; Matka = ambergold, Corka = spolkaF ; Matka = ambergold, Corka = spolkaH ; Matka = spolkaA, Corka = spolkaE ; Matka = spolkaA, Corka = spolkaF ; false.
Wyniki szczegółowe 21 ?- jest_spolka_zalezna(ambergold,Cor ka). Corka = spolkaA ; Corka = spolkaB ; Corka = spolkaC ; Corka = spolkaD ; Corka = spolkaE ; Corka = spolkaF ; Corka = spolkaH ; false.
Wyniki szczegółowe 22 ?- jest_spolka_zalezna(spolkaB,Corka). Corka = spolkaH ; false. 23 ?- jest_spolka_zalezna(Matka,spolkaE). Matka = spolkaC ; Matka = ambergold ; Matka = spolkaA ; false.