Professional Documents
Culture Documents
fmod LISTENAT is
***> liste de numere naturale, cu lista vida si concatenarea
***> modul pe care il vom importa in modulele urmatoare, pentru sortari
protecting NAT .
sort Lista .
subsort Nat < Lista .
op nil : -> Lista .
op __ : Lista Lista -> Lista [assoc id: nil] .
endfm
fmod INSSORT is
***> sortarea prin insertie directa
extending LISTENAT .
op sortare : Lista -> Lista .
op inserare : Nat Lista -> Lista .
vars X Y : Nat .
var L : Lista .
eq sortare(nil) = nil .
eq sortare(X L) = inserare(X,sortare(L)) .
eq inserare(X,nil) = X .
ceq inserare(X,Y L) = Y inserare(X,L) if Y < X .
ceq inserare(X,Y L) = X Y L if X <= Y .
endfm
fmod MERGESORT is
***> sortarea prin interclasare
***( Intrucat oricum taierea unei liste in doua parti,
indiferent de metoda de taiere, se face in timp liniar,
nu constant, ca intr-o implementare a acestui algoritm
de sortare intr-un limbaj de programare imperativa, putem
scrie acest algoritm in Maude, pur si simplu, ca mai jos. )
extending LISTENAT .
op interclasare : Lista Lista -> Lista .
***> interclaseaza doua liste sortate
op sortare : Lista -> Lista .
vars X Y : Nat .
vars L M : Lista .
eq interclasare(L,nil)
eq interclasare(nil,M)
ceq interclasare(X L,Y
ceq interclasare(X L,Y
eq sortare(nil) = nil .
= L .
= M .
M) = X interclasare(L,Y M) if X <= Y .
M) = Y interclasare(X L,M) if X > Y .
eq sortare(X) = X .
eq sortare(X L Y M) = interclasare(sortare(X L),sortare(Y M)) .
endfm
fmod SELSORT is
***> sortarea prin selectia directa a minimului
extending LISTENAT .
op minim : Nat Nat -> Nat .
op minlist : Lista -> Nat .
op sterge : Nat Lista -> Lista .
op sortare : Lista -> Lista .
vars X Y : Nat .
var L : Lista .
ceq minim(X,Y) = X if X <= Y .
ceq minim(X,Y) = Y if X > Y .
eq minlist(X) = X .
eq minlist(X Y L) = minim(X,minlist(Y L)) .
eq sterge(X,nil) = nil .
eq sterge(X,X L) = L .
ceq sterge(X,Y L) = Y sterge(X,L) if X =/= Y .
eq sortare(nil) = nil .
eq sortare(X L) = minlist(X L) sortare(sterge(minlist(X L),X L)) .
endfm
fmod SELMAXSORT is
***> sortarea prin selectia directa a maximului
extending LISTENAT .
op maxim : Nat Nat -> Nat .
op maxlist : Lista -> Nat .
op sterge : Nat Lista -> Lista .
op sortare : Lista -> Lista .
vars X Y : Nat .
var L : Lista .
ceq maxim(X,Y) = X if X >= Y .
ceq maxim(X,Y) = Y if X < Y .
eq maxlist(X) = X .
eq maxlist(X Y L) = maxim(X,maxlist(Y L)) .
eq sterge(X,nil) = nil .
eq sterge(X,X L) = L .
ceq sterge(X,Y L) = Y sterge(X,L) if X =/= Y .
eq sortare(nil) = nil .
eq sortare(X L) = sortare(sterge(maxlist(X L),X L)) maxlist(X L) .
endfm
fmod SELMAXSORT2 is
***( tot sortarea prin selectia directa a maximului, dar cu evitarea
recalcularii maximului din lista in operatia de sortare )
extending LISTENAT .
op maxim : Nat Nat -> Nat .
op maxlist : Lista -> Nat .
op sterge : Nat Lista -> Lista .
op sortare : Lista -> Lista .
op restul : Nat Lista -> Lista .
vars X Y : Nat .
var L : Lista .
ceq maxim(X,Y) = X if X >= Y .
ceq maxim(X,Y) = Y if X < Y .
eq maxlist(X) = X .
eq maxlist(X Y L) = maxim(X,maxlist(Y L)) .
eq sterge(X,nil) = nil .
eq sterge(X,X L) = L .
ceq sterge(X,Y L) = Y sterge(X,L) if X =/= Y .
eq sortare(nil) = nil .
eq sortare(X L) = restul(maxlist(X L),X L) .
eq restul(Y,L) = sortare(sterge(Y,L)) Y .
endfm
fmod BBLSORT is
***> bubblesortul, efectuat intr-o operatie distincta de concatenare
extending LISTENAT .
op bsort : Lista -> Lista .
op parcurge : Lista -> Lista .
op eordcresc : Lista -> Bool .
var L : Lista .
vars X Y : Nat .
eq eordcresc(nil) = true .
eq eordcresc(X) = true .
eq eordcresc(X Y L) = X <= Y and eordcresc(Y L) .
eq parcurge(nil)
eq parcurge(X) =
ceq parcurge(X Y
ceq parcurge(X Y
= nil .
X .
L) = X parcurge(Y L) if X <= Y .
L) = Y parcurge(X L) if X > Y .