Patryk Kłys Aleksandra dąbrowska Prolog - Tutorial introduction - Closer look na podstawie książki William F. Clocksin, Christopher S. Mellish - „Programming in Prolog” Patryk Kłys Aleksandra dąbrowska
Tutorial introduction
Słowem wstępu Prolog jest językiem programwania używanym do rozwiązywania problemów, które obejmują obiekty oraz relacje między nimi Gdy mówimy „John ma książkę”, deklarujemy relacje posiadania pomiędzy jednym obiektem „John” a drugim „książka” Ponadto relacje mają swoją kolejność tj. John ma książkę ale książka nie ma Johna
Programowanie Programowanie w prologu składa się z: Sprecyzowania faktów o obiektach i ich relacjach Zdefiniowania zasad o obiektach i ich relacjach Zadawania pytań o obiekty i ich relacje Dla przykładu przypuśćmy, że powiemy Prolog’owi zasadę dotyczącą sióstr. Następnie możemy zadać pytanie czy Mary i Jane są siostrami. Prolog przeszuka wszystko co powiedzieliśmy mu na temat Mary i Jane i zwróci nam odpowiedz true lub false zależnie od tego co wcześniej powiedzieliśmy mu na ten temat.
Fakty Przypuśćmy, że chcemy powiedzieć Prolog’owi fakt, że „John lubi Mary”. Fakt ten składa się z dwóch obiektów „John” oraz „Mary” a także relacji nazwanej przez nas „lubi”. W prologu musimy zapisać to w następującej formie: lubi(john, mary). Ważne! Nazwy wszystkich obiektów i relacji powinny być zapisane z małej litery. Dla przykładu „lubi”, „john”, „mary” Najpierw podajemy nazwę relacji dopiero potem podajemy obiekty, których dotyczy dana relacja po przecinku w nawiasie zwykłym Na końcu każdego faktu musi znajdować się „ . ” kropka
Fakty c.d. Gdy definiujemy relacje między dwoma obiektami powinniśmy zwrócić uwagę na ich kolejność w nawiasach. We wcześniejszym przykładzie powiedzieliśmy o tym że „John lubi Mary” jednak nie jest to to samo co „Mary lubi John” Aby relacja była dwukierunkowa musimy dopisać kolejny fakt w prologu, a mianowicie lubi(mary, john).
Zapytania Załóżmy następujące fakty lubi(joe, ryba). lubi(joe, mary). lubi(mary, ksiazka). lubi(john, ksiazka). lubi(john, francja). Jeśli zapiszemy wszystkie te fakty w Prolog’u będziemy mogli zapytać o nie a Prolog udzieli nam odpowiedzi w następujący sposób ?- lubi(joe, pieniadze). false ?- lubi(mary, joe). false ?- lubi(mary, ksiazka). true
Zapytania c.d. W Prolog’u odpowiedz false, nie jest dosłowna. Tak naprawdę oznacza to, że „nic nie jest związane z pytaniem” Dla przykładu przypuśćmy następujące 3 fakty czlowiek(andrzej). czlowiek(karol). warszawiak(karol). Zadajmy następujące pytania ?- warszawiak(karol). true ?- warszawiak(andrzej). false Dostaliśmy odpowiedź false mimo tego, że tak naprawdę może istnieje Andrzej będący mieszkańcem warszawy. Dlatego odpowiedź tą powinniśmy interpretować raczej jako informację że Prolog nie ma na ten temat żadnych informacji
Zapytania c.d. Co się stanie jeśli zapytamy Prolog’a o relację która nie istnieje w bazie? Dla przykładu zapytajmy: ?- wspolokator(andrzej, karol). ERROR: Undefined procedure: king/2 (DWIM could not correct goal) Uzyskaliśmy błąd ponieważ pomimo tego że andrzej oraz karol znajdują się w naszej bazie to nie mamy zdefiniowanej relacji wspolokator
Zmienne Jeśli chcemy się dowiedzieć się Co John lubi a nie Czy John lubi posłużymy się zmiennymi. I tak dla przykładu gdybyśmy chcieli zapytać „Co lubi John” posłużymy się zmienną „X” w następujący sposób: ?-lubi(john, X). X = ksiazka ; X = francja.
Zmienne c.d. W momencie zapytania Polog przeszukuje naszą bazę w poszukiwaniu obiektów powiązanych relacją „lubi” z obiektem „John” Kiedy prolog natrafia na pierwsze powiązanie czeka na naszą reakcje i tak aby: Kontynuować wyszukiwania podajemy „;” średnik i naciskamy ENTER Jeśli jesteśmy usatysfakcjonowaniu z naszego obecnego wyniku wyszukiwania i nie chcemy szukać dalszych powiązań wystarczy po prostu wcisnąć ENTER
Spójniki Przypuśćmy że chcielibyśmy zapytać o bardziej skomplikowane relacje jak na przykład: „Czy John i Mary lubią się nawzajem?” Przypuśćmy że mamy poniższą bazę: lubi(mary, czekolada). lubi(mary, wino). lubi(john, wino). lubi(john, mary). Gdy chcemy zapytać „Czy John lubi Mary i Mary lubi John?” posłużymy się „ , ” przecinkiem w następujący sposób: ?-lubi(john,mary) , lubi(mary,john). false.
Spójniki c.d Spójnik „i” zastępuje przecinek I tak aby zapytać „ Co lubi John i Mary?” zrobimy to następująco: lubi(john,X),lubi(mary,X). X = wino . Wyszukiwanie działa tak samo jak w przypadku innych zapytań: „ ; ” + ENTER pokazuje kolejne wyniki Sam ENTER kończy wyszukiwanie
Reguły W Prologu reguł używa się do zapisania, że jakiś fakt zależy od grupy innych faktów. W jeżyku polskim do stworzenia reguły używamy słówka „jeśli”, na przykład: Używam parasola, jeśli pada. Reguł używa się też do zapisywania definicji, na przykład: X jest ptakiem jeśli: X jest zwierzęciem i X ma pióra.
Reguły c.d. Przypuśćmy następujące fakty: jedzenie(czekolada). jedzenie(herbatniki). lubi(mary,czekolada). lubi(mary,cola) lubi(jim,herbatniki). lubi(kim,koty). lubi(sarach,czekolada). lubi(john,X):-lubi(X,czekolada). Gdy zapytamy o to kogo lubi John uzyskamy następującą odpowiedź: ?- lubi(john,X). X = mary ; X = sarach ; false. Jak widzimy mimo tego że nie napisaliśmy bezpośrednio że John lubi Mary i Sarach dzięki ostatniej linijce uzyskaliśmy dany rezultat
Reguły c.d. Nasze reguły mogą być bardziej złożone. Ważne aby były one rozdzielane przecinkami np.: lubi(john,X):-lubi(X,czekolada), lubi(X,cola). W odpowiedzi dostaniemy już inny wynik: ?- lubi(john,X). X = mary ; false.
A closer look
Składnia Składnia języka opisuje, w jaki sposób możemy dopasowywać słowa do siebie. W Angielskim, składnia zdania "Widzę zebry" jest poprawna, ale składnia "zebrę widzę ja„ nie jest poprawne. W pierwszym rozdziale nie omawialiśmy składni Prologu wyraźnie, ale po prostu pokazaliśmy, jak wyglądały niektóre części Prologa. Tutaj my podsumujemy składnię tych części Prologa, które widzieliśmy do tej pory. Programy Prolog zbudowane są na podstawie terminów. Termin jest albo stałą, zmienną, albo struktura. Widzieliśmy każde z tych terminów w poprzednim rozdziale, ale nie znaliśmy ich pod ich nazwami. Każdy termin jest zapisany jako ciąg znaków.
Składnia c.d. Terminy są podzielone na cztery kategorie w następujący sposób: Pierwszy rząd składa się z wielkich liter. Drugi wiersz składa się z małych liter. Trzeci wiersz składa się z cyfr. Czwarty wiersz składa się ze znaków specjalnych.
Stałe Stałe nazywają określone obiekty lub określone relacje. Istnieją dwa rodzaje: atomy liczby Przykładami atomów są nazwy które nadawaliśmy poprzednio lubi mary john ksiazka czekolada Specjalne symbole, które Prolog używa do oznaczania pytań "? -" i zasady ": -" są również atomami.
Stałe c.d. Istnieją dwa rodzaje atomów: te złożone z liter i cyfr oraz te złożone ze znaków. Pierwszy rodzaj zwykle zaczyna się od małej litery, podobnie jak wszystkie te, które widzieliśmy w poprzednim rozdziale. Czasami może być konieczne posiadanie atomu zaczynającego się od dużej litery lub cyfry. Jeśli atom jest zamknięty w jednym cudzysłowie wtedy atom może mieć dowolne znaki w swojej nazwie. " ", Podkreślenie znak "_" można wstawić w środku atomu, aby poprawić czytelność.
Zmienne Zmienne wyglądają jak atomy, z wyjątkiem nazw rozpoczynających się od dużej litery lub znaku podkreślenia „ _ ” Zmienna powinna być uważana za stojącą dla jakiegoś obiektu, którego nie jesteśmy w stanie lub niechętnie wymieniany w chwili pisania programu W przykładowych klauzulach Prologa, które widzieliśmy do tej pory, używaliśmy zmiennych o nazwach takich jak X, Y i Z. Jednak nazwy mogą być takie same jak długo chcesz, na przykład: Odpowiedz Slepa_mysz_3 Bardzo_dluga_nazwa_zmiennej
Zmienne c.d. Czasem trzeba użyć zmiennej, ale jej nazwa nigdy nie będzie używana. Na przykład, jeśli chcemy dowiedzieć się, czy ktoś lubi Johna, ale nie musimy wiedzieć, kto to jest, możemy użyć anonimowej zmiennej. Anonimowa zmienna jest zapisywana jako pojedynczy znak podkreślenia. Nasz przykład został napisany w Prologu jako: ?lubi(_,john) true .
Struktury Trzecim rodzajem terminu, z którymi są pisane programy Prolog, to struktura. Struktura jest pojedynczym obiektem składającym się z kolekcji innych obiektów, nazywanych komponentami. Komponenty są zgrupowane w jedną strukturę dla wygody w posługiwaniu się nimi.
Struktury c.d. Rozważmy następujący fakt, że John jest właścicielem książki zatytułowanej Metro 2033 napisanej przez Dmitrija Głuchowskiego owns(john, ksiazka(metro_2033, gluchowski)). Mamy strukturę o nazwie książka, która ma dwa składniki, tytuł i autor. Jeśli chcemy, możemy również mieć inną strukturę nazwiska autora owns(john, ksiazka(metro_2033, autor(dmitrji, gluchowski))).
Struktury c.d. O nasze struktury możemy również wypytywać Prologa. Na przykład: ?- posiada(john,ksiazka(X,autor(Y,gluchowski))). X = metro_2033, Y = dmitrij. ?- posiada(john,ksiazka(_,autor(_,gluchowski))). true.
Znaki Nazwy stałych i zmiennych są zbudowane z ciągów znaków Mimo że każdy rodzaj nazwy (atom, liczba całkowita, zmienna) ma specjalne zasady dotyczące znaków, dobrze jest wiedzieć, jakie są wszystkie znaki które Prolog rozpoznaje Poniżej znajdują się wszystkie znaki drukowane które można wykorzystać ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnoprstuvwxyz 012345678 9 ! "# $% & '() = - ~ A | \ {} [] _ '@ +; *: <>,.? /
Arytmetyka Wiele osób używa komputerów do wykonywania operacji na liczbach. Operacje arytmetyczne są przydatne do porównywania liczb i do obliczania wyników Najpierw rozważ porównywanie liczb. Biorąc pod uwagę dwie liczby, możemy stwierdzić, czy jedna liczba jest równa drugiej lub mniejsza od drugiej lub większa od drugiej. Do porównywania liczb będziemy używać tych predyktów: X =: = Y X i Y oznaczają tę samą liczbę X = \ = Y X i Y oznaczają różne liczby X <Y X jest mniejsze niż Y X> Y X jest większe niż Y X = <Y X jest mniejsze lub równe Y X> = Y X jest większe lub równe Y
Arytmetyka c.d Dla przykładu posłużymy się bazą danych królów i dat kiedy sprawowali oni władzę w naszym państwie: panowal(boleslaw_chrobry,1025,1025). panowal(mieszko_2,1025,1031). panowal(boleslaw_szczodry,1076,1079). panowal(przemysl_2,1295,1296). panowal(wladyslaw_lokietek,1320,1333). krol(X,Y):-panowal(X,A,B),Y>=A,Y=<B.
Arytmetyka Teraz możemy zapytać Prologa np. Czy Bolesław Chrobry był królem polski w 1025r: ?- krol(boleslaw_chrobry,1025). true. Możemy również dowiedzieć się kto sprawował władze w danym roku: ?- krol(X,1077). X = boleslaw_szczodry .
Koniec Dziękujemy za uwagę