Documente Academic
Documente Profesional
Documente Cultură
INTRODUCERE
Ecuaiile sunt importante n matematic i n tiin. Uneori se ncearc s se determine dac o identitate rezult logic din nite axiome date, alteori se caut soluiile unei ecuaii date. Aceste capaciti de raionamente sunt importante n multe aplicaii computerizate, incluznd calcule simbolice algebrice, demonstrarea automat a teoremelor, specificarea i verificarea programelor, limbajelor i mediilor de programare de nivel nalt. Sistemele de rescriere sunt ecuaii orientate, utilizate pentru a calcula nlocuirea repetat a subtermenilor dintr-o formul dat cu termeni egali pn cnd se obine cea mai simpl form posibil. Ideea simplificrii ecuaiilor a fost prezentat n toat evoluia algebrei. Ca interpretare n informatic, sistemele de rescriere i-au fcut apariia n anii 60; multe programe moderne pentru manipulare simbolic continu s foloseasc reguli de rescriere pentru simplificare n maniera ad hoc. Ca formalism, sistemele de rescriere au puterea unei maini Turing. Teoria sistemelor de rescriere n esen este o teorie a formelor normale; ntr-o oarecare msur este o prelungire privind studiul calculul lui lambda. Pentru a introduce cteva idei principale n teoria rescrierii considerm mai multe variante a Problemei cutiei de cafea. S
Lucrare de diplom
pagina
negru negru -> alb Acest set de reguli este un exemplu de sistem de rescriere. Fiecare regul descrie o micare permis: primele dou reguli spun c n oricare moment al jocului boaba alb dintr-o pereche de boabe adiacente diferite poate fi neglijat; ultima regul spune c doua boabe negre adiacente pot fi nlocuite cu una alb. De exemplu ceea ce urmeaz este o posibil secven de micri (boabele subliniate particip la micarea curent): alb alb negru negru alb alb negru negru alb alb negru negru alb negru negru alb alb alb alb negru negru alb alb alb negru negru alb alb negru negru alb negru negru
Lucrare de diplom
pagina
Ceea ce este diferit la noul joc, este c una dintre reguli se aplic la orice cutie. Ceea ce este interesant este c rezultatul jocului este complet independent de alegerea momentului n care se face mutarea. Ordinea n care micrile la locaiile nesuprapuse sunt fcute, este important deoarece oricare mutare care nu a fost
Lucrare de diplom
pagina
Noile reguli au acelai rezultat final ca i cele originale, indiferent ct de des se face o micare care conduce la creterea numrului de boabe. n analiza final, cutia trebuie golit pn la o boab. n final se consider varianta n care se aplic reguli pentru orice dou boabe ( nu neaprat adiacente). Noile reguli sunt:
Lucrare de diplom
pagina
unde un semn de lips din dreapta se refer la aceleai boabe care apar n stnga. Din nou se poate arta c rezultatul este unic determinat de configuraia iniial i este n consecin acelai ca n jocurile anterioare. Rezultatul final constnd dintr-o secven netransformabil prin reguli se numete form normal. Cnd calculul pentru termeni egali se termin ntotdeauna ntr-o aceeai form normal, sistemul de rescriere poate fi utilizat ca un program funcional nedeterministic (Goguen&Tardo[92]). Un astfel de sistem de asemenea servete ca procedur dac doi termeni sunt egali ntr-o teorie ecuaional definit prin reguli i n particular rezolv problema cuvntului pentru aceste teorii. Knuth [149] a elaborat un test efectiv (bazat pe o suprapunere critic) pentru a determina dac un sistem are proprietate de terminare, caz n care toate calculele converg la o form canonic, indiferent de alegerea nedeterministic fcut. Knuth a demonstrat c eecul testului adesea sugereaz reguli adiionale care pot fi utilizate pentru a completa un sistem neconvergent ntr-unul convergent.
Lucrare de diplom
pagina
Lucrare de diplom
pagina
Tipurile de date algebrice reprezint un domeniu de aplicare important pentru raionamentul ecuaional bazat pe rescriere. ntr-un mod abstract, privind specificarea datelor, datele sunt preluate ca obiecte abstracte iar semantica funciilor de operare asupra datelor sunt descrise de o mulime de constrngeri. n acest capitol se va vorbi despre sintaxa ecuaiilor i despre demonstraii ecuaionale. Deci dup cum vom vedea, orientnd ecuaiile de la snga la dreapta, se va obine un concept de demonstraie direcionat. 2.1. TERMENI S presupunem c dorim s definim operaiile standarde asupra stivelor top i pop, ca i o operaie alternat care combin cele dou stive. Stivele de numere naturale pot fi reprezentate prin termeni de forma push(s1,push(s2,...,push(sn,)...)),unde este stiva vid iar si indic reprezentarea numerelor naturale, 0, succ(0), succ(succ(0)), i aa mai departe. Sintaxa precis a acestor reprezentri poate fi dat pe urmtoarea cale inductiv: Zero = {0} Nat = Zero succ(Nat) Empty = {} Stack = Empty push(Nat, Stack)
alternate: Stack*Stack -> Stack Dup acesta vom da semantici noilor funcii, prin constrngerea s satisfac urmtorul set de ecuaii: top(push(x,y)) = x pop(push(x,y)) = y alternate(,z ) = z alternate(push(x,y),z)= push(x,alternate(z,y)) (unde x, y i z reprezint variabile lund valori pe mulimea tuturor datelor corespondeni). Inversele constructorilor, ca top i pop se numesc "selectoare". Cu aceste ecuaii, se poate arta, de exemplu urmtoarea egalitate: alternate(push(top(push(0,)),),pop(push(succ(0),))) push(0,) n general dintr-o mulime F=n 0Fn de simboluri de funcie numite vocabular sau siganatur - i o mulime numrabil X de =
2.2. ECUAII O relaie de echivalen ~ pe o mulime de termeni este o congruen dac (s1,...,sn) ~ (t1,...,tn) de cte ori si ~ ti pentru i=1...n. n particular nchiderea reflexiv simetric-tranzitiv notat <-*> a oricrei relaii de rescriere este o congruen. Pe noi ne intereseaz congruenele generate de instane ale ecuaiilor. Pentru scopurile noaster o ecuaie este o pereche neordonat {s,t} de termeni (Pentru alte scopuri ecuaiile pot fi privite ca perechi ordonate). Ecuaiile vor fi scrise n forma s = t. Cei doi termeni pot conine variabile care sunt considerate ca fiind cuantificate universal. Dat o mulime de ecuaii A peste o mulime de termeni , teoria ecuaional a lui E, notat h(E) este mulimea tuturor ecuaiilor care pot fi obinute considernd reflexivitatea, simetria i tranzitivitatea ca reguli de inferen iar apariiile ecuaiilor din E ca axiome. Vom scrie Es = t dac s = t h(E). Un sistem mai compact de inferen este bazat pe noiunea familiar de nlocuirea egalilor prin egali . Vom scrie s <-E> t pentru termenii s,t dac s are un subtermen care este o apariie a unui membru al unei ecuaii din E iar t este rezultatul
celuilalt membru al ecuaiei. Vom scrie formal s <-E> t dac s = u[l]p i t = u[r]p pentru un anumit context u pentru poziia p din u, pentru ecuaia l = r din E i substituia . Se tie c Es = t dac i numai dac s <-*E> t unde <-*E> este nchiderea reflexivtranzitiv a relaiei <-E> ; cu alte cuvinte se poate demonstra c doi termeni sunt egali dac unul dintre ei poate fi obinut din cellat printr-un numr finit de nlocuiri a unor subtermeni egali. Relaia <-E> este nchiderea prin rescriere a lui E cnd acesta este privit ca o relaie simetric i <-*E> este nchiderea congruenei lui <-E> adic <-*E> este cea mai mic congruen peste astfel c l <-*E> r pentru toate ecuaiile l = r din E i toate substituiile
congruenei unui termen s i vom nota prin /E mulimea tuturor claselor de congruen. O derivaie
E
>si<-E>...
de
aplicaii
Demonstraia n E a unei ecuaii s = t este o derivare finit s = s0<-E>s1<-E>...<-E>sn = t (n 0), fiecare pas si<-E>si+1 este justificat printr-o referin la o axiom l = r din E, o poziie p n termenul si, i o substituie astfel c si |p=l i si+1|p= si [r]p. S ne ntoarcem la exemplul nostru anterior, i s notm cu E axiomele sale. Atunci urmtoarea secvent este un exemplu de derivare: alternate (push(top(push(0,z)),z),) <-E> alternate(push(0,z),)
Ideea central a rescrierii este s impun o direcie de utilizare a ecuaiilor n demonstraii. Spre deosebire de ecuaiile care sunt neordonate , o regul peste o mulime de termeni este o pereche ordonat <l,r> de termeni pe care vom scrie ca l r. Regulile difer de ecuaii prin utilizarea lor. Ca i la ecuaii, regulile sunt utilizate pentru a nlocui apariii ale lui l prin apariii corespunztoare ale lui r. Spre deosebire de ecuaii, regulile nu sunt utilizate pentru a nlocui apariii ale lui r. O mulime finit de reguli R peste T este numit un sistem de rescriere sau TRS(Term Rewriting System). Un sistem R poate fi gndit ca o relaie binar nesimetric pe T; nchiderea acestei relaii descrie efectul aplicaiei de la stnga la dreapta a unei reguli din R. Definiie Un sistem de rescriere a termenilor (TRS) R este o mulime de reguli : R={ lr | l,r (F,X), fiecare variabil care apare n
termenul r apare i n termenul l }. Acesta definete o relaie de rescriere -R>. Definiie Pentru un TRS R un termen s din se rescrie ntrun termen t din i se noteaz s-R>t dac s|p = l i t = s[r]p,
alternate(push(x,y),z) -> push(x,alternate(z,y)) Un exemplu de derivare este: alternate(push(top(push(0,z)),z),) -R> alternate(push(0,z),) -R> push(0,alternate(,z)) -R> push(0,z). Primul pas este o aplicare a reguli top-push pentru apariia top(push(0,z)); al doilea pas este o aplicare a regulii alternatepush cu 0 pentru x, z pentru y i pentru z; al treilea pas este o aplicare a regulii alternate(,z) -> z. S notm c este posibil i o alt derivare care conduce la aceeai form normal :
proprietatea de terminism dac nu exist nici o secven infinit t1-> t2 -> t3 ->... de elemente ale lui T. Proprietatea de terminism are o condiie suplimentar fa de aceea c sistemul s fie normalizat, deoarece ultima permite anumite derivaii s fie infinite. O ordine parial notat pe o mulime T este well-founded dac nu exist nici un lan infinit descresctor t1t2 de elemente ale lui T. Adic o relaie are proprietatea de terminism dac ea este nchiderea tranzitiv -+> a unei ordine well-founded. Importana relaiei cu proprietatea de terminism const n posibilitatea demonstrrii inductive n care se presupune c ipoteza este satisfcut de toate elementele t astfel c s-+> t atunci cnd ea se demonstreaz pentru un s arbitrar. Un TRS R are proprietatea de terminism pentru o mulime de termeni dac relaia -R> peste are proprietatea de terminism adic nu exist o derivare infinit t1 -R> t2 -R> t3 -R>... de termeni n . Dac un TRS are proprietatea de terminist atunci
obinut att prin rescrierea lui s ct i a lui t. Vom da mai jos un exemplu utiliznd sistemul de mai sus: alternate(push(top(push(0,z)),z,) alternate(push(0,pop(push(y,z))),) -R> push(0,alternate(,pop(push(y,z)))) <R-R> push(0,alternate(,z)) <RCu un sistem care are proprietatea de terminism i are un numr finit de reguli lungimea unei demostraii prin rescriere este finit. Evident nu exist garania c exist o demonstraie direct pentru o consecin a unei ecuaii din R. n cazul n care exist o astfel de garanie sistemul este denumit Church-Rosser. 2.4. METODE DE DEMONSTRARE A TEOREMELOR CU TRS alternate(push(0,z),)
Sisteme de rescriere a termenilor i implementrile lor - Capitolul 3 3.ELEMENTE DE LIMBAJ TURBO PROLOG
Turbo Prolog este un program care este structurat n mod riguros pe seciuni. Fiecare seciune program este identificat printr-un cuvnt cheie aa cum este artat n felul urmtor: opiune de compilare - este dat la nceputul fiecrui program seciunea constants - zero sau mai multe constante seciunea domains - zero sau mai multe declaraii de domenii seciunea database - zero sau mai multe predicate de baze de date seciunea predicates - zero sau mai multe declaraii de predicate seciunea goal - zero sau mai multe goal-uri seciunea clauses - zero sau mai multe clauze Nu este nevoie a include toate seciunile n program. De exemplu dac omitem seciunea goal putem s dm toate goal-urile n timpul rulrii. Pe de alt parte programul poate s conin doar o singur seciune goal. Pentru a genera o aplicaie executabil de sine stttoare programul trebuie s conin un goal. Goal-ul este singurul opional cnd rulm un program de dezvoltare. n mod uzual programul recurge cel puin la seciunile predicates i clauses. Pentru cele mai multe programe, seciunea domains este
3.1.3. Domeniu obiect compus myCompDom = f1(d11,d12,...,d1N);f2(d21,d22,...,d2N);... A declara un domeniu care conine obiecte compuse au statut de functori i domenii pentru toate subcomponentele. De exemplu, se poate declara un domeniu owners constituit din elemente ca: owns(john,book(wuthering_heights,broute)) cu declaraii: owners = owns(symbol,book) book = book(symbol,symbol) unde owns este un functor al obiectelor compuse i symbol i book sunt domenii ai subcomponentelor. Partea dreapt al acestui tip de declaraie domains poate defini mai multe alternative, separate prin punct i virgul (;) sau prin cuvntul cheie or. Fiecare alternativ poate s conin un unic functor i o descriere a domeniilor pentru actualele subcomponente a functorului. De exemplu urmtoarea declaraie
file:keyboard, screen, printer, com1, stdin, stdout, stderr. 3.2. SECIUNEA PREDICATES n Turbo Prolog seciunea introdus de cuvntul cheie predicates conine declaraiile predicatelor. Declararea unui predicat const din numele lui i domeniile argumentelor lui. predicates predname(domain1,domain2,...,domainN) n acest exemplu predname reprezint un nou nume de predicat iar domain1,domain2,...,donainN domenii definite de utilizator sau domenii standard.
hanoi(integer) % mut N piese Dac se declar mai multe declaraii cu acelai nume, aceste declaraii trebuie declarate corect una dup cealalt. Se pot declara predicate deterministice astfel ca declaraia predicatului s fie precedat de determ, sau se pot declara predicate nondeterministe astfel ca declaraia predicatului s fie precedat de nondeterm. Dac se declar un predicat deterministic, compilarea se va termina cu un avertizment dac va fi gsit o clauz nondeterminist pentru predicat. Aceste funcii sunt exacte dac se utilizeaz directiva de compilare check_determ. Pe de alt parte, dac se declar predicatul ca
adugm check_determ pentru verificarea celorlalte predicate. nondeterm repeat prin proiectare*/ determ menuact(integer,string) deterministic */ /* menuact este /* repetiia este nondeterministic
3.3. SECIUNEA DATABASE Seciunea database declar perdicatele exact cum o face seciunea predicates. Cu toate acestea, predicatele n seciunea database de fapt pot fi singurele fr variabile. Acestea ns pot fi introduse n timpul rulrii prin assert, asserta, assertz sau consult, i pot fi retrase cu retract sau retractall. n cadrul unui program pot fi mai multe seciuni database; unele dintre ele pot fi globale iar altele locale. Trebuie s avem un nume al seciunilor database din program, i fiecare nume trebuie s fie unic n modul. Dac nu se d un nume seciunii database, compilatorul va da implicit numele dbasedom. Se poate precede predicatul database cu determ dac se cunoate c el este singurul fapt pentru acel predicat. Acestea sunt validate de compilator pentru a produce un cod mai bun, i nu se va primi un mesaj de analizare nondeterminist la apelul unui astfel de predicat. Acesta este folositor n flags, contoare i alte variabile globale.
3.4. SECIUNEA CLAUSES O clauz este ori un fapt ori o regul corespunznd ununia dintre predicatele declarate. ntr-o clauz primul predicat este urmat de dou puncte i linie (:-), iar dup aceea apare lista predicatelor separate de virgule sau punct i virgule. Ambele, fapte i reguli, trebuie s se termine prin punct (.) - cteodat acesta se refer la terminare final. Fapta same_league(uda,usc). conine numele predicatului (same_league) i n paranteze, lista argumentelor (uda,usc). Altele: -Cuvntul cheie if poate fi substituit de :-Cuvntul cheie and poate fi substituit de , -Cuvntul cheie or poate fi substituit de ;
Subcomponentele sunt incluse ntre paranteze i sunt separate prin virgul. Functorul este scris doar nainte de paranteza stng. De exemplu, urmtorul termen compus conine functorul author i trei subcomponente: author(emily, bronte,1818) Obiectul compus aparine domeniului definit de utilizator. Declaraia domains corespunznd obiectului compus author, poate s arate n felul urmtor: domains author_dom year_of_birth) firstname,lastname =symbol year_of_birth = integer 3.4.5. Liste - Un tip special al obiectelor compuse = author (firstname, lastname,
va genera un mesaj de eroare recursie n definiia de constant. Sistemul nu poate face distincie ntre litere mici i litere mari n declaraia constants . Consecvent cnd un identificator constants este folosit n seciunea clauses a programului, prima liter trebuie s fie mic pentru a evita ambiguitatea cu variabilele. Deci ca exemplu, urmtoarea este o costrucie corect: constants Two =2 goal A = two, write(A).
NOT Funcia: Se termin cu succes dac subgoalul negat eueaz i eueaz dac subgoalul negat se termin cu succes. Declaraia: not( <ApelPredicat> ) Observaii: not se termin cu succes dac <ApelPredicat> reprezint un goal care eueaz cnd este evaluat. Variabilele not pentru c variabilele s ne de ieire nu sunt permise ntr-un apel
nu pot fi legate de o operaie not. Este o idee bun succes dac condiia este fals ".
gndim la not ca " eec dac condiia este adevrat " sau "
Eec: Dac apelul ApelPredicat se termin cu succes. Erori: Nu sunt. Exemplu: goal: not(2>3) Yes goal: not(2<3) No goal: not(concat("aaa", "bbb", "aaa_bbb")) Yes goal: not(not(concat("aaa", "bbb", "aaa_bbb")))
(o, i) Returneaz un ir de Lungime spaii. Eec: Rezult din observaii. Exemplu: goal: str_len("abc", Len) Len = 3 1 Solution goal: str_len("abc", 3) Yes goal: str_len(Str, 15), writef("|%|\n", Str) ' Str = 1 Solution STR_INT Funcia: Face conversia ntre iruri i ntregi. Declaraii: str_int (Argir, Argntr) Domenii: (string, integer) Metode de I/O: (i, o), (o, i), (i, i) Observaii: (o, i) Leag Argir de un ir ce reprezint un numr valoarea variabilei legate Argntr. '
No Solution
i pentru a testa dac anumite caractere fac parte dintr-un ir. Dac argumentul ir este legat de un ir de lungime zero, predicatul se termin cu eec.
Eec: Rezult din observaii. Erori: 5110 irul rezultat a predicatului frontchar nu poate avea lungime mai mare de 64K.
Exemplu: goal: frontchar("TPROLOG", Ch, Rest) Ch = T, Rest = PROLOG 1 Solution goal: frontchar("TPROLOG", 'T', Rest) Rest=PROLOG 1 Solution
integer, integer) Metode de I/O: (i, i, i, i, i, i, i, i) i (o, o, o, o, o, o, o, o) Observaii: (i, i, i, i, i, i, i, i) makewindow definete o arie pe ecran care devine o fereastr. Argumentele urmtoarele: WindowNo: Fiecare fereastr este identificat printr-un numr WindowNo, activ. ScrAtt: Atributul de ecran. care este folosit cnd se selecteaz fereastra instruciunii 'makewindow' sunt
coloan: Poziia liniei care compune chenarul stnga-sus a ferestrei relativ la ecran.
nlime: nlimea ferestrei n uniti de linie. lime: Limea ferestrei n uniti de coloan. Odat definit, fereastra este tears, i cursorul va fi mutat n poziia din stnga-sus a chenarului. Combinaiile linie i obligatorii pentru a defini Dac afiare. nlime i coloan i lime, sunt
valorile de definire a ferestrei depete formatul de afiare, se va genera un mesaj de eroare. Dimensiunea formatului de afiare poate fi standard. (o, o, o, o, o, o, o, o) n acest caz makewindow ntoarce valoarea curent a ferestrei curente. modificat cu predicatul textmode, predicat
RESCRIERE A
TERMENILOR
4.1. PROBLEMA Partea practic a lucrrii o constituie utilizarea unui sistem canonic de rescriere a termenilor, i realizat n limbajul Turbo Prolog. Problema, pe care o rezolv programul, se poate formula astfel (noiunile teoretice fiind descrise n capitolul precedent) : Find dat un sistem canonic de rescriere a termenilor (TRS - Term Rewriting Sistem), s se execute rescrierea unui termen, s se verifice despre o ecuaie dac este o teorem, aducnd ambii termeni la o form normal. 4.2. DE CE TURBO PROLOG ? Natura problemei a impus folosirea acestui limbaj de generaia a cincea. Un limbaj "clasic", procedural, cum ar fi Pascalul sau C-ul, cere programatorului cunoaterea exact a pailor care conduc la rezolvare. n contrast Prologul este un limbaj declarativ, care nseamn c dndu-se faptele i regulile necesare, limbajul va folosi deducia pentru a rezolva problema. Natura problemei ce trebuia rezolvat cerea exact ceea ce este punctul forte al Prologului: din descrierea problemei i a regulilor, s se ajung la soluie. 4.3. CUM SE FOLOSETE PROGRAMUL
tergerea din irul S1 ncepnd cu poziia Pos a N caractere. Exemplu: Goal: tai_sir(sssretaa, 4, 2, S) S = ssstaa 1 Solution subst_prima_ap(S1, S2, S3, S): irul S este obinut prin
nlocuirea n irul S1 a prime apariii a subirului S2 cu irul S3. Exempu: Goal: subst_prima_ap(eeere, er, ttt, S) S = eetttr 1 Solution Goal: subst_prima_ap(eernerj, er, tttt, S) S = etttnerj 1 Solution
dim([],0). dim([_|T],N):-dim(T,N1),N=N1+1. /* Determina numarul termenilor dintr-o lista */ functor(cmp(X,Y),X,N):-dim(Y,N). /* Se determina numarul de argumente pentru termenul care are simbolul X */ subst_term(_,var(_),con(X),con(X)):-!. subst_term(Term,var(X),var(X),Term):-!. subst_term(_,var(X),var(Y),var(Y)):-X<>Y,!. subst_term(Term,Var,Functor,Nou_functor):Functor=cmp(X,Y), subst_list(Term,Var,Y,Nou_list), Nou_functor=cmp(X,Nou_list),!. /* In Functor se inlocuieste Var cu Term daca Var exista in Term si rezulta Nou_functor */ subst_list(Term,Var,[H|T],[H1|T1]):subst_term(Term,Var,H,H1), subst_list(Term,Var,T,T1). subst_list(_,_,[],[]):-!. /* Face acelasi lucru ca si subst_term pentru o lista de termeni */ nu_apare(var(U),var(V)):-U<>V. nu_apare(var(_),con(_)). nu_apare(var(_),cmp(_,[])). nu_apare(X,Y):-functor(Y,_,N), N>0, nu_ap(N,X,Y). /* Verifica daca primul termen exista sau nu in al doilea ca subtermen */ nu_ap(0,_,_). nu_ap(N,X,Y):-N>0, argument_fct(N,Y,Arg), nu_apare(X,Arg), N1=N-1, nu_ap(N1,X,Y). /* Predicat ajutator pentru nu_apare pentru cazul in care se verifica o lista de argumente a unei functii */ argument_fct(N,cmp(_,Y),ArgX):-elem(N,Y,ArgX). /* Verifica daca in lista de argumente Y sunt N argumente ArgX */ elem(1,[H|_],H). elem(N,[_|T],ArgX):-M=N-1, elem(M,T,ArgX). /* N este numarul de termeni ArgX in T */