Programowanie Deklaratywne – kolokwium 1
5.12.2011
Witam po dość długiej przerwie. Zbliża się koło z ukochanego dla Nas wszystkich prologa, więc nasienie Zła musi wyprodukować dla Was ściągi :D Nie będę rozpisywał się na 300 stron ze wstępem, tylko bierzemy się za robotę. Podziękuje tylko dla Szczurka Węża oraz dla Oliwii za udostępnione materiały.
Do nauki potrzeba nam dwóch rzeczy.
1. Alkohol.(opcjonalnie)
2. Kartkę z zainstalowanym Prologiem (tak koło będzie pisane na kartce, przypomina się aż an_daw)
Wszyscy gotowi ? Jeśli tak to ruszamy z tematem. Od razu mówię, że prosto nie będzie.
Przeglądając materiały o kurwa nie opisze mojego zdziwienia tym co może nas spotkać, ale postarajmy się, żeby Maria była lekko w szoku i może nawet dumna w pełni.
Z przykładowego koła zadanie nr 1(dłuższego to chyba być nie mogło) 1.Zbuduj bazę danych opisujących następujące związki:
a) Jan lubi Marie i czekoladę.
b) Piotr lubi wino.
c) Dwie osoby się lubią jeśli mają takie samo hobby.
d) Turystyka, to hobby Jana i Heleny, a teart - Tomasza i
Piotra.
e) Ewa lubi te same rzeczy co Jan, oraz osoby które mają
jakieś hobby
W tym celu zdefiniuj następujące predykaty : osoba/1, rzecz/1, hobby/2 lubi/2
b. Sformułuj cele odpowiadające na pytania:
a) Kogo lubi Ewa?
b) Co lubi Ewa?
c) Kto lubi czekoladę?
d) Czy ktoś lubi Jana?
e) Jakie osoby lubią się wzajemnie?
c.
Wykorzystując predykat fail/0 zdefiniuj procedurę
ma_hobby/0 wypisującą wszystkie osoby w bazie które, mają jakieś hobby. Realizacja celu ?-ma_hobby, powinna zakończyć się sukcesem d. Zdefiniuj predykat upodobania/2
upodobania(X,L)spełniony gdy X jest osobą, L jest listą osób
lub rzeczy, które X lubi lub listą pustą gdy takich osób ani
rzeczy nie ma.
Zaczniemy od rzeczy najłatwiejszych, czyli od predykatów jednoargumentowych (tych gdzie po „/” jest cyferka „1”). Mamy takie 2 predykaty. Osoba oraz rzecz. To co musimy zrobić to wypisać w sposób prologowy. Zaczniemy od rzeczy.
rzecz(czekolada). - no raczej nie powiesz dla czekolady siema
rzecz(wino). - a z winem na piwo nie pójdziesz
No to rzeczy mamy z głowy. Ogólnie pamiętać trzeba, o kropce na koniec danej definicji. Jak w C mieliśmy „;” (tak, to jest średnik) tutaj trzeba używać kropki. Kolenja prosta rzecz to predykat osoba.osoba(jan). - no z nim na browar pójdziesz
By Perez Strona 1 z 4
Programowanie Deklaratywne – kolokwium 1
5.12.2011
osoba(maria). - a z nią na kino
osoba(piotr). - on winem nie pogardzi
osoba(helena). - ona na disco do 601/b pójdzie
osoba(tomasz). - on wszystko załatwi
osoba(ewa). - ona mocno w głowie zamiesza
Najprostsze za nami. Teraz wchodzimy na następny poziom. Stworzymy pierwszy predykat dwuargumentowy którym jest predykat hobby. Najpierw w woli wyjaśnienia. Tutaj w nawias wpisujemy 2 argumenty funkcji, ktorymi będą osoby oraz dane hobby. Są tutaj dwia możliwości zrobienia tego. Zademonstruje obie.
METODA I
hobby(osoba(jan),turystyka). - hobby dla jana to turystyka
hobby(osoba(helena),turystyka). -hobby dla heleny to turystyka hobby(osoba(tomasz),teatr). - hobby dla tomasza to teatr
hobby(osoba(piotr),teatr). - hobby dla piotra to teatr
Ta wersja jest odrobinę bardziej skomplikowane, ale przynajmniej jest jakieś prowizoryczne powiązanie z predykatem osoba. Metoda druga jest mniej skomplikowana, ale nie widać bezpośrednio powiązania
METODA II
hobby(jan,turystyka). - hobby dla jana to turystyka
hobby(helena,turystyka).- hobby dla heleny to turystyka
hobby(tomasz,teatr). - hobby dla tomasza to teatr
hobby(piotr,teatr). - hobby dla piotra to teatr
Ja będę używał Metody I i w pliku który będzie dodany do manuala. Możemy być z siebie dumni, bo ogarnęliśmy praktycznie ¼ zadania 1. Teraz trzeba zrobić przedykat lubi, który ma rozróżniać czy pytamy o osobę czy o rzecz, więc trzeba będzie predykat lubi napisać na wzór I metody z hobby. Pozwolę sobie ponumerować linijki kodu, aby poniżej było jakieś w miare sensowne wytłumaczenie czemu tak a nie inaczej,
1lubi(osoba(jan),rzecz(czekolada)).
2lubi(osoba(jan),osoba(maria)).
3lubi(osoba(X),osoba(Y)):-hobby(osoba(X),Z),hobby(osoba(Y),Z).
4lubi(osoba(ewa),rzecz(X)):-lubi(osoba(jan),rzecz(X)).
5lubi(osoba(ewa),osoba(X)):-hobby(osoba(X),_).
1 – jak widać osoba jan lubi rzecz jaką jest czekolada.
2 – osoba jan lubi osobę maria.
3 – osoba X lubi osobę Y jeśli („:-”) mają takie same hobby
4 – osoba ewa lubi rzecz X jeśli osoba jan lubi rzecz X
5 – osoba ewa lubi osobę X jeśli osoba X ma hobby _ czyli chuj nas obchodzi jakie, tylko ma jakieś mieć.
Przejdźmy teraz do podpunktu b, który teraz bo zbudowaniu tej „bazy danych” wydaje się banalny.
1 – lubi(osoba(ewa),osoba(X)).
2 – lubi(osoba(ewa),rzecz(X))
3 – lubi(osoba(X),rzecz(czekolada)).
4 – lubi(osoba(X),osoba(jan)).
5 – lubi(osoba(X),osoba(Y)).
Podpunkt c.
ma_hobby:-
hobby(osoba(X),_),
write(X),nl,fail.
ma_hobby.
By Perez Strona 2 z 4
Programowanie Deklaratywne – kolokwium 1
5.12.2011
Teraz opisze delikatnie czym jest ten cały fail. Przerywa on poszukiwanie dalsze i nie czeka na to aż strzelimy średnik czy tak enter. Coś jak restart level w grach, nl wprowadza wpisanie z nowej linii, a write to wiadomo, że wpisuje szukaną X. Ma_hobby na koniec jest po to, aby nie wypisał, ze program kończy się falsem.
Podpunktu D nie wiem jak zrobić. Czekam na propozycje. Nagrodą jest współautorstwo manuala.
Po ciężkiej batalii z zadaniem pierwszym przysiądźmy do zadania 2. Te jest o tyle weselsze, bo prolog się gubi w nim.
2. Dany jest następujący program
szef(ewa,piotr).
szef(piotr,zenon).
przelozony(X,Y):-szef(X,Y).
przelozony(X,Y):-szef(X,Y),przelozony(Z,Y).
Sformułuj cel odpowiadający na pytanie: kto jest przełożonym
Zenona? Przedstaw drzewo poszukiwania rozwiązania dla tego celu.
Podchodziłem do zadania drugiego kilka razy. Niezbyt mi wychodziło, a Prolog niezbyt pomaga, bo zapętla się i ciągle wysypuje jako odp piotr. Jeśli ktoś zrobi to proszę o upa do mnie i współautorstwo będzie zanotowane.
3. Zaproponuj definicje relacji
dwa_razy(L1,L2).
prawdziwej gdy na liście L2 składa się ze zbudowanych
elementów listy L1 np.dwa_razy([a,b],[a,a,b,b]).
W definicji predykatu nie korzystaj z predykatów wbudowanych
SWI Prologu.
Przy każdej klauzuli podaj komentarz objaśniający.
%rekurencja wzgledu na L1
%koniec rekurencji
razy_dwa([],[]). - rekurencja kończy się kiedy 2 listy są puste.
%rekurencja
razy_dwa([H1|T1],[H2|T2]):-H2 is 2*H1,razy_dwa(T1,T2). - mając listy L1 oraz L2 rozbite na H1 (głowa 1) i T1 (ogon 1) oraz H2 i T2. H2 iloczynem H1. I następnie operację wykonuje się ponownie na ogonach.
Te zadanie akurat było na ćwiczeniach. Lecimy dalej z tematem.
4 Czy można uzgodnić następujące listy? Jeżeli tak, wypisz
podstawienia zmiennych, jeżeli nie, wyjaśnij dlaczego.
Lista 1
Lista 2
a)[H|[H2|Tail]]
[ania,basia,kasia,ola]
b)[Head|Tail]
[a,[julia,jest,lekarzem]]
c)[a,[x,y,z]]
[Głowa,Ogon]
d)[X,Y[a,b,C]]
[jablka,gruszki|[D,b,c]]
e)[G1,G2|Ogon]
[1,2,3,4]
f)[lato]
[Głowa|Ogon]
g)[lato]
[X,Y,Ogon]
h)[sem4,prolog]
[sem4,[Temat]]
i)[kobieta(ewa),kobieta(jola)] [X|Y]
j)[[psy,koty],lubi,marta]
[Głowa|[lubi,Y]]
k)[f(g(Y)),a,X]
[f(Z),Y,f(Z)]
Uzgodnienie inaczej mówiąc podstawienie. Zadanie jest bardzo proste, lecz listy bardzo By Perez Strona 3 z 4
Programowanie Deklaratywne – kolokwium 1
5.12.2011
mieszają podczas uzgodnień, bo ogon listy może zawierać kilka elementów, lub być zbiorem pustym. Przejdźmy do zadania. Omówienie będzie po rozwiązaniu: a) H=ania ; H2=basia ; Tail = [kasia,ola].
b) Head = a ; Tail[julia,jest,lekarzem].
c)a= Głowa ; [x,y,z]=Ogon.
d) X=jablka ; Y=gruszki ; a=D; b=b ; C=c.
e) G1=1 ; G2=2 ; Ogon=[3,4].
f)Głowa=lato; Ogon=[].
g)false, bo ilość elementów Listy1 jest różna od ilości elementów Listy 2
h)false, bo ani prolog, ani Temat nie są zmiennymi, które można przypisać i)X=kobieta(ewa) ;Y= kobieta(jola).
j)Głowa=[psy,koty]; lubi=lubi ; Y=marta.
k)Y=a ; X=f(g(a)) ; Z=g(a) .
A więc podpunkt a głowa pierwsza zabiera pierwszy element, następnie głowa druga zgarnia drugi element, a ogon zabiera resztę. W podpunkcie b, c,e i j jest tak samo. Podpunkt d w L1 mamy taka samą ilość elementów przed drugą lista tak jak w L2 i można je przypisać bo elementy L2 to zmienne (zmienne są to wielkie litery) a w L1 to termy w nawiasach kwadratowych wewnętrznych mamy taka sama ilość elementów w obu listach i mamy ułożone tak, że litery małe (atomy) można przypisać do zmiennych (powtarzam wielkie litery). W f możemy przypisać ponieważ Ogon może być listą pustą. Natomiast w g nie można przypisać bo w L2 mamy 2 zmienne których nie ma do czego przypisać. Tzn jedną można, ale druga wtedy nie ma czego zgarnąć i będzie smutna.
Podpunktu h nie będę opisywał, ponieważ jest już odpowiednio wytłumaczone. W i mamy 2
predykaty i 2 zmienne, więc nikt problemów nie robi można w pary łączyć. Podpunkt k jest dla mnie magią w postaci czystej. Najpierw przypisuje się zmienna do atomu, potem w miejsce tej zmiennej wstawia się atom. Z jest wnętrzem funkcji f, a X jest przypisany do f(Z). To wszystko pora na kolejne zadanie.
5 Korzystając z wbudowanych predykatów Prologu
a) zdefiniuj predykat operacja1(L1,L2) spełniony, gdy lista L2
powstaje z listy L1 przez usunięcie trzeciej pozycji z listy, o ile długość(L1)>=3; w przeciwnym przypadku, gdy lista L2 powstaje z L1 przez dodanie do L1 długości listy L1 jako ostatniej na
liście.
b)zdefiniuj predykat operacja2(L1,L2) spełniony, gdy dla danej listy L1 zawierające wyrażenia arytmetyczne, L2 jest listą
wartości tych wyrażeń.
c)
zdefiniuj predykat operacja3(L1,L2) spełniony, gdy dla
danej listy L1 zawierającej wyrażenia arytmetyczne L2 jest listą tych wyrażeń z L1 których wartość wynosi 4.
PRZYZNAM SIĘ BEZ BICIE NIE MAM BLADEGO POJĘCIA JAK ZROBIĆ ZADANIE NR 5.
JEŚLI KTOŚ BĘDZIE W STANIE JE ZROBIĆ TO BYŁBYM WDZIECZNY O
UDOSTĘPNIENIE. OSOBĘ TA DOSTĄPI ZASZCZYTU WSPÓŁAUTORSTWA MANUALA.
Z mojej strony to wszystko. Powodzenia i do zobaczenia na imprezach. Tzn na zajęciach oczywiście, bo przecież alkoholu nie spożywamy. Pozdro.
By Perez Strona 4 z 4