PD ćw v 0 9

background image

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

background image

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

background image

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

background image

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


Wyszukiwarka

Podobne podstrony:
PD ćw v 0.9
Cw UCD CD SMD PD
CW PD 10 id 122466 Nieznany
ćw 4 Profil podłużny cieku
biofiza cw 31
Kinezyterapia ćw synergistyczne
Cw 1 ! komorki
Pedagogika ćw Dydaktyka
Cw 3 patologie wybrane aspekty
Cw 7 IMMUNOLOGIA TRANSPLANTACYJNA
PD W1 Wprowadzenie do PD(2010 10 02) 1 1
Cw Ancyl strong
Cw 1 Zdrowie i choroba 2009
Rehabilitacja medyczna prezentacja ćw I

więcej podobnych podstron