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)

Podobne dokumenty