SE/LS/L1

From WikiZMSI

< SE | LS

Spis treści

Wstęp do Prologu

Na zajęciach wykorzystywany będzie SWI Prolog. Oficjalna strona SWI Prolog zawiera dokumentację jak i wersję kompilatora na dowolną platformę.

Programowanie w Prologu - kilka użytecznych linków:

Materiał na laboratoria jest głównie zaczerpnięty z książki "PROLOG Programming for Artificial Intelligence" Ivana Bratko (ISBN: 0-201-40375-7). W języku polskim dostępna jest pozycja "Prolog. Programowanie." autorstwa W.F. Clocksin i C.S. Mellish. wyd. Helion, Gliwice 2003.

Co należy wiedzieć zanim...:

  • język deklaratywny;
  • programowanie symboliczne;
  • obiekty i relacje (przykład: Ala ma kota. Pomiędzy obiektami Ala i kot istnieje relacja posiadania jednokierunkowa.);
  • reguły opisują relacje na podstawie innych relacji (przykład: Właściciel to ktoś kto coś posiada.);
  • program składa się z faktów i reguł (klauzul/predykatów) zapisanych w odpowiedniej składni.



Deklarowanie faktów

1. Uruchomić interpreter Prologu (swiprolog) SWISH

2. Utworzyć plik - kod (domyślne rozszerzenia dla źródeł w prologu to .pl lub .pro)

3. Wpisać następujące fakty (tylko część z ramek):

  • Ala lubi koty.
lubi( ala, koty). 
  • Marek lubi psy.
lubi( marek, psy). 
  • Ala jest kobietą.
kobieta( ala). 
  • Marek jest mężczyzną.
mezczyzna( marek).

Zapytania

1. W trybie zapytań zadaj pytania do wprowadzonych faktów:

  • Czy Ala lubi koty?
lubi( ala, koty). 
  • Czy Marek jest kobietą?
kobieta( marek). 
  • Czy Jan jest mężczyzną?
mezczyzna( jan). 
  • Czy psy lubią Marka?
lubi( psy, marek). 

2. Zadaj pytania ze zmiennymi:

  • Czy jest coś co lubi Ala?
lubi( ala, X). 
  • Czy wiesz coś o istnieniu kobiet?
kobieta( Y). 
  • Czy psy są przez kogoś lubiane?
lubi( Ktos, psy). 

3. Zadaj pytania złożone:

  • Czy Ala lubi koty i Marek lubi koty?
lubi( ala, koty),lubi( marek, psy).  
  • Czy Ala jest kobietą i Marek jest mężczyzną?
kobieta( ala), mezczyzna( marek). 

4. Dodaj do pliku pl fakt, że Marek lubi koty i Ola to kobieta i ponownie skompiluj i zapytaj:

  • Czy jest coś co lubi zarówno Ala jak i Marek?
lubi( ala, X), lubi( marek, X).

Dodawanie reguł

1. W pliku źródłowym dopisz reguły:

  • Marek lubi kobiety.
lubi( marek, X) :- 
          kobieta( X). 
  • Ala lubi to co Marek.
lubi( ala, X) :- 
          lubi( marek, X). 

2. W trybie zapytań zapytaj:

  • Co lubi Marek?
lubi( marek, X). 
  • Co lubi Ala?
lubi( ala, X).

Zależności rodzinne

  1. Pobierz plik źródłowy do zależności rodzinnych ⇒ Rodzinka.pro
  2. Narysuj graf zależności pomiędzy osobami.
  3. Skompiluj źródło. Po uruchomieniu można zadawać pytania do faktów wpisanych w źródłowej bazie wiedzy.
  4. Dodaj do źródła następujące reguły.
    • Potomek offspring, to relacja odwrotna do rodzica parent.
    • Matka mother, to rodzic parent płci żeńskiej female.
    • Ojciec father, to rodzic parent płci męskiej male.
    • Dziadek grandparent, to rodzic parent czyjegoś rodzica parent.
    • Siostra sister, to ktoś kto ma tego samego rodzica parent i jest kobietą female.
    • Przodek predecessor - poprzez rekurencyjne sprawdzanie poprzednich pokoleń rodziców parent.
predecessor( X, Z)  :- 
  parent( X, Z).
predecessor( X, Z)  :-   
  parent( X, Y),
  predecessor( Y, Z).

Jak Prolog odpowiada na pytania

Zapisane w źródle fakty i reguły analizowane są od góry do dołu w kolejności wprowadzenia. Szukany jest fakt potwierdzający zapytanie. Jeżeli w pytaniu jest zmienna, to w trakcie wyszukiwania odpowiedzi jest ukonkretniana (podstawiane są pod nią stałe wartości - atomy). Jeżeli zapytanie jest złożone, to zawsze poszukuje się potwierdzenia relacji od lewego do skrajnie prawego. Powrót do wcześniejszych relacji celem sprawdzenia wszystkich kombinacji nazywa się nawracaniem (backtracking). (Szczegóły w literaturze)

Kontrola poprawności programu

SWI Prolog zawiera następujące porty w trybie debugowania klauzul: wejściowe: call, redo i wyjściowe: fail, exit, exception.

Debugger wykonuje program krok po kroku i wywołuje klauzule poleceniem call. Powrót z klauzuli może nastąpić w dwojaki sposób exit: sukces, lub klauzula zawodzi: fail. Jeżeli pojawia się wyjście typu fail to wykonuje się nawrót do sprawdzania klauzuli z możliwą ustalenia alternatywną wartością. Klauzula jest wówczas ponownie wywoływany redo. Sytuacje wyjątkowe są sygnalizowane przez exception.

Dodatkowy port unify pozwala obserwować unifikację.

Zadanie 1 - debugowanie może się odbywać w dwóch trybach [trace] (zatrzymanie się na każdym porcie) lub [debug] zatrzymanie się na ustawionych pułapkach. Wejście do trybów odpowiednio

trace. 

i

debug. 

Predykaty wbudowane: debugging/0, nodebug/0, notrace/0 kontrolują i zamykają tryby śledznia.

1. Wczytać źródło: Family.pro (plik pochodzi z książki I. Bratko).

2. Uruchomić tryb śledzenia [tracer]. Wywoła to procedurę śledzenia odpowiedzi na zadane zapytanie.

3. Zadać zapytanie

mother(pat,jim). 

Prześledzić dowodzenie jego prawdziwości.

4. Dodać punkt śledzenia (pułapka) predykatem wbudowanym spy/1 np.

spy(female). 

dla zapytania mother(pat,jim). UWAGA! Należy pozostać w trybie [debug]. Polecenie zdejmujące punkt śledzenia nospy/1 np.

nospy(female). 

5. Zadać zapytanie

mother(X,jim). 

Prześledzić dowodzenie jego prawdziwości.

6. Wypróbować następujące jednoznakowe polecenia podczas śledzenia:

  • h(elp) ,
  • L(isting),
  • s(kip) --- przejdź do portu wyjściowego (fail, exit) ,
  • a(bort),
  • f(ail) - ustaw 0 dla danego predykatu,
  • g(oal) - lista uzgadnianych predykatów,
  • n(o debug) - wyjście z trybu śledzenia,
  • + (spy) - załóż punkt śledzenia na aktualnym predykacie,
  • - (no spy) - zdejmij punkt śledzenia z aktualnego predykatu,
  • l(leap) - skok do pułapki.

Zadanie 2

1. Przetestować na bazie wiedzy Family.pro

2. Wpisać polecenie

visible(+all) , leash(-exit). 

Nakazuje ono wypisywanie wszystkich portów i zatrzymywanie się w każdym porcie za wyjątkiem exit.

3. Uruchomić tracer.

4. Sprawdzić jak uzyskuje się odpowiedź na zapytanie

predecessor(X,jim). 

Zadanie domowe

  1. Do przeczytania: W.F. Clocksin i C.S. Mellish. "Prolog. Programowanie." - Rozdział 1.
  2. Dokładnie przeanalizować wnioskowanie na przykładach. Dlaczego predykat siostra daje odpowiedź, że każda kobieta, która ma rodzica jest dla siebie siostrą?
  3. Zastanowić się i sprawdzić jak można zdefiniować inne zależności rodzinne (rodzeństwo, ciotka, itd...)
  4. Przygotować się ze składni Prologu.
  5. W pliku Wnioskowanie.pro zapisanych jest osiem klauzul. Zadać pytania:
dark(X),big(X). 
big(X),dark(X). 

przy włączonym trybie śledzenia (trace). Bez trybu trace nie widać różnicy! Rozrysować graf odpowiedzi na podstawie analizy kolejności sprawdzania reguł. Jaka jest liczba nawrotów w jednym i drugim przypadku? PODPOWIEDŹ: zawsze zaczyna się od potwierdzenia prawdziwości pierwszego członu koniunkcji.

  1. W pliku Przodek.pro zapisane są różne warianty rekurencyjnej klauzuli przodek. Należy wpisać je do swojego pliku na zależności rodzinne uruchomić i sprawdzić różnicę w działaniu 4 różnych definicji predykatu? Sprawdzić na pytaniach
predecessor(X,jim). 
predecessor(bob,Y).