1. a. Zbuduj bazę danych opisujących relacje:
a) Jan lubi Marie i czekoladę.
lubi_os(jan,maria).
lubi(jan,czekolada).
b) Piotr lubi wino.
lubi(piotr,wino).
c) Dwie osoby sie lubia, jeżeli maja to samo hobby.
lubi_os(X,Y):-hobby(X,Z),hobby(Y,Z),X\=Y.
d) Turystyka, to hobby Jana i Heleny, a teatr – Tomasza i Piotra.
hobby(jan,turystyka).
hobby(helena,turystyka).
hobby(tomasz,teatr).
hobby(piotr,teatr).
e) Ewa lubi te same rzeczy co Jan oraz osoby, które maja jakies hobby.
lubi(ewa,X):-lubi(jan,X).
lubi_os(ewa,X):-hobby(X,_).
1.b. Sformułuj cele odpowiadające na pytania:
a) Kogo lubi Ewa?
lubi_os(ewa,X).
b) Co lubi Ewa?
lubi(ewa,X).
c) Kto lubi czekolade?
lubi(X,czekolada).
d) Czy ktos lubi Jana?
lubi_os(X,jan).
e) Jakie osoby lubia sie wzajemnie?
lubi_os(X,Y),lubi_os(Y,X).
1.c. Zdefiniuj predykat upodobania/4.
upodobania(X,L1,L2,L3) spełniony, jesli:
X jest osoba ,
L1 jest lista osób, które X lubi lub lista pusta, gdy nie ma takich osób,
L2 jest lista rzeczy, które X lubi lub lista pusta, gdy nie ma takich rzeczy,
L3 jest lista hobby X-a lub lista pusta, gdy X nie ma "adnego hobby.
upodobania(X,[G1|O1],L2,L3):-lubi_os(X,G1).
2. Dany jest nastepujacy program
szef ( ewa, piotr).
szef ( piotr, zenon).
przelozony (X, Y ) :- szef (X,Y ).
przelozony (X, Y ) :- szef (X,Z ), przelozony (Z, Y ).
Sformułuj cel odpowiadajacy na pytanie: kto jest przełożonym Zenona?
przelozony(X,zenon).
3. Zaproponuj definicje relacji
dwa_razy (L1, L2 ),
prawdziwej gdy na liscie L2 składa sie ze zdublowanych 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 objasniajacy.
dwa_razy([],[]).
dwa_razy([H|T],[H1,H2|T1]) :- H = H1, H = H2, dwa_razy(T,T1).
4. Czy mo"na uzgodnic nast. nastepujace listy? Je"eli tak, wypisz podstawienia zmiennych, je"eli nie, wyjasnij
dlaczego.
Lista 1 | Lista 2 | Uzgodnienie |
---|---|---|
[H|[H2|Tail]] | [ania,basia,kasia,ola] | H=ania, H2=basia, Tail=[kasia,ola] |
[Head|Tail] | [a,[julia,jest,lekarzem]] | Head=a, Tail=[julia,jest,lekarzem] |
[a,[x,y,z]] | [Glowa,Ogon] | Glowa=a, Ogon=[x,y,z] |
[X,Y,[a,b,C]] | [jablka,gruszki|[D,b,c]] | |
[G1,G2|Ogon] | [1,2,3,4] | G1=1, G2=2, Ogon=[3,4] |
[lato] | [Glowa|Ogon] | Głowa=lato, Ogon=[] |
[lato] | [X,Y,Ogon] | Rozna ilosc elementow |
[sem4,prolog] | [sem4,[Temat]] | Temat=[prolog] |
[kobieta(ewa), kobieta(jola)] | [X|Y] | x=kobieta(ewa), Y=kobieta(jola) |
[[psy,koty], lubi,marta] | [Glowa|[lubi,Y]] | Glowa=[psy,koty], Y=marta |
[f(g(Y)),a,X] | [f(Z),Y,f(Z)] | Y = a, X = f(g(a)), Z = g(a). |
5. Korzystajac z wbudowanych predykatów Prologu
a) zdefiniuj predykat operacja1( L1, L2 ) spełniony, gdy lista L2 powstaje z listy L1 przez usuniecie trzeciej
pozycji z tej listy , o ile długosc(L1) >= 3; w przeciwnym przypadku, gdy lista L2 powstaje z L1 przez dodanie
do L1 długosci listy L1 jako ostatniej pozycji na liscie.
operacja1(L1,L2):-length(L1,D),D>=3,select(E,L1,L2),nth1(3,L1,E),!.
operacja1(L1,L2):-L2=[L1|E],E = D,length(L1,D).
b) zdefiniuj predykat operacja2( L1, L2 ) spełniony, gdy dla danej listy L1 zawierajacej wyra"enia
arytmetyczne, L2 jest lista wartosci tych wyrażen.
op(A,B):-B is A.
operacja2(L1,L2):-maplist(op,L1,L2).
c) zdefiniuj predykat operacja3( L1, L2 ) spełniony, gdy dla danej listy L1 zawierajacej wyra"enia
arytmetyczne, L2 jest lista tych wyra"en z L1, których wartosc wynosi 4.
op(A):-B is A,B==4.
operacja3(L1,L2):-sublist(op,L1,L2).
operacja3(L1,L2):-memberchk(E,L1),delete(L1,E,L2),Wart is E, Wart == 4,L1=L2,operacja3(L1,L2).
6. Dany jest nastepujacy program:
dlugosc(10).
dlugosc(20).
szerokosc(1).
szerokosc(2).
wysokosc(5).
wysokosc(6).
objetosc(X):- dlugosc(A),
szerokosc(B),
wysokosc(C),
X is A*B*C.
Podac liczbe rozwiazan dla celu ?- objetosc(X).
Zmodyfikuj procedure objetosc przy pomocy odciecia (nie usuwajac "adnego faktu z bazy), aby przy realizacji celu ?- objetosc(X) uzyskac.
dlugosc(10).
dlugosc(20).
szerokosc(1).
szerokosc(2).
wysokosc(5).
wysokosc(6).
objetosc(X):- dlugosc(A),szerokosc(B),wysokosc(C),X is A*B*C.
a) jedna
dlugosc(10).
dlugosc(20).
szerokosc(1).
szerokosc(2).
wysokosc(5).
wysokosc(6).
objetosc(X):- dlugosc(A),szerokosc(B),wysokosc(C),X is A*B*C,!.
b) dwie,
dlugosc(10).
dlugosc(20).
szerokosc(1).
szerokosc(2).
wysokosc(5).
wysokosc(6).
objetosc(X):- dlugosc(A),szerokosc(B),!,wysokosc(C),X is A*B*C.
c) cztery,
dlugosc(10).
dlugosc(20).
szerokosc(1).
szerokosc(2).
wysokosc(5).
wysokosc(6).
objetosc(X):- dlugosc(A),!,szerokosc(B),wysokosc(C),X is A*B*C.
d) osiem odpowiedzi
dlugosc(10).
dlugosc(20).
szerokosc(1).
szerokosc(2).
wysokosc(5).
wysokosc(6).
objetosc(X):- !,dlugosc(A),szerokosc(B),wysokosc(C),X is A*B*C.