Transformacija seznama v prologu

Iz E-študij, proste zakladnice študentskega znanja

Skoči na: navigacija, iskanje

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
Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja