Wprowadzenie do środowiska programowania w Prologu
Co to jest Prolog?
Prolog to język programowania w logice (PROgrammation en LOGique, PROgramming in LOGic).
więcej na Wikipedii: Prolog (język programowania)
SWI Prolog
Współcześnie jest dostępnych szereg implementacji Prologu, w tym swobodnie dostępne kompilatory Prologu:
np:.
- SWI-Prolog, Jan Wielemaker, http://www.swi-prolog.org
- GNU-Prolog, Daniel Diaz, http://gnu-prolog.inria.fr
- dostępne przez www (wymagana zainstalowana Java): http://ktiml.mff.cuni.cz/~bartak/prolog/testing.html
W czasie zajęć będziemy pracować w środowisku SWI-Prolog.
Proszę pobrać plik tego programu ze strony http://www.swi-prolog.org/download/stable (wybrać SWI-Prolog/XPCE for Windows NT/2000/XP/Vista/7)
Link bezpośredni do aktualnej wersji: http://www.swi-prolog.org/download/stable/bin/w32pl5102.exe
Podstawowym interfejsem w SWI-Prologu jest powłoka (konsola).
Jest ona bardzo podobna do konsoli spotykanej w systemach unixowych, oczywiście z uwzględnieniem specyfiki programowania w Prologu.
Pisanie programu w Prologu
Elementy składniowe programu:
- atomy: stałe znakowe — pisane z małej litery,
- niewiadome/szukane (tzw. zmienne logiczne) — pisane z wielkiej litery,
- termy: symbole funkcyjne przyjmujące argumenty — pisane z małej litery z argumentami w nawiasie
Przykład programu zapisanego w Prologu (http://wazniak.mimuw.edu.pl/):
lubi(jan, tatry).
lubi(jan, beskidy).
lubi(jerzy, beskidy).
lubi(jerzy, bieszczady).
lubi(józef, sudety).
lubi(justyna, gświętokrzyskie).
bratniadusza(X, Y) :- lubi(X, S), lubi(Y, S), X \= Y.
Program składa się z
- szeregu klauzul (ang. clause), wyróżniamy:
- fakty (klauzule proste)
- reguły (klauzule złożone)
- oraz celu (ang. goal)
Fakty i reguły należy zapisać w osobnym pliku (z rozszerzeniem *.pl). Cele (zapytania) wywoływane są z poziomu konsoli.
Fakty i reguły stanowią "wiedzę" (którą należy wcześniej zadeklarować), w której odnajdywane są odpowiedzi na zapytania.
Uruchamianie programu
W celu uruchomienia programu należy załadować plik z kodem (rozszerzenie *.pl) w języku Prolog.
Możemy w tym celu wykorzystać polecenie:
- menu File->Consult… u góry ekranu (a następnie wybieramy plik z katalogu)
- ręcznie w konsoli wpisujemy predykat consult (skrót: [nazwa].)
Operację tę należy powtarzać po każdej modyfikacji kodu.
- Proszę sprawdzić działanie systemu pomocy, przez predykat help., a następnie przeczytać opis do predykatu consult (help(consult).) .
- Proszę wyjść z powłoki przez halt.
- UWAGA: każda „linia kodu” w Prologu musi się kończyć kropką!
Programowanie nieklasyczne
Prolog NIE jest klasycznym językiem programowania.
Nie ma w nim:
- słów kluczowych, (if, for…)
- brak rozróżnienia we/wy
- brak funkcji
- brak zmiennych (klasycznych)
- brak jawnej sekwencyjności, czy iteracyjności
Prolog dostarcza:
- metody strukturalizowania informacji, termy
- programowania deklaratywnego
- rekurencji, jak metody przetwarzania informacji
- unifikacji - mechanizmy dopasowywania wzorców
- rezolucji - metody wnioskowani logicznego
- strategii sterowania wnioskowaniem
Ćwiczenie 1: Pisanie prostych programów
- Proszę przyjrzeć się poniższemu, prostemu programowi (klasyczny przykład „Rodzina”).
kobieta(ola).
kobieta(lila).
mezczyzna(tomek).
mezczyzna(max).
rodzic(ola,max).
rodzic(tomek,max).
rodzic(tomek,lila).
Proszę uruchomić wybrany zewnętrzny edytor tekstu (np. Notatnik) i wpisać w nim analogiczny program (dotyczący własnej rodziny). Program należy zapisać w pliku przyklad1.pl
Ćwiczenie 2: Uruchamianie programów
- W powłoce SWI należy wczytać napisany uprzednio program: [przyklad].
- Program jest kompilowany, a zawarta w nim wiedza dodawana do bazy wiedzy dostępnej z powłoki SWI. Można to sprawdzić przy pomocy polecenia:
kobieta(X).
- Po ukazaniu się pierwszej odpowiedzi należy wcisnąć klawisz średnika
;
by wyszukać kolejne dopasowania.
Ćwiczenie 3: Praca z programem
- Systemowi można teraz zadawać pytania, cele do zrealizowania. Proszę zapoznać się z propozycjami poniższych pytań i zapisać je w Prologu. (przykładowe pytania dotyczą przykładu z ćwiczenia 2):
- Kto jest mężczyzną?
- Czy Tomek jest mężczyzną?
- Czy Smerfus jest mężczyzną?
- Czy Ola jest rodzicem Max-a?
- Czyim rodzicem jest Ola?
- Czy zamiast X można wpisać inny symbol? Jaki?
- Kto jest rodzicem Max-a?
Ćwiczenie 4: Rozbudowa programu
Proszę rozbudować program do poniższej, analogicznej (co do liczby osób i zależności) formy:
rodzic(ola,max).
rodzic(tomek,max).
rodzic(tomek,lila).
rodzic(max,ania).
rodzic(max,kasia).
rodzic(kasia,radek).
kobieta(ola).
kobieta(lila).
kobieta(kasia).
kobieta(ania).
mezczyzna(tomek).
mezczyzna(max).
mezczyzna(radek).
Czy kolejność wpisywania linii ma znaczenie?
UWAGA: aby dopisane fakty były dostępne dla Prologu, należy go ponownie wczytać!
Jeżeli koniunkcję celów oznaczamy przecinkiem
,
to jak zapytać:
- kto jest matką
- a kto ojcem Max-a?
Napisz odpowiednie zapytania i sprawdź ich działanie.
Ćwiczenie 5: Reguły
Proszę dopisać poniższe reguły i sprawdzić ich działanie.
Reguła z wykorzystaniem innej reguły:
Reguła z rekurencją:
UWAGA: w Prologu niemożliwe jest zadeklarowanie reguły o postaci np. a;b :- c (gdzie ";" czytamy jako "lub"), gdyż nie można jej sprowadzić do klauzuli Horna (w koniunkcyjnej postaci normalnej: klauzula, w której co najwyżej 1 element jest niezanegowany).
Notacja list
Lista to uporządkowany zbiór elementów. Elementem może być dowolna struktura danych w Prologu.
Listę zapisujemy:
[a,b,c]
[2,4,6,ala,ma,kota]
[]
Każda lista składa się z:
- głowy (ang. head), która jest pierwszym elementem listy, oraz
- ogona (ang. tail), który jest zawsze listą
Listę od ogona rozdzielamy operatorem | (pionowa kreska), np.:
?- [X|Y]=[a,b,c,d].
X = a
Y = [b, c, d] ;
Ćwiczenie 6: Dodawanie elementu do listy
Zapisz klauzulę prostą w dowolnym pliku *.pl.
dodaj(Element,Lista,[Element|Lista]).
Dodaj element do dowolnej listy (z poziomu konsoli).
Zadanie: Opisz eksperyment za pomocą faktów i reguł.
Eksperyment dotyczy zjawisk maskowania i "odmaskowania" tonu emitowanego wraz z szumem do jednego z uszu. Przypadki testowane w eksperymencie objaśnia rysunek.
Proszę napisać reguły, które umożliwią sprawdzenie w jakich warunkach zachodzi maskowanie i odmaskowanie, i sprawdzić je w konsoli.
Podpowiedź (zestaw klauzul):
Podpowiedź (cele):
Materiały dodatkowe
Parser w Prologu http://en.literateprograms.org/Parser_(Prolog)