Zadatak 1.



kti(L,K,Rez) :- kti(L,K,Rez,K).

kti([],_,[],_).
kti([G|R],1,[G|R1],K) :- kti(R,K,R1,K).
kti([G|R],PomK,L,K) :- Pk is PomK - 1, kti(R,Pk,L,K).

Zadatak 2.


okreni([],L,L).
okreni([G|R],O,L) :- okreni(R,[G|O],L).

saberi(L1,L2,S) :- okreni(L1,[],S1), okreni(L2,[],S2), sab2(S1,S2,0,Sp), okreni(Sp,[],S).

sab2([],[],1,[1]).
sab2([],[],0,[]).
sab2([],L,Prenos,S) :- dodajPrenos(Prenos,L,S).
sab2(L,[],Prenos,S) :- dodajPrenos(Prenos,L,S).
sab2([G1|R1],[G2|R2],Prenos,[G3|R3]) :- G4 is G1 + G2 + Prenos, PomPr is G4 // 10,
                                        G3 is G4 mod 10, sab2(R1,R2,PomPr,R3).

dodajPrenos(0,L,L).
dodajPrenos(1,[G|R],[G1|R]) :- G < 9, G1 is G + 1.
dodajPrenos(1,[G|R],[0|R1]) :- dodajPrenos(1,R,R1).
dodajPrenos(1,[],[]).

Zadatak 3.


(define (resi) (nadji 10))

(define (nadji n)
  (cond ((= n 100) 'nema_resenja)
        ((= (* n n) (+ (fakt (modulo n 10)) (fakt (quotient n 10)))) n)
        (t (nadji (+ n 1)))
  )
)

(define (fakt n)
  (if (= n 0) 1 (* n (fakt (- n 1))))
)

Zadatak 4.



(define (skalarni l1 l2) (sp (cdr l1) (cdr l2)))

(define (sp l1 l2)
  (if (null? l1) 0
      (+ (sp (cdr l1) l2) 
         (* (cadar l1) (pronadji (caar l1) l2))
      )
  )
)

(define (pronadji x l)
  (cond ((null? l) 0)
        ((= x (caar l)) (cadar l))
        (t (pronadji x (cdr l)))
  )
)