Zadania (Prolog)

  1. 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 fib/2 oraz nwd/3.

  2. 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.

  3. 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).

  4. 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
    1. f(s(1),A)?
    2. f(s(s(1)),two)?
    3. f(s(s(s(s(s(s(1)))))),C)?
    4. f(D,three)?

  5. Proszę zdefiniować następujące predykaty dla list.

    1. last(X,L), który jest spełniony, jeżeli X jest ostatnim elementem listy L.
    2. delete(X,L1,L2), który jest spełniony, jeżeli L2 równa się L1 bez elementu X.
    3. delete(L1,L2), który jest spełniony, jeżeli L2 równa się L1 bez ostatnich trzech elementów.
    4. 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 
    5. 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] 
    6. evenlength(L) oraz oddlength(L), które są spełnione, jeżeli długość listy L jest parzysta oraz nieparzysta.
    7. 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] 
    8. 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 
    9. 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] 
    10. 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]] 
  6. 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]).
    
  • Proszę zdefiniować następujące predykaty dla list.

    1. ordered(L), który jest spełniony, jeżeli lista L jest posortowana.
    2. mergesort(L1,L2), który jest spełniony, jeżeli lista L2 jest wersją posortowaną listy L1. Predykat ma symulowac algorytm mergesort.

  • 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.

    1. size(D,N), który jest spełniony, jeżeli N jest ilością elementów drzewa D.
    2. search(D,N), który jest spełniony, jeżeli N jest elementem drzewa D.
    3. max(D,N), który jest spełniony, jeżeli N jest maximum elementów w drzewie D.
    4. times(N,D1,D2), który bierzy wszystkie wartości węzłów drzewa D1 razy N.
    5. preorder(D,L), który jest spełniony, jeżeli lista L zawiera elementy drzewa D w kolejności prefiksowym.

  • Graf można reprezentować przy użciu predykatu edge(V1,V2), gzie V1 oraz V2 są węzłami.

    1. Proszę zdefiniować predykat path(V1,V2), który znajduje drogę między V1 i V2.
    2. Proszę zdefiniować predykat path(V1,V2,L), który znajduje drogę między V1 i V2 oraz drogę tą podaje w liście L.
    3. Jak można reprezentować graf z wagami oraz w takim grafie obliczyć koszty drogi między węzłami V1 i V2?

  • Proszę zdefiniować predykat number(Z), który znajduje wszystkie trzy-cyfrowe liczby, które można podzielić prez 5 i 6 oraz mają resztę 3, jeżeli zostają podzielone przez 9.