Paradygmaty Programowania Język Prolog Celem ćwiczenia jest zapoznanie się z podstawowymi możliwościami języka Prolog w zakresie definiowania faktów i reguł oraz wykonywania zapytań. Wstęp Prolog (od francuskiego Programmation en Logique) to język programowania logicznego - program w Prologu to opis reguły wnioskowania oraz celu do którego zmierzamy, a rola komputera polega na odpowiednim zastosowaniu reguł aby znaleźć rozwiązanie. Prolog został stworzony w 1971 roku przez Alaina Colmeraurera i Phillipe a Rousela. Używany w wielu programach z zakresu sztucznej inteligencji. Programowanie w Prologu bardzo różni się od programowania w językach algorytmicznych. W Prologu podaje się bazę faktów i reguł. Potem można wykonywać zapytania na tej bazie. Podstawową jednostką w Prologu jest predykat. Predykat składa się z nagłówka i argumentów, na przykład: ojciec(tomasz, agata). gdzie ojciec to nagłówek a tomasz i agata to argumenty. Predykat może zostać użyty do wyrażenia pewnych faktów o świecie, które są znane dla programu. W tym przypadku programista musi nadać im znaczenie. Jedną z interpretacji zdania ojciec(tomasz, agata) jest "tomasz to ojciec agaty". Jednak równie dobrze mogłoby to znaczyć "ojcem tomasza jest agata". Prolog nie ma pojęcia, co oznaczają te stwierdzenia. Wszystko co robi to manipulacja symbolami w oparciu o reguły. Dlatego można wybrać dowolny sposób zapisu tego, że "tomasz to ojciec agaty", pod warunkiem konsekwentnego przestrzegania kolejności argumentów w całym programie. Baza danych Prologu może też zawierać reguły. Przykład reguły to: jest(światło) :- włączony(przycisk). Zapis :- oznacza "wtedy, gdy" lub "jeśli". Ta reguła oznacza, że zdanie jest(światło) jest prawdziwe wtedy, gdy prawdziwe jest zdanie włączony(przycisk). Reguły mogą używać zmiennych. Zmienne zapisuje się zaczynając od wielkiej litery, dla odróżnienia od stałych, zaczynających się z małej. Na przykład: ojciec(x, Y) :- rodzic(x, Y), jest_rodzaju_męskiego(y). To oznacza: "dla każdych X i Y, jeśli rodzic(x,y) i jest_rodzaju_męskiego(y) to ojciec(x, Y). Przygotowanie środowiska języka Prolog
Środowisko języka Prolog dostępne jest w katalogu GNU-Prolog. Aby uruchomić program należy w katalogu bin uruchomić plik gprolog.exe. Ćwiczenie 1 Wprowadzenie prostych faktów. Utwórz katalog dla swoich celów, może to być również katalog Moje Dokumenty. Otwórz notatnik i zapisz plik jako zad1.pl. Następnie w programie GNU-Prolog należy zmienić katalog roboczy poprzez File/Change dir i ustawić ten wybrany wcześniej do naszych celów. Zadnie będzie polegać na wpisaniu kilku faktów. Ustalimy, że osoby Ala, Ola i Marta są kobietami. kobieta(ala). kobieta(ola). kobieta(marta). granagitarze(ola). To jest prosty program w Prologu. Należy zwrócić uwagę na wielkość liter. Wszystko piszemy rozpoczynając małą literą. Spróbujmy wykorzystać teraz tę bazę wiedzy. Zawartość pliku wczytujemy do Prologu poleceniem [zad1]. Jeżeli wszystko poszło dobrze, powinniśmy po wpisaniu komendy listing. Zobaczyć nasz program. Teraz możemy zadawać pytania do naszej bazy wiedzy. Np. pisząc?- kobieta(ola). sprawdzamy, czy Ola jest kobietą. Prolog odpowie nam Yes czyli tak. Stwierdziliśmy oczywisty fakt zapisany w bazie wiedzy. Podobnie możemy zapytać czy?- granagitarze(ola). Odpowiedź oczywiście brzmi tak. Proszę samodzielnie sprawdzić, czy: - na gitarze gra Ala, - Jacek jest kobietą. Ćwiczenie 2 Utwórz plik zad2.pl. szczesliwa(yolanda).
granagitarze(mia):-sluchamuzyki(mia). granagitarze(yolanda):-sluchamuzyki(yolanda). sluchamuzyki(mia). sluchamuzyki(yolanda):-szczesliwa(yolanda). Znajdują się tutaj dwa fakty: szczesliwa(yolanda) i sluchamuzyki(mia). Oraz trzy reguły. Reguła charakteryzuje się tym, że znajduje się znacznik :- oznaczający jeżeli. Reguła: sluchamuzyki(yolanda):-szczesliwa(yolanda). oznacza, że yolanda słucha muzyki, jeżeli jest szczęśliwa. Część przed :- nazywa się nagłówkiem, część za nazywa się ciałem. Jeżeli ciało jest prawdzie, wówczas nagłówek jest również prawdziwy. Zadajmy zapytanie:?- granagitarze(mia). Prolog odpowie yes, dlaczego? granagitarze(mia) nie jest faktem, ale wynika bezpośrednio z reguły granagitarze(mia):-sluchamuzyki(mia), a stwierdzenie sluchamuzyki(mia) jest faktem. Teraz zadajmy pytanie:?- granagitarze(yolanda). Prolog odpowie yes. Ten fakt Prolog wydedukował z dwóch reguł. Ponieważ yolanda jest szczęsliwa (szczesliwa(yolanda)) to zgodnie z regułą sluchamuzyki(yolanda):-szczesliwa(yolanda) słucha również muzyki. Ten wydedukowany z kolei fakt jest podstawą dla kolejnej reguły granagitarze(yolanda):-sluchamuzyki(yolanda). i stąd Prolog odpowiada na pytanie pozytywnie. Sprawdź, czy mia jest szczęśliwa. Ćwiczenie 3 Utwórz nowy plik zad3.pl. szczesliwy(wojciech). sluchamuzyki(bartek). granagitarze(wojciech):-sluchamuzyki(wojciech), szczesliwy(wojciech). granagitarze(bartek):-szczesliwy(bartek). granagitarze(bartek):-sluchamuzyki(bartek). Mamy tu dwa fakty szczesliwy(wojciech) i sluchamuzyki(bartek) oraz trzy reguły. Regułę granagitarze(wojciech):-sluchamuzyki (wojciech), szczesliwy (wojciech).
czytamy w ten sposób, że Wojciech gra na gitarze, jeżeli słucha muzyki i jest szczęśliwy. Czyli muszą być prawdziwe jednocześnie dwa stwierdzenie, które znajdują się za :-. Zadajmy pytanie?- granagitarze(wojciech). Odpowiedź to no. Dlaczego? Ponieważ fakty mówią, że Wojciech jest tylko szczęśliwy, a nie słucha muzyki. A czy Bartek gra na gitarze? Zadaj pytanie.?- granagitarze(bartek). Odpowiedz brzmi yes. Dlaczego? Ponieważ mamy dwie reguły mówiące kiedy Bartek gra na gitarze granagitarze(bartek):-szczesliwy(bartek). granagitarze(bartek):-sluchamuzyki(bartek). Wystarczy, że tylko jedna z nich jest prawdziwa, aby Bartek grał na gitarze. W naszym przypadku to druga z powyższych reguł, ponieważ sluchamuzyki(bartek). Inny zapis powyższych dwóch reguł to: granagitarze(bartek):-szczesliwy(bartek) ; sluchamuzyki(bartek). gdzie średnik oznacza LUB, czyli jeden z dwóch faktów ma być prawdziwy. W przypadku przecinka, obydwa fakty muszą być prawdziwe. Ćwiczenie 4 Utwórz nowy plik zad4.pl. kobieta(mia). kobieta(jody). kobieta(yolanda). kocha(vincent,mia). kocha(marcellus,mia). kocha(pumpkin,kroliczek). kocha(kroliczek,pumpkin). Mamy tu zbiór faktów. W ćwiczeniu tym zobaczymy jak działają zmienne. Napiszmy na przykład:?-kobieta(x). X jest zmienną (ważna jest tu wielkość liter. Do tej pory reguły i fakty pisane były małą literą, nazwę zmiennej piszemy zaczynając dużą literą. Powyższą linijkę można przeczytać jako: Powiedz jakie znasz kobiety. W odpowiedzi Prolog będzie pod X podstawiał kolejne znane mu kobiety. Rozpoczyna od mia X = mia?
Następnie można wymieniać resztę kobiet wpisując średnik (wymieniane są kolejno) bądź wszystkie naraz wciskając klawisz a. Teraz zapytajmy się: Czy jest jakaś osoba, która jest kobietą i którą kocha Marcellu? Zapytanie będzie wyglądać tak:?- kocha(marcellus, X), kobieta(x). Dla przypomnienia, przecinek oznacza logiczne AND, czyli i. Czyli muszą być spełnione dwie rzeczy osoba X musi być kobietą i jednocześnie kocha ją marcellus. Sprawdź, kto kocha mia? Kto kocha pumpkin? Ćwiczenie 5 W nowym pliku zad5.pl wpisz następujące fakty i regułę kocha(vincent,mia). kocha(marcellus,mia). kocha(pumpkin,kroliczek). kocha(kroliczek,pumpkin). zazdrosny(x,y):-kocha(x,z), kocha(y,z). Mamy tu 4 fakty i jedną regułę. W regule pojawiły się zmienne X, Y oraz Z. Dzięki tej regule możemy określić kto jest o kogo zazdrosny. Osoba X jest zazdrosna o osobę Y jeżeli osoba X kocha jakąś osobę Z i osoba Y kocha osobę Z. Przy czym osoba Z jest dowolną osobą. Zapytajmy, czy i o kogo jest zazdrosny marcellus?- zazdrosny(mercellus, W). W odpowiedzi dostaliśmy Vincenta oboje z Marcellusem kochają bowiem Mia. Czy ktoś jest zazdrosny o kroliczka? Potrafisz znaleźć wszystkie zazdrosne osoby? Zmodyfikuj regułę w następujący sposób: zazdrosny(x,y) :- kocha(x,z), kocha(y,z), X \== Y. Instrukcja X \== Y oznacza, że osoba X nie jest taka sama jak Y. Spróbuj teraz wczytać ponownie plik zad5 i teraz sprawdź wszystkich zazdrosnych. Ćwiczenie 6 Przedstaw w prologu następujące fakty i reguły - Mia i Marcellus są małżeństwem - Brutus jest żebrakiem
- jeżeli Brutus jest żebrakiem to Brutus jest biedny - jeżeli Brutus jest biedny to Brutus jest głodny - jakie zadać pytanie by sprawdzić, czy Brutus jest głodny? - Mia kocha każdego, kto jest dobrym tancerzem. - Julia lubi wszystko, co jest słodkie. Ćwiczenie 7 Przyjrzyj się poniższym faktom i regułom marozczke(harry). marozczke(ron). graczquidditcha(harry). czarodziej(x):-mamiotle(x), marozczke(x). mamiotle(sprzataczka). mamiotle(x):-graczquidditcha(x). Odpowiedz na pytania, sprawdź odpowiedzi uruchamiając program w Prologu. - czarodziej(ron). - czarodziej(harry). - czarodziej(sprzataczka). - czarodziejka(sprzataczka). - czarodziej(x). Ćwiczenie 8 Praktycznie zastosowanie programowania w Prologu. Ściągnij program zgadywanka.pl. Wgraj go do twojego katalogu roboczego. Uruchom program SWI-Prolog. Program ten uruchamiamy plwin.exe, który znajduje się w katalogu bin. Następnie wybierz File/Consult i wskaż na plik zgadywanka.pl. Program uruchamia się wykonując polecenie?- zacznij.