Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie w logice. Prolog powstał w latach 70. XX wieku jako język programowania służący do automatycznej analizy języków naturalnych. Szczególnie.

Podobne prezentacje


Prezentacja na temat: "Programowanie w logice. Prolog powstał w latach 70. XX wieku jako język programowania służący do automatycznej analizy języków naturalnych. Szczególnie."— Zapis prezentacji:

1 Programowanie w logice

2 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 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ł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 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 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 pracownik( imię(jan), nazwisko(kowalski), adres( ulica(dluga), nr(2), miasto(krakow)), telefon( ) ) ).

8 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 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 ?- 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 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 ?- 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 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 ?- 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.

13 ?- 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 Ta sama struktura zdefiniowana jako fakt oznaczałaby każdy lubi tatry

14 wiekszy(mega,kilo). wiekszy(giga,mega). wiekszy(tera,giga). Załóżmy, że nasza baza wiedzy opiera się o pewną relację wielkości. 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 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 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ła pozwalająca na ustalenie obiektów lubiących to samo: lubiToSamo(X, Y):- lubi(X, S), lubi(Y, S), X \= Y.

18 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 podzielne(18,6). podzielne(6,3). czypodzielne(A,B) :- podzielne(A,C),podzielne(D,B),C=:=D. ?- podzielne(18,6). ?- true. ?- podzielne(6,3). ?- true. ?- czypodzielne(18,3). ?- true.

20 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 Deniują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ść deniujemy za pomocą jednego z atomów: xf, yf, xfx, xfy, yfx, fx lub fy.

22 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). true ?- jas lubi malgosie.

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

24 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 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 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 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 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 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 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


Pobierz ppt "Programowanie w logice. Prolog powstał w latach 70. XX wieku jako język programowania służący do automatycznej analizy języków naturalnych. Szczególnie."

Podobne prezentacje


Reklamy Google