Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie w logice

Podobne prezentacje


Prezentacja na temat: "Programowanie w logice"— Zapis prezentacji:

1 Programowanie w logice
Prolog Programowanie w logice

2 Geneza Prolog powstał w latach 70. XX wieku jako język programowania służący do automatycznej analizy języków naturalnych. Szczególnie dobrze sprawdza się w programach związanych ze sztuczną inteligencją. Prolog w przeciwieństwie do większości popularnych języków jest językiem deklaratywnym.

3 Programowanie w Logice
Język Prolog jest przykładem języka programowania w logice. W tym paradygmacie programowania podawany jest pewien zestaw zależności, a wynik działania programu jest dowodem pewnego twierdzenia w oparciu o te zależności. Innymi słowy wynik programu opiera się o zależności, które zdefiniujemy w programie, a nie o sposób uzyskania tych danych. Pisanie programu w Prologu nie polega na opisywaniu algorytmu. Język piątej generacji.

4 Przykładzik Przykładowy program napisany w Prologu może wyglądać tak:
lubi(jan, tatry). lubi(jan, beskidy). lubi(jerzy, beskidy). lubi(jerzy, bieszczady). lubiToSamo(X, Y) :-lubi(X, S), lubi(Y, S), X \= Y. Fakty Reguła

5 Fakty Zauważmy, że nazwy relacji pisane są z małej litery, a konstrukcją przypominają funkcję wieloargumentową, której stałe zapisane są małymi literami. lubi(jan, tatry). Tak skonstruowaną formułę nazywamy strukturą, a jej składowe stałymi. Nie musimy nigdzie deklarować co oznaczają elementy lubi, jan, tatry, - ważne, że te terminy są czytelne dla człowieka. Dla komputera wystarczy informacja, że obiekty jan i tatry znajdują się w relacji o nazwie lubi. Fakty kończymy kropką.

6 Struktury Wiemy już, że lubi(jan, tatry). to pewna struktura składająca się z atomów jan i tatry. Predykatem nazwiemy funktor lubi. W przypadku zapytań lub reguł (o których za chwilkę powiemy) zamiast atomów będących stałymi, możemy zastosować zmienne lub inne struktury.

7 Struktury - Przykładzik
pracownik( imię(jan), nazwisko(kowalski), adres( ulica(dluga), nr(2), miasto(krakow)), telefon(’ ’) ) ).

8 Cele Celem może być odpowiedź na pytanie czy dany fakt zachodzi czy nie. Zapytanie lubi(jan, tatry). Zwróci true, bo taka relacja zachodzi, ale nie zachodzi relacja lubi(jan, bieszczady). Zatem otrzymamy wartość false. W zapytaniach możemy pytać również o podmioty, których wcześniej nie zdefiniowaliśmy: lubi(filip,tatry).

9 Cele Zapytanie możemy tworzyć również poprzez zastąpienie stałej zmienną w argumentach dla danej relacji. lubi(X, tatry). Tym samym otrzymamy listę takich podmiotów X, które spełniają powyższą relację. Brak wyników zakończy się wypisaniem false. Jak widzimy w przykładzie – stałą odpowiadającą imieniu zastąpiliśmy zmienną X – a więc wynikiem działania tego zapytania będzie lista osób lubiących Tatry. Zmienne zapisujemy z dużej litery.

10 Cele – przykładzik #1 ?- lubi(jan,X). X = tatry ; X = beskidy.
Wypiszmy wszystko co lubi jan Elementy spełniające relację lubi z obiektem jan przypisane zostaną do zmiennej X ?- lubi(jan,X). X = tatry ; X = beskidy. Elementów może być wiele, Prolog wyszuka i wypisze po jednym elemencie. Każdy kolejny zostanie wyszukany i wypisany po wciśnięciu na klawiaturze średnika. Po ostatnim elemencie występuje kropka.

11 Cele – przykładzik #2 ?- lubi(X,alpy). false.
Wypiszmy wszystkich, którzy lubią Alpy Elementy, z którymi Alpy spełniające relację lubi przypisane zostaną do zmiennej X ?- lubi(X,alpy). false. Ponieważ w naszej bazie faktów nie zdefiniowaliśmy żadnej osoby, która lubi obiekt alpy, a nawet nie zdefiniowaliśmy obiektu alpy w ogóle, to uzyskamy odpowiedź false.

12 Cele – przykładzik #3 ?- X(jan,tatry).
Niestety zmiennymi nie możemy zastępować predykatów. Tym samym nie jesteśmy w stanie dowiedzieć się jaka relacja łączy obiekty jan i tatry. ?- X(jan,tatry).

13 Cele – przykładzik #4 ?- lubi(_,tatry).
Zamiast zmiennej możemy skorzystać również ze znaku specjalnego _ będącego zmienną anonimową. To stwierdzenie można interpretować jako: „są osoby, które lubią tatry” ?- lubi(_,tatry). Ta sama struktura zdefiniowana jako fakt oznaczałaby „każdy lubi tatry”

14 Cele – przykładzik #5 Załóżmy, że nasza baza wiedzy opiera się o pewną relację wielkości. wiekszy(mega,kilo). wiekszy(giga,mega). wiekszy(tera,giga). Przy takiej bazie wiedzy dla zapytania czy tera jest wiekszy od mega otrzymamy odpowiedź false. Dzieje się tak dlatego, że nie zdefiniowaliśmy relacji przechodniości za pomocą reguły.

15 Reguły Reguły pozwalają na uzyskanie odpowiedzi na bardziej złożone zapytania. Składają się z prostych podcelów. W pewnym uproszczeniu tworzą nowy fakt w implementacji programu. Fakty i reguły nazywamy stwierdzeniami.

16 Reguły – Przykładzik #1 Dzięki regułom możemy rozwiązać problem relacji przechodniości: wiekszy(X,Y) :- wiekszy(X,Z),wiekszy(Z,Y). Operator znaczący tyle co jeśli zachodzi strona prawa, to zachodzi strona lewa co można traktować jako implikacja Przecinek pełni rolę operatora AND

17 Reguły – Przykładzik #2 Reguła pozwalająca na ustalenie obiektów lubiących to samo: lubiToSamo(X, Y):- lubi(X, S), lubi(Y, S), X \= Y.

18 Rezolucja i unifikacja
Rezolucja jest to metoda wnioskowania, którą można stosować do opisanych tu stwierdzeń. Podstawowa reguła jest następująca: wiedząc że P=>Q oraz R=>S, wnioskujemy że P=>S, o ile tylko Q i R dają się zunifikować. Z technicznego punktu widzenia, osiąga się to przez wyliczenie Q  S oraz P   R i usunięcie termów, które występują po obydwu stronach T. Występowanie zmiennych w stwierdzeniach powoduje, że w trakcie rezolucji trzeba znaleźć takie wartości dla tych zmiennych, które pozwolą na odpowiednie dopasowanie. Unifikacja to proces znajdowania wartości dla zmiennych, dzięki którym uzyskamy Q = R. Podstawianie pod zmienne tymczasowych wartości pozwalających na unifikację zwane jest instancjonowaniem. Mówimy też o utożsamieniu zmiennej z wartością. Unifikacja często wymaga nawrotów: Zmienna jest instancjonowana, lecz dopasowanie nie udaje się. Zmienną instancjonuje się wówczas inną wartością 

19 przykładzik podzielne(18,6). podzielne(6,3). czypodzielne(A,B) :- podzielne(A,C),podzielne(D,B),C=:=D. ?- podzielne(18,6). ?- true. ?- podzielne(6,3). ?- czypodzielne(18,3).

20 Operatory Zapis a-b*c to inna forma zapisu -(a,*(b,c)). gdzie operatorami są – i *. Operatory występują w postaciach: Prefixowa (np. -1) Infixowa (np ) Sufixowa (np. 4!)

21 operatory Definiując nowy operator, oprócz zdecydowania się na jedną z wcześniej opisanych postaci, ustalić musimy jego priorytet i łączność • priorytet: od 1 do 1200 (im mniej tym większy) • łączność: lewo- lub prawostronna (1-2-3 interpretowane jest jako ((1-2)-3) ponieważ - jest operatorem lewostronnie łącznym); łączność definiujemy za pomocą jednego z atomów: xf, yf, xfx, xfy, yfx, fx lub fy.

22 Operatory - przykładzik
lubi(jas,malgosie). ?- lubi(jas,malgosie). true ?- jas lubi malgosie. ERROR: Syntax error: Operator expected ERROR: jas ERROR: ** here ** ERROR: lubi malgosie . ?- op(500, xfx, lubi).

23 Operatory - Przykładzik
?- X is 2+3*5. X = 17 true ?- op(100,yfx,+). X = 25 ?-

24 arytmetyka W oryginalnym Prologu dostępna jest tylko arytmetyka na liczbach całkowitych. W wersji SWI-Prolog mamy możliwość pracy na liczbach zmiennoprzecinkowych. Dla uproszczenia zapisu wprowadzono infiksowe operatory arytmetyczne, np.: +,-,*,/,// Przykład: dodawanie(X,Y,Z) :- Z is X + Y. ?- dodawanie(2,4,Z). ?- Z = 6.

25 arytmetyka Przy zapisie X is zostaną wykonane kolejne czynności: - zostanie wyliczona wartość wyrażenia 1+2, otrzymamy X is 3 - operator is zostanie zinterpretowany jako podstawienie - otrzyamamy odpowiedź true gdyż X i 3 mają teraz tą samą wartość

26 Arytmetyka Jeśli napiszemy 3 is 1+2 wówczas is nie zadziała jako „operator” przypisania a spowoduje jedynie wykonanie porównania wartości z wyrażeniem. Zwróconą wartością będzie true. Jeśli napiszemy 1+2 is 1+2 wówczas zwrócona zostanie wartość false. Wynika to z faktu, że oba argumenty są wyrażeniami. Wyrażenie z prawej strony zostanie obliczone dając w wyniku liczbę 3. Wyrażenie z lewej strony pozostanie bez zmian, przez co nie będzie reprezentowane przez wartość 3.

27 arytmetyka Do porównywania zamiast is możemy używać także operatora =:=, który w odróżnieniu od is pozwala na umieszczenie wyrażeń arytmetycznych w miejscu obydwu swoich argumentów. Możemy wiec napisać: (3+2 =:= 4+1). co zostanie poprawnie zinterpretowane i zwróci wartość true.

28 arytmetyka Oprócz =:= Prolog posiada jeszcze inne operatory porównania: - mniejszy < - większy > - mniejszy równy <= - większy równy >= Przykład: (1+2 < 2+3). (1+2*3 >= 3+3). (1 < 4). (N < N+1).

29 Instrukcja warunkowa Instrukcja warunkowa w Prologu wygląda trochę inaczej niż w innych językach programowania: struktura: warunek -> true ; false Przykładzik: waga(slon, 1000). waga(czlowiek, 80). ciezszy(A,B)->waga(A,W1),waga(B, W2), W1>W2 -> write(A) ; write(B).

30 Przykładzik polekwadratu(A, X) :- X is A*A. poleprostokata(A,B,X) :- X is A*B. poletrojkata(A,H,X) :- X is A*H/2. wzrost(jan, 180). wzrost(anna, 160). wyzszy(A,B) :- wzrost(A,S), wzrost(B,T), S>T->write(A);write(B). ?- wyzszy(jan, anna). ?- jan.

31 Dziękujemy za uwagę 


Pobierz ppt "Programowanie w logice"

Podobne prezentacje


Reklamy Google