Laboratorium przedmiotu „Paradygmaty Programowania”
Transkrypt
Laboratorium przedmiotu „Paradygmaty Programowania”
Laboratorium przedmiotu „Paradygmaty Programowania” Laboratorium 9 Prolog – podstawy 1. Podstawy Prologu Programowanie w Prologu polega na deklarowaniu: • Faktów – dotyczących pewnych obiektów z „analizowanego świata” • Reguł – dotyczących związków między obiektami z „analizowanego świata” • Zapytań – o obiekty i związki między nimi. Zdefiniowany w Prologu zbiór faktów oraz reguł określa się mianem bazy wiedzy. 1.1 Fakty Podstawową jednostką programistyczną w Prologu jest predykat. Predykaty mogą opisywać fakty ze świata, który chcemy przedstawić w programie. Każdy predykat składa się z nazwy oraz argumentów. Przykładowo moglibyśmy zdefiniować w Prologu następujące fakty: mezczyzna(jan). mezczyzna(tomasz). kobieta(maria). kobieta(edyta). kobieta(adam). W powyższym przykładzie zdefiniowanych zostało pięć prostych faktów mówiących, że „Jan jest mężczyzną”, „Tomasz jest mężczyzną”, „Maria jest kobietą”, „Edyta jest kobietą”, „Adam jest kobietą”. Należy zwrócić uwagę na kilka elementów: a) Program opisuje pięć obiektów: jan, tomasz, maria, edyta, adam i dwie relacje mezczyzna, kobieta. b) W predykacie najpierw podaje się nazwę relacji, a następnie nazwy obiektów, których ta relacja dotyczy. Nazwy obiektów ujęte są w nawiasy okrągłe. c) Fakt musi się kończyć kropką. d) Prolog nie wie kto jest mężczyzną, kto kobietą (nie wie nawet jak odróżnić kobietę od mężczyzny). To programista nadaje sens programowi. Predykaty mogą mieć dowolną liczbę argumentów, co pokazuje następny przykład. lubi(jan, maria). lubi(edyta, tomasz). Powyższe fakty mówią, że „Jan lubi Marię” oraz, że „Edyta lubi Tomasza”. Podobnie jak w poprzednim przypadku, tutaj również predykaty te mają sens tylko przy odpowiedniej interpretacji nadanej przez programistę (Prolog nie wie co oznacza relacja „lubi”). Jeżeli tworzymy predykaty posiadające więcej niż jeden argument należy zwrócić uwagę na kolejność ich zapisu (którą również definiuje programista). 1.2 Zapytania Po zdefiniowaniu bazy wiedzy możemy zadawać zapytania, które się jej dotyczą. Składnia zapytania jest w zasadzie taka sama jak dla definiowania faktów, aczkolwiek poprzedza się je symbolem ?-. ?- mezczyzna(jan). true. ?- kobieta(maria). true. ?- lubi(jan, edyta). false. 1.3 Zmienne Oczywiście, gdyby w Prologu można było wydawać tylko zapytania o fakty, które są bezpośrednio umieszczone w bazie wiedzy, możliwości jego zastosowania byłyby bardzo ograniczone. Dodatkowo korzystanie z tego systemu bardzo niewygodne, gdyż aby dowiedzieć się „kogo lubi Jan” należałoby wydać odpowiednie zapytanie dla wszystkich osób wprowadzonych do bazy wiedzy. Na szczęście w Prologu nie ma takiej konieczności, a zapytanie, które odpowiadałoby na powyższe pytanie przyjmie postać: ?- lubi(jan, X). W powyższym zapytaniu X, jest zmienną pod którą Prolog podstawi odpowiednie obiekty, tak aby cały predykat dało się potwierdzić. W tym przypadku odpowiedź będzie wyglądała następująco: X = maria. Należy zwrócić uwagę, na fakt, że zmienna została zapisana z dużej litery. Jest to wymóg Prologu, który w ten sposób odróżnia zmienne od pozostałych obiektów w systemie (dlatego imiona zawarte w przykładach umieszczonych w tej instrukcji nie zostały zapisane z dużej litery). Jeżeli do naszej bazy wiedzy dodamy fakt: lubi(jan, edyta). i wydamy zapytanie „Kogo lubi Jan?” to na ekranie uzyskamy odpowiedź: X = maria W tym momencie Prolog zatrzyma wykonywanie programu i będzie czekał na dalsze komendy. Jeżeli podamy „;” to na ekranie wyświetli się następna odpowiedź: X = edyta. Jeżeli podamy „.” Prolog przyjmie, że pozostałe odpowiedzi nas nie interesują i przerwie przeszukiwanie bazy wiedzy. 1.4 Reguły W chwili obecnej nasza baza wiedzy wygląda następująco: mezczyzna(jan). mezczyzna(tomasz). kobieta(maria). kobieta(edyta). kobieta(adam). lubi(jan, maria). lubi(edyta, tomasz). lubi(jan, edyta). Przyjmijmy, że w naszym modelowanym świecie, zachowane jest prawo: „Przyjaciel mojego przyjaciela jest moim przyjacielem”. Innymi słowy, na podstawie tego prawa możemy naszą bazę wiedzy rozszerzyć o fakt, że „Jan lubi Tomasza”. W przypadku tak krótkiej bazy wiedzy, przeanalizowanie wszystkich faktów nie stanowi, żadnego problemu, jednak jeżeli liczba faktów będzie znacząco większa, a prawa zachodzące w modelowanym świecie bardziej złożone to ręczne ich zapisanie staje się prawie niemożliwe (a przynajmniej bardzo czasochłonne). W Prologu możemy jednak to zadanie scedować na system rozszerzając naszą bazę wiedzy o ogólne reguły. Dla naszego prawa, reguła wyglądała by następująco: przyjacielMojegoPrzyjaciela(X, Y) :- lubi(X, Z), lubi(Z, Y). Składnia reguły w Prologu jest następująca: • Nazwa reguły, • Parametry reguły ujęte w nawiasy okrągłe, • Symbol „:-”, • Ciało reguły. Najczęściej reguły wyrażają, jakieś fakty złożone, dlatego często można w nich spotkać kilka predykatów połączonych odpowiednimi spójnikami (w przypadku tego laboratorium – logicznymi, które podsumowuje tabela 1) Tabela 1 Operatory logiczne w Prologu Operator , : \+ == \= Znaczenie Koniunkcja, logiczne „i” Alternatywa, logiczne „lub” Negacja Równe Różne 2. SWI-Prolog Jedną z implementacji języka Prolog jest SWI-Prolog. Jest to oprogramowanie darmowe, które można ściągnąć ze strony: www.swi-prolog.org. Po zainstalowaniu i uruchomieniu zobaczymy okno interpretera: w którym możemy rozpocząć wydawanie zapytań dla bazy wiedzy. Samą bazę wiedzy możemy zapisać w osobnym pliku (z rozszerzeniem .pl) i wczytać podczas uruchamiania programu (prolog nazwa_pliku.pl), lub skorzystać z wbudowanego edytora uruchamianego z menu File>New. Po wybraniu tej opcji z pliku zostaniemy poproszeni o podanie nazwy nowego pliku z bazą wiedzy, a następnie otwarte zostanie okno, w którym możemy wprowadzać fakty i reguły (rysunek 2) Po zakończeniu wprowadzania danych należy wybrać opcję Compile > Compile buffer i jeżeli nie popełniliśmy żadnego błędu w oknie interpretera będziemy mogli wydawać zapytania. 3. Zadania Zadanie 1. Proszę zapisać w Prologu następujące fakty: a) b) c) d) Adam lubi muzykę. Barack Obama przyjechał do Polski. Antoni dał Ani czekoladę. Teofil zaliczy Paradygmaty Programowania Zadanie 2. Proszę zapisać reguły odpowiadające następującym stwierdzeniom. a) b) c) Jeżeli X jest dziadkiem Y to Y jest wnukiem lub wnuczką. Dwie osoby są rodzeństwem, jeżeli mają tych samych rodziców. Jeżeli student zaliczy Paradygmaty Programowania i zda egzamin z Baz danych to będzie miał spokojne wakacje. Zadanie 3. Proszę zapisać reguły, które opisują następujące relacje pokrewieństwa: a) b) c) d) matka(X,Y). syn(X,Y). brat(X, Y). dziadek(X,Y). UWAGA! Być może konieczne będzie zdefiniowanie również innych reguł. Zadanie 4. Wyrazić w Prologu wszelkie relacje rodzinne takie jak: dziadek, babcia, syn, dziecko, córka, brat, siostra, stryj(brat ojca), wuj(brat matki), ciotka, potomek, przodek, kuzyn, żona, mąż, krewny, liczba potomków itd. dla dowolnej bazy danych, która zawiera relacje: ojciec(s,s), matka(s,s), plec(s,s)