Sunteți pe pagina 1din 19

SISTEME EXPERT

Universitatea din Oradea

Prof. Dr. Cornelia Győrödi

Sisteme Expert - (cgyorodi@uoradea.ro) 1


Curs 7

Metode de sortare a listelor


Bubblesort
Quicksort
Insertsort

prof. dr. ing. Cornelia Gyorodi 2


Sortarea listelor - Metoda Bubblesort
Prima metodă de sortare cea mai des.
Această metodă constă în parcurgerea repetată a listei şi
compararea elementelor două câte două.
Operaţia de sortare utilizează un predicat auxiliar gt(X, Y),
care este definit astfel: gt(X, Y):- X> Y.
Presupunând că sortarea se face pe o listă de numere întregi,
crescător, regulile sunt:
 Două elemente adiacente X, Y se inversează dacă

predicatul gt(X, Y) este adevărat, după care se trece la


sortarea cozi listei rămase (capul listei este format din
elemente X şi Y).
 Dacă nu există o schimbare atunci lista se consideră
sortată.
prof. dr. ing. Cornelia Gyorodi 3
Metoda se sortare Bubblesort
implement main
open core
domains
lista = integer*.
class predicates
gt: (integer, integer) determ.
clauses
gt(X, Y) :- X > Y.
class predicates
schimba : (lista, lista,integer) multi (i,o,o).
clauses
schimba([],[],0).
schimba([X,Y | L1],[Y,X | L2], 1) :-
gt(X, Y),
schimba(L1, L2, _).
schimba([Z | L1],[Z | L2],S) :-
schimba(L1, L2,S). 4
Metoda se sortare Bubblesort (continuare)

class predicates
bubblesort : (lista, lista) procedure(i,o).
clauses
bubblesort(L, R) :-
schimba(L, Sortat1, S),
S = 1,
bubblesort(Sortat1, R), !.
bubblesort(L, L).

prof. dr. ing. Cornelia Gyorodi 5


Metoda se sortare Bubblesort (continuare)
class predicates
readint:(integer, string) determ (o,i).
clauses
readint(X, M):-
stdIO::write(M),
S = stdIO::readLine(),
hasDomain(integer, X),
X = tryToTerm(S).
class predicates
citeste: (lista) multi (o).
clauses
citeste([E | R]) :-
readint(E, "Introduceti un element al listei:"),
citeste(R).
citeste([]).
prof. dr. ing. Cornelia Gyorodi 6
Metoda se sortare Bubblesort (continuare)

clauses
run() :-
console::init(),
citeste(L),
stdIO::write("Lista:\n",L),
bubblesort(L,L1),
stdIO::write("\nLista ordonata:\n",L1),!.
run().
end implement main

prof. dr. ing. Cornelia Gyorodi 7


Metoda de sortare Quicksort
Metoda de sortare Quicksort utilizează mecanismul
divide et impera care presupune parcurgerea
următorilor pași:
 Se împarte lista în două liste, una dintre liste va
conține elementele mai mici decât un element al
listei ( de obicei primul element se ia ca și pivot),
iar cealaltă listă elementele mai mari.
 Cele două liste obținute se sortează prin aceeași

metodă, iar variantele sortate obținute se


concatenează.

prof. dr. ing. Cornelia Gyorodi 8


Metoda de sortare Quicksort
implement main
open core
domains
lista=integer*.
class predicates
gt: (integer, integer) determ.
clauses
gt(X, Y) :- X > Y.
class predicates
conc : (lista,lista,lista) determ (i,i,o).
clauses
conc([],L,L).
conc([X | L1], L2,[X | L3]) :- conc(L1, L2, L3).
prof. dr. ing. Cornelia Gyorodi 9
Metoda de sortare Quicksort (continuare)
class predicates
quicksort : (lista, lista) nondeterm (i,o).
clauses
quicksort([],[]):-!.
quicksort([X | Rest], Sortat) :-
impart( X, Rest, Rest_mic,Rest_mare),
quicksort(Rest_mic, Sortat_mic),
quicksort(Rest_mare, Sortat_mare),
conc(Sortat_mic, [X | Sortat_mare], Sortat).
class predicates
impart : ( integer, lista, lista,lista) nondeterm(i, i, o,o).
clauses
impart(X,[],[],[]).
impart(X, [Y | Rest], [Y | Rest_mic], Rest_mare) :-
gt(X, Y),!,
impart(X, Rest,Rest_mic,Rest_mare).
impart(X,[Y | Rest], Rest_mic,[Y | Rest_mare]) :-
impart(X, Rest, Rest_mic,Rest_mare).
prof. dr. ing. Cornelia Gyorodi 10
Metoda de sortare Quicksort (continuare)
class predicates
readint:(integer, string) determ (o,i).
clauses
readint(X, M):-
stdIO::write(M),
S = stdIO::readLine(),
hasDomain(integer, X),
X = tryToTerm(S).

prof. dr. ing. Cornelia Gyorodi 11


Metoda de sortare Quicksort (continuare)
class predicates
citeste: (lista) multi (o).
clauses
citeste([E | R]) :-
readint(E, "Introduceti un element al listei:"),
citeste(R).
citeste([]).
clauses
run() :-
console::init(),
citeste(L),
stdIO::write("Lista:\n",L),
quicksort(L,L1),
stdIO::write("\nLista ordonata:\n",L1),!.
run().
end implement main
prof. dr. ing. Cornelia Gyorodi 12
Metoda de sortare Insertsort

Metoda de sortare Insertsort parcurge lista și


apelează predicatul de inserare a unui element în
listă insert(X, [Y | Rest],[Y | Rest1]), care în
funcție de rezultatul predicatului auxiliar gt(X, Y),
inserează pe X în capul listei sau apelează recursiv
predicatul de inserare pentru inserarea lui X pe
restul listei.
Operaţia de inserare utilizează un predicat auxiliar
gt(X, Y), care este definit astfel: gt(X, Y):- X> Y

prof. dr. ing. Cornelia Gyorodi 13


Metoda de sortare Insertsort (continuare)
implement main
open core
domains
lista=integer*.
class predicates
readint:(integer, string) determ (o,i).
clauses
readint(X, M):-
stdIO::write(M),
S = stdIO::readLine(),
hasDomain(integer, X),
X = tryToTerm(S).
class predicates
citeste: (lista) multi (o).
clauses
citeste([E | R]) :-
readint(E, "Introduceti un element al listei:"),
citeste(R).
citeste([]). prof. dr. ing. Cornelia Gyorodi 14
Metoda de sortare Insertsort (continuare)

class predicates
gt: (integer, integer) determ.
clauses
gt(X, Y) :- X > Y.
class predicates
insert : (integer, lista, lista) nondeterm(i,i,o).
clauses
insert(X, [Y | Rest],[Y | Rest1]) :-
gt(X, Y),!,
insert(X, Rest,Rest1).
insert(X, L, [X | L]) .
prof. dr. ing. Cornelia Gyorodi 15
Metoda de sortare Insertsort (continuare)
class predicates
insertsort : (lista, lista) nondeterm(i,o).
clauses
insertsort([],[]).
insertsort([X | Rest],Sortat) :-
insertsort(Rest, Sortat1),
insert(X, Sortat1,Sortat).
clauses
run() :-
console::init(),
citeste(L),
stdIO::write("Lista:\n",L),
insertsort(L,L2),
stdIO::write("\nLista sortata:\n",L2),!.
run().
end implement main
prof. dr. ing. Cornelia Gyorodi 16
Exemplu
Diferența a două liste:
domains
lista=integer*

class predicates
dif : (lista, lista, lista) procedure(i,i, o).

clauses
dif([],[],[]).
dif([X|Rest1],[Y|Rest2],[Z|Rez]):-
dif(Rest1,Rest2,Rez),Z=X-Y.
dif([_|Rest1],L,Rez):-dif(Rest1,L,Rez).

prof. dr. ing. Cornelia Gyorodi 17


Construcția foreach
Construcția foreach este concepută ca un înlocuitor pentru
buclele fail.
Sintaxa generală a instrucțiuni foreach:
foreach nondeterm_predicate(X) do
Process(X),
end foreach,
……
Exemplu:
foreach nondeterm_predicate(X) do
write(X), nl()
end foreach,

prof. dr. ing. Cornelia Gyorodi 18


Construcția foreach (continuare)
Construcția foreach poate fi imbricată în mod
corespunzător.
Examplu:
foreach member(L, LL) do
write("<< "),
foreach member(X, L) do
write(" ", X)
end foreach,
write(" >>\n")
end foreach.

prof. dr. ing. Cornelia Gyorodi 19

S-ar putea să vă placă și