Wejściówka z Prologa

Zadanie 1

Odpowiedzi

Napisz klauzulę, która definiuje następujące fakty:
"Antek lubi krokodyle"
Możliwe poprawne odpowiedzi:

lubi(antek, krokodyle).
lubi(krokodyle, antek).
lubi_krokodyle(antek).

i inne :)

"Tomek jest strażakiem"
Możliwe poprawne odpowiedzi:

strazak(tomek).
jest(tomek, strazak).
jest_strazakiem(tomek).

i inne :)

"Anka jest córką Zbigniewa"
Możliwe poprawne odpowiedzi:

corka(anka, zbigniew).
corka(zbigniew, anka).

i inne :)

"Natalia lubi język hindi"
Możliwe poprawne odpowiedzi:

lubi(natalia, jezyk_hindi).
lubi_hindi(natalia).

i inne :)

"Zbyszek jest marynarzem"
Możliwe poprawne odpowiedzi:

marynarz(zbyszek).
jest(zbyszek, marynarz).
jest_marynarzem(zbyszek).

i inne :)

"Bartek lubi Pixies"

lubi(bartek, pixies).
lubi_pixies(bartek).

i inne :)

Komentarz

Zadanie nie było trudne i podstawowa znajomość składni języka Prolog wystarczała do podania prawidłowej odpowiedzi.
Przypominamy jednak, że pisząc program w Prologu należy zwracać uwagę na wielkość liter. Słowa zaczynające się od małej litery są nazwami klauzul lub konkretnych obiektów, nazwy zaczynające się od wielkiej litery lub podkreślinka to zmienne.

Zadanie 2

Odpowiedzi

Zadanie 2 we wszystkich grupach miało analogiczną treść, zmieniała się jedynie płeć i imiona bohaterów.
Przedsawione rozwiązanie na podstawie grupy A.

/* dziadek(A,B) - A jest dziadkiem B 
   ojciec(A,B)  - A jest ojcem B
   dziecko(A,B)  - A jest dzieckiem B */

dziadek(X, Y) :- ojciec(X, Z), dziecko(Y, Z).
dziadek(boleslaw, kuba).

ojciec(boleslaw, ewa).
ojciec(boleslaw, piotr).

dziecko(jacek, ewa).
dziecko(tomek, piotr).

Na podstawie powyższego fragmentu odpowiedzieć jaki będzie wynik poniższego zapytania:

?- dziadek(boleslaw, X).

Poprawna odpowiedź to:

X = jacek;
X = tomek;
X = kuba;

Napisać pełnym zdaniem pytanie reprezentowane przez powyższą klauzulę.
Poprawne odpowiedzi to:

Czyim dziadkiem jest Bolesław?
Dla kogo Bolesław jest dziadkiem?
Jakich Bolesław ma wnuków?

i inne analogiczne.

Komentarz

Aby poprawnie odpowiedzieć wymagane było zrozumienie znaczenia klauzul przedstawionych w programie i podstaw działania mechanizmu wnioskowania w Prologu.

Pierwsze 3 linijki programu to komentarz wyjaśniający znaczenie klauzul użytych poniżej.

Pierwsza z klauzul ma postać reguły:

dziadek(X, Y) :- ojciec(X, Z), dziecko(Y, Z).

Mówi ona, że dowolny osoba reprezentowana przez zmienną X jest dziadkiem osoby reprezentowanej przez zmienną Y jeśli osoba X jest ojcem pewnej osoby Z, której osoba Y jest jednocześnie dzieckiem.

Kolejne klauzule programu to fakty opisane na obiektach reprezentujących konkretne osoby.

dziadek(boleslaw, kuba).

ojciec(boleslaw, ewa).
ojciec(boleslaw, piotr).

dziecko(jacek, ewa).
dziecko(tomek, piotr).

Wiemy zatem, że Bolesław jest dziadkiem Kuby, a także ojcem Ewy i Piotra. Ostatnie dwa fakty mówią nam, że Jacek jest dzieckiem Ewy, a Tomek dzieckiem Piotra.

Na podstawie wiedzy reprezentowanej przez te fakty i regułę opisującą relację dziadek-ojciec-dziecko należało odpowiedzieć na pytanie:

?- dziadek(boleslaw, X).

które można odczytać jako Czyim dziadkiem jest Bolesław?.
Prolog podczas działania będzie przypisywał do zmiennej X kolejne osoby będące wnukami Bolesława.

Z pierwszego faktu:

dziadek(boleslaw, kuba).

jednoznacznie wynika, ze jednym z wnukow Bolesława jest Kuba, dlatego
X = kuba;

Ale dodatkowo znamy regułę:

dziadek(X, Y) :- ojciec(X, Z), dziecko(Y, Z).

która w połączeniu z faktami:
ojciec(boleslaw, ewa).
dziecko(jacek, ewa).

pozwala stwierdzić, że Bolesław jest dziadkiem Jacka (bo Bolesław jest ojcem Ewy, a Jacek jej dzieckiem).
Zatem dodatkowo
X = jacek;

A z połączenia reguły z faktami

ojciec(boleslaw, piotr).
dziecko(tomek, piotr).

możemy stwierdzić, że Bolesław jest też dziadkiem Tomka (bo jest ojcem Piotra, a Tomek jego dzieckiem), zatem
X = tomek;

Na poprawną odpowiedź składają się zatem trzej wnukowie Bolesława:

X = kuba;
X = jacek;
X = tomek;

Kolejność podanych imion nie była brana pod uwagę.

Zadanie 3

Odpowiedzi

Podaj wynik przypisania elementów listy:

Grupa A:

[X, Y, Z | T] = [a, b, c, d, e].

Poprawna odpowiedź:

X = a
Y = b
Z = c
T = [d, e]

Grupa B:

[Z, Y, X | T] = [a, b, c, d].

Poprawna odpowiedź:

X = c
Y = b
Z = a
T = [d]

Grupa C:

[X, Y, Z | T] = [b, a, c, b].

Poprawna odpowiedź:

X = b
Y = a
Z = c
T = [b]

Grupa D:

[Z, Y, X | T] = [a, b, c].

Poprawna odpowiedź:

X = c
Y = b
Z = a
T = []

Komentarz

Do poprawnego rozwiązania wymagana była znajomość list w języku Prolog i notacji głowa - ogon.
Notacja ta ma postać:

[ Glowa | Ogon ]
[ PierwszyElement, DrugiElement, TrzeciElement | Ogon ]

[ X | T ]
[ X, Y | T ]
[ X, Y, Z | T ]

Gdzie głowę stanowi pierwszy (lub kilka pierwszych elementów), a ogon jest listą elementów występujących za głową.

Zatem dla przypisania:

[X, Y, Z | T] = [a, b, c, d, e]

elementy listy [a, b, c, d, e] zostają przypisane do zmiennych X, Y, Z i T.

W tym przykładzie głowę stanowią trzy elementy X, Y i Z, zatem przypisane im zostaną trzy pierwsze elementy listy, odpowiednio:

X = a
Y = b
Z = c

Lista pozostałych elementów zostanie przypisana do ogona T
T = [d, e]

Analogicznie można odpowiedzieć na pytania we wszystkich grupach.
W przypadku, gdy nie ma już na liście elementów, które mogłyby trafić do ogona (patrz grupa D), to ogon nadal będzie listą - tyle że pustą.

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