This shows you the differences between two versions of the page.
|
pp:24:laboratoare:tda [2026/02/12 14:47] mihaela.balint [Axiome] |
pp:24:laboratoare:tda [2026/02/12 15:20] (current) mihaela.balint [Exerciții] |
||
|---|---|---|---|
| Line 65: | Line 65: | ||
| ==== Inducția Structurală ==== | ==== Inducția Structurală ==== | ||
| Inducția structurală este un caz particular al inducției bine formate, și se folosește pentru a demonstra că o proprietate $P(v)$ este adevărată pentru orice valoare $v$ a unui TDA: | Inducția structurală este un caz particular al inducției bine formate, și se folosește pentru a demonstra că o proprietate $P(v)$ este adevărată pentru orice valoare $v$ a unui TDA: | ||
| - | * **Cazul de bază**: Demonstrăm $P(v)$ pentru valori de dimensiune minimă (constructori nulari sau externi). | + | * **Cazul de bază**: \\ Demonstrăm $P(v)$ pentru valori de dimensiune minimă (constructori nulari sau externi). |
| - | * **Pasul inductiv**: Presupunem că $P$ este adevărată pentru toate valorile de dimensiune $< n$ (ipoteza inductivă) și demonstrăm pentru valori de dimensiune $n$ (obținute prin constructori interni). | + | * **Pasul inductiv**: \\ Presupunem că $P$ este adevărată pentru toate valorile de dimensiune $< n$ (ipoteza inductivă) și demonstrăm pentru valori de dimensiune $n$ (obținute prin constructori interni). |
| | | ||
| ==== Exemplu pe tipul Nat ==== | ==== Exemplu pe tipul Nat ==== | ||
| Line 82: | Line 82: | ||
| Chiar dacă problemele nu sunt formulate ca operatori ai unui TDA, procesul de "gândire funcțională" este următorul: | Chiar dacă problemele nu sunt formulate ca operatori ai unui TDA, procesul de "gândire funcțională" este următorul: | ||
| - | - **Pe ce variabile este util să fac recursivitate?** (Identificăm variabilele care se "micșorează" structural). | + | * **Pe ce variabile este util să fac recursivitate?** \\ Identificăm variabilele care se "micșorează" structural. |
| - | - **Cum mă ajută rezultatul subproblemei?** (ex: Dacă știu rezultatul pentru ''tail(L)'', cum obțin rezultatul pentru ''L''?). | + | * **Cum mă ajută rezultatul subproblemei?** \\ Ex: Dacă știu rezultatul pentru ''tail(L)'', cum obțin rezultatul pentru ''L''? |
| ==== Exemple de gândire ==== | ==== Exemple de gândire ==== | ||
| - | **nth (al n-lea element din listă)** | + | <code haskell> |
| - | * **Întrebare**: Pe ce variabile fac recursivitate? | + | nth (al n-lea element din listă) |
| - | * **Raționament**: A identifica al ''n''-lea element din ''L'' înseamnă a identifica al ''(n-1)''-lea element din ''tail(L)''. | + | </code> |
| - | * **Concluzie**: Pe numărul $n$ și pe lista $L$. | + | |
| - | * **Axiome (Cod):** | + | |
| - | * ''nth(null, n) = eroare'' (Lista nu are suficiente elemente). | + | |
| - | * ''nth(cons(x, L), zero) = x'' (Dacă am ajuns la indexul zero, rezultatul este primul element din listă). | + | |
| - | * ''nth(cons(x, L), succ(n)) = nth(L, n)'' (Al n+1-lea element din lista curentă este al n-lea element din restul listei). | + | |
| - | **duplicate (duplicarea fiecărui element al listei)** | + | **Întrebare**: Pe ce variabile fac recursivitate? \\ |
| - | * **Observație**: Există un singur parametru (''L''), deci o singură variabilă pe care pot face recursivitate. | + | **Raționament**: A identifica al ''n''-lea element din ''L'' înseamnă a identifica al ''(n-1)''-lea element din ''tail(L)''. \\ |
| - | * **Întrebare**: Cum transform rezultatul pentru ''tail(L)''? | + | **Concluzie**: Pe numărul ''n'' și pe lista ''L''. |
| - | * **Raționament**: Dacă am duplicat toate elementele din ''tail(L)'', trebuie doar să adaug de două ori ''head(L)'' la început. | + | |
| - | * **Axiome (Cod):** | + | |
| - | * ''duplicate(null) = null'' (Cazul de bază). | + | |
| - | * ''duplicate(cons(x, L)) = cons(x, cons(x, duplicate(L)))'' (Implementarea raționamentului anterior). | + | |
| + | <code haskell> | ||
| + | -- Axiome (cod) | ||
| + | nth(null, n) = eroare | ||
| + | nth(cons(x, L), zero) = x | ||
| + | nth(cons(x, L), succ(n)) = nth(L, n) | ||
| + | </code> | ||
| + | |||
| + | |||
| + | <code haskell> | ||
| + | duplicate (duplicarea fiecărui element al listei) | ||
| + | </code> | ||
| + | |||
| + | **Notă**: Există un singur parametru (''L''), deci o singură variabilă pe care pot face recursivitate. \\ | ||
| + | **Întrebare**: Cum transform rezultatul pentru ''tail(L)''? \\ | ||
| + | **Raționament**: Dacă am duplicat toate elementele din ''tail(L)'', trebuie doar să adaug de două ori ''head(L)'' la început. | ||
| + | |||
| + | <code haskell> | ||
| + | -- Axiome (cod) | ||
| + | duplicate(null) = null | ||
| + | duplicate(cons(x, L)) = cons(x, cons(x, duplicate(L))) | ||
| + | </code> | ||
| ===== Exerciții ===== | ===== Exerciții ===== | ||
| * Demonstrați prin inducție structurală proprietatea ''len(app(A, B)) = add(len(A), len(B))''. | * Demonstrați prin inducție structurală proprietatea ''len(app(A, B)) = add(len(A), len(B))''. | ||
| Line 112: | Line 124: | ||
| * **Ștergerea** elementului de la poziția ''n'' din listă (ex: ștergerea celui de-al treilea element din $[a, b, c, d, e, f, g]$ produce $[a, b, d, e, f, g]$). | * **Ștergerea** elementului de la poziția ''n'' din listă (ex: ștergerea celui de-al treilea element din $[a, b, c, d, e, f, g]$ produce $[a, b, d, e, f, g]$). | ||
| * **Simetria structurală**: Verificați dacă doi arbori binari sunt simetrici (ex: un arbore cu structura ''node(empty, x, node(empty, y, empty))'' este simetric cu unul de forma ''node(node(empty, z, empty), w, empty)''). | * **Simetria structurală**: Verificați dacă doi arbori binari sunt simetrici (ex: un arbore cu structura ''node(empty, x, node(empty, y, empty))'' este simetric cu unul de forma ''node(node(empty, z, empty), w, empty)''). | ||
| - | * [[https://ocw.cs.pub.ro/courses/_media/pp/24/laboratoare/tda/tda-sol.zip|Soluții]] | + | |
| ===== Referințe ===== | ===== Referințe ===== | ||
| * [[https://www.ic.unicamp.br/~meidanis/courses/mc336/problemas-lisp/L-99_Ninety-Nine_Lisp_Problems.html|Probleme de programare funcțională]] | * [[https://www.ic.unicamp.br/~meidanis/courses/mc336/problemas-lisp/L-99_Ninety-Nine_Lisp_Problems.html|Probleme de programare funcțională]] | ||