Transformacija seznama v prologu
Iz E-študij, proste zakladnice študentskega znanja
Transformacija seznama je operacija v prologu, ki nam (ob predložitvi nekega seznama) vrne nov seznam spremenjenih (transformiranih) elementov.
Kvadrat
kvadrati([],[]). kvadrati([I|Rep],[Kv|Kvrep]):- Kv is I*I, kvadrati(Rep,Kvrep).
?- kvadrati([10,2,3],R). R = [100,4,9] ? ; no
Metaprogramiranje
Metaprogramiranje uporabljamo takrat, ko definiramo ime transformacije znotraj operacije. Argument je ime operacije.
spremeni([],_,[]). %če je seznam prazen ni kaj transformirati spremeni([Glava,Rep],p,[Glava1|Rep1]):- Tr =.. [p,Glava,Glava1], % =.. ustvari strukturo p(Glava,Glava1) call(Tr), %vgrajena procedura pokliče zgornji cilj spremeni(Rep,p,Rep1).
kvadrat(X,Kv) :- Kv is X*X.
kv(X,X*X).
mod3(X,M) :- M is X mod 3.
?- spremeni([1,2,3],kv,R). kv(X,K) :- K is X*X. kub(X,Kb) :- Kb is X*X*X. minus(X,-X).
?- spremeni([1,2,3],minus,S). S=[-1,-2,-3]
Obračanje seznama
?- obrni([a,b,c],S). S=[c,b,a].
Neoptimirana metoda, ki dela odvečne poteze.
obrni([],[]). obrni([Glava|Rep],Obrnjen) :- obrni(Rep,Obr_rep), stik(Obr_rep,[Glava],Obrnjen).
Optimirana metoda
obrni_hitro(Seznam,Obrnjen):- obrni_hitro(Seznam,[],Obrnjen).
obrni_hitro([Glava|Rep],Trenutni,Rezultat):- obrni_hitro(Rep,[Glava|Trenutni],Rezultat). obrni_hitro([],Rezultat,Rezultat). %robni pogoj