Prolog

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:.

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)

© A. Czoska, M. Komosiński, B. Kroll, A. Kupś, A. Mensfelt, B. Szopka