510 likes | 706 Views
Prolog. Wykorzystano materiały z „Programowanie w logice. Prolog†c 2007–2009 by P. Fulmanski (ostatnia modyfikacja: 18 maja 2009) - http://math.uni.lodz.pl/~fulmanp/zajecia/prolog/wyklad.pdf. Proste fakty. Spółka A jest rentowna, spółka B jest rentowna …. stała. predykat.
E N D
Prolog Wykorzystano materiały z „Programowanie w logice. Prolog” c 2007–2009 by P. Fulmanski (ostatnia modyfikacja: 18 maja 2009) - http://math.uni.lodz.pl/~fulmanp/zajecia/prolog/wyklad.pdf
Proste fakty • Spółka A jest rentowna, spółka B jest rentowna …. stała predykat jest_rentowna(spolka_A). jest_rentowna(spolka_B). jest_rentowna(spolka_C). spolka_A(jest_rentowna). spolka_B(jest_rentowna). spolka_C(jest_rentowna).
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 IF AND zdolnosc_kredytowa_OK(Spolka):- zadluzenie(Spolka,brak), rentownosc(Spolka,jest_rentowna). 1 ?- zdolnosc_kredytowa_OK(spolka_A). true. 2 ?- zdolnosc_kredytowa_OK(ZdolnoscKredytowaMaja). 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.
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'. wszystko jedno co 10 ?- zapisy(_,'TSI',Student). Student = 'Jan Kot' ; Student = 'Ala Osa' ; Student = 'Adam Pies' ; Student = 'Jan Słoń' ; Student = 'Ewa Mysz'
Dodatkowe dane egzamin('2012-09-18', 'Jan Kot', 'TSI', 3.0). egzamin('2012-09-18', 'Ala Osa', 'TSI', 3.5). egzamin('2012-09-18', 'Adam Pies', 'TSI', 4.0). egzamin('2012-09-18', 'Jan Słoń', 'TSI', 2.0). egzamin('2012-09-18', 'Ewa Mysz', 'TSI', 5.0). egzamin('2012-09-20', 'Jan Słoń', 'TSI', 3.0). egzamin('2012-09-19', 'Jan Kot', 'BD', 5.0). egzamin('2012-09-19', 'Ala Osa', 'BD', 4.0). egzamin('2012-09-19', 'Adam Pies', 'BD', 3.0). egzamin('2012-09-19', '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 = '2012-09-18', Ocena = 3.0 ; Student = 'Ala Osa', Przedmiot = 'TSI', Prowadzacy = 'Andrzej Macioł', Data = '2012-09-18', Ocena = 3.5 ; Student = 'Adam Pies', Przedmiot = 'TSI', Prowadzacy = 'Andrzej Macioł', Data = '2012-09-18', Ocena = 4.0 ………..
Pytania szczególowe 1 ?- uzyskal_ocene('Adam Pies', 'TSI',_,Data,Ocena). Data = '2012-09-18', Ocena = 4.0 ; false. 2 ?- uzyskal_ocene('Ewa Mysz', 'TSI', Prowadzacy,Data,Ocena). Prowadzacy = 'Andrzej Macioł', Data = '2012-09-18', Ocena = 5.0. 3 ?- uzyskal_ocene('Jan Słoń', 'TSI', Prowadzacy,Data,Ocena). Prowadzacy = 'Andrzej Macioł', Data = '2012-09-18', Ocena = 2.0 ; Prowadzacy = 'Andrzej Macioł', Data = '2012-09-20', Ocena = 3.0 ;
Związki między obiektami Wykorzystano źródła: http://www.cse.un sw.edu.au/~cs9414/Labs/family.pl.solution.html http://www.cse.unsw.edu.au /~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 ; 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,Corka). Corka = spolkaA ; Corka = spolkaB ; Corka = spolkaC ; Corka = spolkaD ; Corka = spolkaE ; Corka = spolkaF ; Corka = spolkaH ; false.