Niech będzie dana baza danych zawierająca predykaty parent/2, female/1
i male/1.
Proszę zdefiniować predykaty child/2, mother/2, sister/2,
has_a_child/1, grandparent/2 oraz predecessor/2.
Niech będą dane następujące predykaty:
q1(X,Y) :- p(X,Y). q2(X,Y) :- p(X,Z), q2(Z,Y).
q1(X,Y) :- p(X,Z), q1(Z,Y). q2(X,Y) :- p(X,Y).
q3(X,Y) :- p(X,Y). q4(X,Y) :- q4(X,Z), p(Z,Y).
q3(X,Y) :- q3(X,Z), p(Z,Y). q4(X,Y) :- p(X,Y).
oraz baza danych dla predykat p:
p(pam,bob).
p(tom,bob).
p(tom,liz).
p(bob,ann).
p(bob,pat).
p(pat,jim).
Proszę zilustrować, jak Prolog odpowiada na
pytania ?-qi(tom,pat). oraz ?-qi(liz,jim).
Proszę zdefiniować predykaty plus/3, times/3, fib/2 oraz sum-up/2 w sposobie rekurencyjnym.
Predykat sum-up(N,X) ma być spełniony, jeżeli X jest sumą liczb od 0 do N.
Predykat sil/2 da się zrealizować następująco.
sil(X,N) :- sil(X,N,1).
sil(0,A,A).
sil(X,N,A) :- X > 0, A1 is A * X, X1 is X - 1, sil(X1,N,A1).
Proszę zdefiniować predykaty z zadania 6. używając tą technikę.
(Zmienna A z predykatu sil/3 się nazywa akumulator.)
Proszę zdefiniować następujące predykaty dla list.
- last(X,L), który jest spełniony, jeżeli X jest ostatnim elementem listy L.
- delete(X,L1,L2), który jest spełniony, jeżeli L2 równa się L1 bez elementu X.
- delete(L1,L2), który jest spełniony, jeżeli L2 równa się L1 bez ostatnich trzech elementów.
- reverse(L1,L2), który jest spełniony, jeżeli L2 jest
listą L1 w odwrotnej kolejności.
- evenlength(L) oraz oddlength(L), które są spełnione, jeżeli długość listy L jest parzysta oraz nieparzysta.
- shift(L1,L2), który jest spełniony, jeżeli L2 równa się L1 po jednej rotacji do lewej.
Przykład: ?- shift([1,2,3,4,5],L).
L = [2,3,4,5,1]
- quadrat(L1,L2), który jest spełniony, jeżeli L2 zawiera quadraty elementów listy L1.
Przykład: ?- quadrat([1,2,3,4,5],L).
L = [1,4,9,16,25]
- combine(L1,L2,L3), który jest spełniony, jeżeli L3 zawiera pary elementów z list L1 i L2.
Przykład: ?- combine([1,2,3,4],[a,b,c,d],L).
L = [[1,a],[2,b],[3,c],[4,d]]
- palindrom(L), który jest spełniony, jeżeli lista L zawiera palindrom.
Przykłady: ?- palindrom([a,b,c]).
no
?- palindrom([a,b,c,d,c,b,a]).
yes
- p(X,L,Y,Z), który jest spełniony, jeżeli Y jest poprzednikiem elementu X w liście L a Z następcą elementu X w liście L.
Przykład: ?- p(3,[1,2,3,4,5],Y,Z).
Y = 2, Z = 4
- q(X,L1,L2), który jest spełniony, jeżeli L2 równa się początku listy L1 do podwójnego wystąpienia elementu X.
Przykład: ?- q(3,[1,2,3,3,1,2,4],Z).
Z = [1,2,3,3]
Proszę zdefiniować następujące predykaty dla list.
- nth(N,L,X), który jest spełniony, jeżeli X jest N-tym elementem listy L.
- ordered(L), który jest spełniony, jeżeli lista L jest posortowana.
- mergesort(L1,L2), który jest spełniony, jeżeli lista L2 jest wersją posortowaną listy L1.
Predykat ma symulowac algorytm mergesort.
Niech będą dane następująca defincja predykatu append2.
append2([X|L1],L2,[X|L3]) :- append2(L1,L2,L3).
append2([],L,L).
Proszę zilustrować, jak Prolog odpowiada na pytanie
?- append2(X,[3,4],[2,3,4]).
Drzewo binarne D jest albo pusty (repezentowane przez nil) albo zawiera element X i dwa poddrzewa L i P
(reprezentowane przez drzewo(X,L,P)).
Proszę zdefiniować następujące predykaty dla drzew.
- size(D,N), który jest spełniony, jeżeli N jest ilością elementów drzewa D.
- search(D,N), który jest spełniony, jeżeli N jest elementem drzewa D.
- max(D,N), który jest spełniony, jeżeli N jest maximum elementów w drzewie D.
- double(D1,D2), który zmieni wszystkie wartości węzłów x drzewa D1
do [x,x] w drzewie D2.
- preorder(D,L), który jest spełniony, jeżeli lista L zawiera elementy drzewa D w kolejności
prefiksowym.
Używając dzrewa odpowiedzi proszę pokazać jak Prolog odpowiada na następujące pytania.
-
p(1).
p(2) :- !.
p(3).
?- p(x). ?- p(x), p(y). ?- p(x), !, p(y).
-
p(x) :- a(x).
p(x) :- b(x), c(x), !, d(x).
p(x) :- f(x).
a(1). b(1). c(1).
b(2). c(2). d(2).
f(3).
?- p(x).
Niech będzie dana następująca definicja.
max(X,Y,X) :- X >= Y, !.
max(X,Y,Y).
Na kolejne pytanie Prolog odpowiada "błędnie":
?- max(5,2,2).
yes
Dlaczego Prolog tak odpowiada i jak można to zreperować (bez zmian cut'u i drugiej reguły)?
Niech będzie dana następująca definicja predykatu memberc(X,L).
memberc(X,[X|_]) :- !.
memberc(X,[_|L]) :- memberc(X,L).
Proszę porównać tą definicję z zwykłą definicją member(X,L).