- Długość listy można w Prologu zdefiniować następująco:
length(0,[]).
length(N,[_|L]) :- length(M,L), N is M+1.
Proszę zdefiniować predykaty member/2 oraz sil/2, fib/2 i nwd/3.
- 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ędzie dany następujący program:
f(1,one).
f(s(1),two).
f(s(s(1)),three).
f(s(s(s(X))),N) :- f(X,N).
Jak odpowiada Prolog na pytanie
- f(s(1),A)?
- f(s(s(1)),two)?
- f(s(s(s(s(s(s(1)))))),C)?
- f(D,three)?
- Proszę zdefiniować predykat rzym/2, który transformuje rzymskie liczby do liczb dziesiętnich.
Liczby rzymskie można po prostu reprezentować jako listy, n.p. [x,l,v,i,i].
- Proszę zdefiniować predykaty plus/3, times/3 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 5 oraz predykat fib
z zadania 1. używając tą technikę.
(Zmienna A z predykatu sil/3 się nazywa akumulator.)
- Niech będą dane następująca defincja predykatu append.
append([X|L1], L2, [X|L3]) :- append(L1, L2, L3).
append([], L, L).
Proszę zilustrować, jak Prolog odpowiada na pytanie
?- append(X, [3,4], [2,3,4]).
- 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).
Używając drzewo odpowiedzi proszę zilustrować, jak Prolog odpowiada na
pytania ?-qi(tom,pat). oraz ?-qi(liz,jim).
- 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.
- Proszę zdefiniować predykat permutation(L1,L2), który jest spełniony, jeżeli lista L2 jest permutacją listy L1.
Przy użyciu ";" powiennien być możliwe wyliczać wszystkie permutacje listy L1.
- 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.
- times(N,D1,D2), który bierzy wszystkie wartości węzłów drzewa D1 razy N.
- preorder(D,L), który jest spełniony, jeżeli lista L zawiera elementy drzewa D w kolejności
prefiksowym.
- Używając rezolucję proszę sprawdzić czy następujące konsekwencje logiczne są poprawne.
a) (p → q) → r |= p → (q → r)
b) p → (q → r) |= (p → q) → r
- Niech będą
A ≡ (p → (¬ q ∨ ¬ r)) ∧ ((p ∧ r) ∨ ( q → (q → r)))
B ≡ (p ∧ (¬ q ∧ r)) ∨ (r ∧ (r → p))
C ≡ (p ∧ r) ∨ (¬(q → r)).
Używając rezolucję proszę sprawdzić czy {A,B}|= C jest poprawna.
- Niech będą
A ≡ (¬q → (p ∧ r))
B ≡ r → (¬p ∧ ¬q)
C ≡ (r ∨ w) → ¬(w → ¬q)
Używając rezolucję proszę sprawdzić czy (A ∧ B) → C jest tautologią.
- Proszę obliczyć najbardziej ogólny unifikator dla następujących wyrażeń.
a) f(x,g(b)) f(a,y)
b) f(h(x,b),y) f(h(a,y),x)
c) f(x,y) f(h(x,b),y)
d) g(x,h(x,y),h(y,h(x,y))) g(x,y',h(z,y'))
e) g(x,h(x,y),h(y,h(x,y))) g(x,y',h(y',z))
f) f(a,x,h(g(y))) f(z,h(z),h(z'))