Prolog - rozwinięcie

Bardziej zaawansowane możliwości języka Prolog

Pisanie programu w Prologu (przypomnienie)

Przykład programu zapisanego w Prologu:

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)

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] ;

Dekompozycja i strukturalizacja list jest realizowana głównie przez mechanizm unifikacji, a co za tym idzie w.w. notacja jest jej podstawą. Na przykład:
?- [X,Y|Z]=[a,b,c,d].

X = a
Y = b
Z = [c, d] ;

?- [X,Y,a]=[Z,b,Z].

X = a
Y = b
Z = a ;

Przynależność do listy

Zapiszemy klauzulę nalezy(Element, Lista), który będzie prawdziwy, gdy dany element należy do podanej listy i fałszywy w przeciwnym wypadku.

Co to znaczy, że element należy do listy?
Reguła 1. Element należy do listy, jeżeli jest jej pierwszym elementem… :)

Jak można zapisać tą regułę w Prologu?

A może prościej? Zamiast reguły zapiszmy fakt…
Fakt 1. Element należy do listy, której jest jej pierwszym elementem… :)

Jak można zapisać tą regułę w Prologu?

Ale co dalej? Jeśli to nie jest pierwszy element listy…
Reguła 2. Element należy do listy, jeżeli należy do listy elementów bez pierwszego… :)

Jak można zapisać tą regułę w Prologu?

A jak sprawdzić czy element należy do tej pomniejszonej listy elementów? … Zacznij od początku - wróć do reguły pierwszej…

Działanie tej pary reguł opiera się na zasadzie rekurencji.

ĆWICZENIA

Ćwiczenie 1: Przynależność do listy

Zapisać predykat nalezy z powyższego przykładu w pliku listy.pl.

Sprawdzić i umieć wytłumaczyć działanie poniższych:

?- nalezy(c,[a,b,c,d]).

?- nalezy(x,[a,b,c,d]).

?- nalezy(X,[a,b,c,d]).

?- nalezy(x,a).

?- nalezy(X,a).

Ćwiczenie 2: Liczenie elementów

Zaproponować sposób działania klauzyli dlugosc(Lista, Dlugosc), który obliczy długość podanej listy do zmiennej długość (lub innymi słowy sprawdzi, czy podana lista ma podaną długość).

Rozwiązanie powinno być analogiczne do przykładu z predykatem nalezy i powinno wykorzystywać zasadę rekurencji.

Zapisz klauzulę w języku prolog.

Dopisać predykat dlugosc do pliku listy.pl

Sprawdzić i umieć wytłumaczyć działanie poniższych:

?- dlugosc([a,b,c],X).

?- dlugosc([a,b,c,d],3).

Rozwiazanie zagadki logicznej w języku Prolog

Zagadka Einsteina:

1. Jest pięć domów.
2. Anglik mieszka w czerwonym domu.
3. Hiszpan ma psa.
4. Kawę pija się w zielonym domu.
5. Ukraińczyk pije herbatę.
6. Zielony dom stoi zaraz na prawo od domu w kolorze kości słoniowej.
7. Palacz papierosów "Gold Old" hoduje ślimaki.
8. Papierosy "Kools" pali się w zółtym domu.
9. Mleko pija się w środkowym domu.
10. Norweg mieszka w pierwszym domu.
11. Osoba paląca "Chesterfieldy" żyje w domu, obok osoby, hodującej lisa.
12. "Kools"-y pali się w domu zaraz obok tego, w którym hoduje się konie.
13. Palacze "Lucky Strike" piją sok pomarańczowy.
14. Japończyk pali "Parliments".
15. Norweg żyje obok niebieskiego domu.

Kto pije wodę?
Kto hoduje zebrę?

Dla ciekawskich ;)

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