|  
                   
        
                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  
       
       
          
     |