Limbajul
ELF este folosit pentru formularea si verificarea meta-teoremelor despre
sistemele deductive. Poate verifica multe teoreme dincolo de scopul curent
al demonstrarii teoremelor. Mai mult, o parte semnificativa a verificarii
este indeplinita automat in timpul reconstructiei termenilor, type-checking
si shema-checking.
O aplicatie pentru
utilizarea acestui limbaj este implementarea metodelor de sortare (quicksort,
sortarea prin selectie, insertie) si interclasarea a doua liste polimorfice.
Deoarece limbajul
Elf folseste SML-ul (Standard ML of New Jersey) pentru a executa intrebarile
la un nivel inalt, exista trei fisiere "sortari.elf",
"declaratii.elf" si "liste.elf" care
trebuie incarcate intr-un fisier sml "load.sml". Fiecare
fisier ".elf" defineste o semnatura, asociata cu numele fisierului.
Exista de asemenea o semnatura globala, fisierul "declaratii.elf",
care contine declaratii pentru toate constantele. Aceasta semnatura globala
este folosita pentru reconstructia tipurilor. Aici s-a definit predicatul
"maimic " ,care arata relatia dintre constantele 1,2,3,4,5
(se aleg arbitrar) ::
el
: type.
maimic : el ->
el -> type.
maimic1
: maimic 1 2.
maimic2 : maimic
2 3.
maimic3 : maimic
1 3.
maimic4 : maimic
3 4.
maimic5 : maimic
1 4.
maimic6 : maimic
2 4.
maimic7 : maimic
1 5.
maimic8 : maimic
2 5.
maimic9 : maimic
3 5.
maimic10 : maimic
4 5.
maimiceg1 : maimic
1 1.
maimiceg2 : maimic
2 2.
maimiceg3 : maimic
3 3.
maimiceg4 : maimic
4 4.
maimiceg5 : maimic
5 5.
In
fisierul "liste.elf" sunt declarate listele
polimorfice iar in "sortari.elf" sunt efectuate cateva
operatii asupra listelor si anume sortarea unei liste (in mai multe moduri
) si interclasarea a doua liste.
Exista mai multe
moduri de sortare a unei liste : sortarea pin selectie ,prin insertie
si quicksort. Prima sortare, cea prin selectie presupune folosirea unui
predicat de aflare a minimului dintr-o lista - minim. Este nevoie
si de un predicat de stergere a elementului din lista ( sterg:
elem -> lista -> lista). Aceasta sortare consta in gasirea minimului
, adaugarea lui intr-o noua lista, si stergerea din lista de sortat.
Sortarea prin insertie presupune inserarea,
pe rand, a fiecarui element al listei , intr-o lista ordonata crescator.
Elementele se insereaza pe pozitia corespunzatoare astfel incat lista
sa ramana ordonata. Este folosit si aici un predicat insert, pentru
inserarea unui element in lista.
Al treilea tip de sortare este
mai rapid, dupa cum ii este si numele. Predicatul quicksort se
refera la descompunerea listei in doua subliste si apoi apelarea recursiva
a predicatului pe cele doua subliste pana la lista vida. Pentru impartirea
listei in doua s-a folosit predicatul partitionare. Astfel lista
este partitionata in doua subliste in functie de un element dat. Una contine
elementele mai mici decat el, iar cealalta lista elementele mai mari.
Pe langa predicatele
de sortare mai exista un predicat de interclasare a doua liste. Astfel
doua liste ordonate sunt interclasate intr-una singura , lista rezultat
fiind de asemenea ordonata crescator.
Cateva intrebari pentru
verificarea predicatelor: minim, sterg ,sort_sel, insert, sort_ins, quicksort
si interclasare se gasesc in fisierul "exemple.quy".
Prin aceste intrebari se face matchingul cu predicatele corespunzatoare
si se realizeaza reconstructia tipurilor. Se vor explica in cele ce urmeaza
o serie de intrebari si rezulatele lor. Daca se doreste aflarea minimului
dintr-o lista polimorfica, atunci se pune intrebarea:
?- minim maimic (cons 3 (cons 1 (cons 4 (cons 2 (cons
5 nil))))) X.
Solving...
X = 1.
Maimic
este un predicat care testeaza relatia dintre doua elemente a unei liste.
Si anume daca intre doua constante exista o relatie de "mai mic sau
egal". El face parte din semnatura globala a programului.
Stergerea unui element
dintr-o lista, care are ca rezultat tot o lista , se face prin intrebarea:
?- sterg 3 (cons 2 (cons 3 (cons 5 nil))) X.
Solving...
X = cons 2 (cons 5 nil).
yes
?- sort_sel maimic (cons 5 (cons 3 (cons 1 (cons 4 (cons 2 nil)))))
X.
Solving...
X = cons 1 (cons 2 (cons 3 (cons 4 (cons 5 nil)))).
yes
?- sort_sel maimic (cons 3 (cons 5 (cons 1 (cons 2 (cons 3 nil)))))
X.
Solving...
X = cons 1 (cons 2 (cons 3 (cons 3 (cons 5 nil)))).
Intrebarile
de mai sus realizeaza sortarea listei data ca intrare. S-a tinut cont
si de faptul ca pot exista mai multe elemente cu aceeasi valoare.
De asemenea testarea
predicatului insert, se face prin intrebarea urmatoare unde variabilei
X i se va atribui lista formata prin inserarea unui element (in acest
caz elementul 3).
?- insert maimic 3 (cons 2 (cons 4 (cons 5 nil))) X.
Solving...
X = cons 2 (cons 3 (cons 4 (cons 5 nil))).
yes
Predicatul
sort_ins consta in descompunerea listei de sortat si inserarea , pe rand,
a elementelor la locul potrivit intr-o noua lista. Lista rezultat se pastreaza
in variabila X.
?- sort_ins maimic (cons 4 (cons 2 (cons 1 (cons 5
(cons 3 nil))))) X.
Solving...
X = cons 1 (cons 2 (cons 3 (cons 4 (cons 5 nil)))).
yes
Prin
partitionare lista de sortat se descompune in doua liste X1 si X2.
?- partitionare maimic (cons 2 (cons 5 (cons 1 (cons
4 nil)))) 3 X1 X2.
Solving...
X2 = cons 5 (cons 4 nil),
X1 = cons 2 (cons 1 nil).
yes
Sortarea rapida (quicksort):
?- quicksort maimic (cons 1
(cons 5 (cons 3 (cons 4 nil)))) X.
Solving...
X = cons 1 (cons 3 (cons 4 (cons 5 nil))).
yes
Doua liste
ordonate si interclaseaza, adica se formeaza o a treia lista cu elementele
celor doua in ordine crescatoare.
?- interclasare maimic (cons 2 (cons 4 nil)) (cons
1 (cons 3 (cons 5 nil))) X.
Solving...
X = cons 1 (cons 2 (cons 3 (cons 4 (cons 5 nil)))).
GC #1.2.5.11.226.9098: (0 ms)
yes
Pentru
rularea acestui exemplu, dupa ce s-a incarcat limbajul Elf si dupa ce
s-a setat calea corespunzatoare se executa urmatorii pasi:
-
use "load.sml";
-
load ();
-
top ();
?-
... intrebari ...
?-
^D % Control-D pentru a reveni la SML
Fisierul ce contine exemplele
se executa astfel:
-
batch_top "exemple.quy";
Este foarte important
faptul ca aceste intrebari nu sunt unice ci se pot formula si altele.
Predicatele descrise in "sortari.elf" se pot folosi pentru crearea
unora noi in functie de cerinte. Limbajul ELF permite si implementarea
unor algoritmi de demonstrare a teoremelor, deductia tipurilor , de evaluare
a demonstratie etc, avand o aplicabilitate foarte mare.
SURSELE :
liste.elf, declaratii.elf,
sortari.elf, exemple.quy,
load.sml
|