Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
aa:lab:sol:4 [2025/10/27 20:10] dmihai ) |
aa:lab:sol:4 [2025/10/27 23:23] (current) rares_stefan.balcan |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Soluții inducție structurală ====== | + | ====== Soluții Laboratorul 4 ====== |
| - | 1. | + | ===== Enunțuri ===== |
| - | ** Cazul de bază ** | + | Demonstrați următoarele proprietăți folosind inducție structurală: |
| - | <code> | + | - **1.** ∀l∈List.reverse(reverse(l))=l |
| - | reverse(reverse(Void)) =(REV1) reverse(Void) =(REV1) Void | + | - **2.** ∀r∈Ring,size(move(r))=size(r) |
| - | </code> | + | - **3.** ∀i∈N,∀r∈Ring,element(i,move(r))=element(i+1,r) |
| - | **Pas de inducție** | + | ===== Soluții ===== |
| - | Presupunem: | + | ==== 1. ∀l∈List.reverse(reverse(l))=l ==== |
| - | <code> | + | **Cazul de bază:** |
| - | reverse(reverse(l)) = l | + | |
| - | </code> | + | |
| - | Arătăm: | + | \[ |
| + | \mathsf{reverse}(\mathsf{reverse}(\mathsf{Void})) | ||
| + | \overset{(\text{REV1})}{=} | ||
| + | \mathsf{reverse}(\mathsf{Void}) | ||
| + | \overset{(\text{REV1})}{=} | ||
| + | \mathsf{Void} | ||
| + | \] | ||
| - | <code> | + | **Pas de inducție:** |
| - | reverse(reverse(Cons(x, l)) =( Cons(x, l) | + | |
| - | </code> | + | |
| - | <code> | + | Presupunem: |
| - | reverse(reverse(Cons(x, l)) =(REV2) reverse(append(reverse(l), Cons(x, Void)) =(L1) append(reverse(Cons(x, Void)), reverse(reverse(l))) =(II) append(reverse(Cons(x, Void)), l) =(REV2) append(Cons(x, reverse(Void)), l) =(REV1) append(Cons(x, Void), l) =(APP2) Cons(x, append(Void, l)) =(APP1) Cons(x, l) | + | \[ |
| - | </code> | + | \mathsf{reverse}(\mathsf{reverse}(l)) = l |
| + | \] | ||
| - | Unde ''L1'' este lemma: $ \forall l1, l2 \in List, reverse(append(l1, l2)) = append(reverse(l2), reverse(l1))$, care necesită o demonstrație separată, tot prin inducție structurală după ''l1''. | + | Arătăm: |
| + | \[ | ||
| + | \mathsf{reverse}(\mathsf{reverse}(\mathsf{Cons}(x, l))) = \mathsf{Cons}(x, l) | ||
| + | \] | ||
| - | **Caz de bază**: | + | \[ |
| + | \begin{aligned} | ||
| + | \mathsf{reverse}(\mathsf{reverse}(\mathsf{Cons}(x, l))) | ||
| + | &\overset{(\text{REV2})}{=} | ||
| + | \mathsf{reverse}(\mathsf{append}(\mathsf{reverse}(l), \mathsf{Cons}(x, \mathsf{Void}))) \\ | ||
| + | &\overset{(\text{L1})}{=} | ||
| + | \mathsf{append}(\mathsf{reverse}(\mathsf{Cons}(x, \mathsf{Void})), \mathsf{reverse}(\mathsf{reverse}(l))) \\ | ||
| + | &\overset{(\text{II})}{=} | ||
| + | \mathsf{append}(\mathsf{reverse}(\mathsf{Cons}(x, \mathsf{Void})), l) \\ | ||
| + | &\overset{(\text{REV2})}{=} | ||
| + | \mathsf{append}(\mathsf{Cons}(x, \mathsf{reverse}(\mathsf{Void})), l) \\ | ||
| + | &\overset{(\text{REV1})}{=} | ||
| + | \mathsf{append}(\mathsf{Cons}(x, \mathsf{Void}), l) \\ | ||
| + | &\overset{(\text{APP2})}{=} | ||
| + | \mathsf{Cons}(x, \mathsf{append}(\mathsf{Void}, l)) \\ | ||
| + | &\overset{(\text{APP1})}{=} | ||
| + | \mathsf{Cons}(x, l) | ||
| + | \end{aligned} | ||
| + | \] | ||
| - | <code> | + | Unde **L1** este lema: |
| - | reverse(append(Void, l2)) =(APP1) = reverse(l2) =(L3) reverse(append(l2, Void)) | + | \[ |
| - | </code> | + | \forall l_1, l_2 \in \mathsf{List},\ |
| + | \mathsf{reverse}(\mathsf{append}(l_1, l_2)) = \mathsf{append}(\mathsf{reverse}(l_2), \mathsf{reverse}(l_1)) | ||
| + | \] | ||
| - | (''L3'' este propoziția $ \forall l \in List, append(l, Void) = l$, cu o demonstrație ușoară, omisă aici; vă recomandăm să explicitați voi demonstrația, prin inducție structurală după $ l$). | + | care necesită o demonstrație separată, tot prin inducție structurală după \(l_1\). |
| - | **Pas de inducție**: | + | === Demonstrația lemei L1 === |
| - | Presupunem: | + | **Caz de bază:** |
| - | <code> | + | \[ |
| - | reverse(append(l, l2)) = append(reverse(l2), reverse(l)) | + | \mathsf{reverse}(\mathsf{append}(\mathsf{Void}, l_2)) |
| - | </code> | + | \overset{(\text{APP1})}{=} |
| + | \mathsf{reverse}(l_2) | ||
| + | \overset{(\text{L3})}{=} | ||
| + | \mathsf{reverse}(\mathsf{append}(l_2, \mathsf{Void})) | ||
| + | \] | ||
| - | Arătăm: | + | unde **L3** este propoziția: |
| + | \[ | ||
| + | \forall l \in \mathsf{List},\ \mathsf{append}(l, \mathsf{Void}) = l | ||
| + | \] | ||
| - | <code> | + | cu o demonstrație ușoară (omisă aici), ce se poate face prin inducție structurală după \(l\). |
| - | reverse(append(Cons(x, l), l2)) = append(reverse(l2), reverse(Cons(x, l))) | + | |
| - | </code> | + | |
| - | <code> | + | **Pas de inducție:** |
| - | reverse(append(Cons(x, l), l2)) =(APP2) reverse(Cons(x, append(l, l2)) =(REV2) append(reverse(append(l, l2)), Cons(x, Void))) =(II) append(append(reverse(l2), reverse(l)), Cons(x, Void)) =(Asocativitate append) append(reverse(l2), append(reverse(l), Cons(x, Void)) =(REV2) append(reverse(l2), reverse(Cons(x, l))) | + | |
| - | </code> | + | |
| - | <note> | + | Presupunem: |
| - | Asociativitatea operației ''append'' (i.e. $ \forall l1, l2, l3, append(append(l1, l2), l3) = append(l1, append(l2, l3))$) este tot o teoremă care trebuie demonstrată prin inducție structurală; deși laborioasă, este în esență simplă. Vă recomandăm să o redactați explicit. | + | \[ |
| - | </note> | + | \mathsf{reverse}(\mathsf{append}(l, l_2)) |
| + | = | ||
| + | \mathsf{append}(\mathsf{reverse}(l_2), \mathsf{reverse}(l)) | ||
| + | \] | ||
| + | Arătăm: | ||
| + | \[ | ||
| + | \mathsf{reverse}(\mathsf{append}(\mathsf{Cons}(x, l), l_2)) | ||
| + | = | ||
| + | \mathsf{append}(\mathsf{reverse}(l_2), \mathsf{reverse}(\mathsf{Cons}(x, l))) | ||
| + | \] | ||
| + | \[ | ||
| + | \begin{aligned} | ||
| + | \mathsf{reverse}(\mathsf{append}(\mathsf{Cons}(x, l), l_2)) | ||
| + | &\overset{(\text{APP2})}{=} | ||
| + | \mathsf{reverse}(\mathsf{Cons}(x, \mathsf{append}(l, l_2))) \\ | ||
| + | &\overset{(\text{REV2})}{=} | ||
| + | \mathsf{append}(\mathsf{reverse}(\mathsf{append}(l, l_2)), \mathsf{Cons}(x, \mathsf{Void})) \\ | ||
| + | &\overset{(\text{II})}{=} | ||
| + | \mathsf{append}(\mathsf{append}(\mathsf{reverse}(l_2), \mathsf{reverse}(l)), \mathsf{Cons}(x, \mathsf{Void})) \\ | ||
| + | &\overset{(\text{Asoc.})}{=} | ||
| + | \mathsf{append}(\mathsf{reverse}(l_2), \mathsf{append}(\mathsf{reverse}(l), \mathsf{Cons}(x, \mathsf{Void}))) \\ | ||
| + | &\overset{(\text{REV2})}{=} | ||
| + | \mathsf{append}(\mathsf{reverse}(l_2), \mathsf{reverse}(\mathsf{Cons}(x, l))) | ||
| + | \end{aligned} | ||
| + | \] | ||
| + | |||
| + | <note important> | ||
| + | **Asociativitatea** operației \(\mathsf{append}\) (i.e. \(\forall l_1, l_2, l_3,\ \mathsf{append}(\mathsf{append}(l_1, l_2), l_3) = \mathsf{append}(l_1, \mathsf{append}(l_2, l_3))\)) este tot o teoremă care trebuie demonstrată prin inducție structurală. Deși laborioasă, ea este esențial simplă. Vă recomandăm să o redactați explicit. | ||
| + | </note> | ||
| <note> | <note> | ||
| - | **Notă*: Într-un sens computațional, axiomele noastre reprezintă *reguli de derivare* care ne spun că putem înlocui expresia din stânga cu cea din dreapta. Astfel, un simbol simetric ca ''='' nu pare foarte potrivit, iar expresii de forma ''1 + size(l) =(SZ2) size(Cons(e, l))'' sunt abuzuri de notație, deoarece folosim derivarea "în sens invers". | + | **Notă:** Într-un sens computațional, axiomele noastre reprezintă //reguli de derivare// care ne spun că putem înlocui expresia din stânga cu cea din dreapta. Astfel, un simbol simetric ca „=" nu este perfect potrivit, iar expresii precum \(1 + \mathsf{size}(l) \overset{(\text{SZ2})}{=} \mathsf{size}(\mathsf{Cons}(e, l))\) sunt abuzuri de notație, deoarece folosim derivarea „în sens invers". |
| - | Totuși, chiar și cu această interpretare, în afară de abuzul notațional, demonstrațiile noastre sunt corecte și riguroase: putem să le rescriem pentru a arăta separat că, din egalitatea ce trebuie demonstrată, și partea stângă și partea dreapta, pot fi derivate separat în aceași expresie. | + | Totuși, chiar și cu acest abuz, demonstrațiile rămân corecte și riguroase: putem rescrie separat pentru a arăta că ambele părți ale egalității se pot deriva în aceeași expresie. |
| </note> | </note> | ||
| + | ==== 2. ∀r∈Ring,size(move(r))=size(r) ==== | ||
| - | 2. | + | **Cazuri de bază:** |
| - | **Cazuri de bază**: | + | \[ |
| + | \mathsf{size}(\mathsf{move}(\mathsf{Empty})) | ||
| + | \overset{(\text{MOV1})}{=} | ||
| + | \mathsf{size}(\mathsf{Empty}) | ||
| + | \] | ||
| - | <code> | + | \[ |
| - | size(move(Empty)) =(MOV1) size(Empty) | + | \forall x,\ |
| + | \mathsf{size}(\mathsf{move}(\mathsf{Push}(x, \mathsf{Empty}))) | ||
| + | = | ||
| + | \mathsf{size}(\mathsf{Push}(x, \mathsf{Empty})) | ||
| + | \] | ||
| - | ∀x, size(move(Push(x, Empty)) = size(Push(x, Empty)) | + | Rezultă direct din axioma \(\text{MOV2}\). |
| - | Rezultă direct din axioma MOV2. | + | <note> |
| - | </code> | + | Considerând și \(\mathsf{Push}(x, \mathsf{Empty})\) un caz de bază, putem ca în demonstrația următoare să folosim doar forma generală \(\mathsf{Push}(e, r)\) ca ipoteză de inducție. |
| + | </note> | ||
| - | <notes> | + | **Pas de inducție:** |
| - | Considerând și ''Push(x, Empty)'' un caz de bază ne permite ca în demonstrația următoare să folosim doar ''Push(e, r)'' ca inel. | + | |
| - | </code> | + | |
| - | + | ||
| - | **Pas de inducție**: | + | |
| Presupunem: | Presupunem: | ||
| + | \[ | ||
| + | \forall e,\ | ||
| + | \mathsf{size}(\mathsf{move}(\mathsf{Push}(e, r))) | ||
| + | = | ||
| + | \mathsf{size}(\mathsf{Push}(e, r)) | ||
| + | \] | ||
| - | <code> | ||
| - | ∀e, size(move(Push(e, r))) = size(Push(e, r)) | ||
| - | </code> | ||
| Arătăm: | Arătăm: | ||
| + | \[ | ||
| + | \forall x,\forall e,\ | ||
| + | \mathsf{size}(\mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(e, r)))) | ||
| + | = | ||
| + | \mathsf{size}(\mathsf{Push}(x, \mathsf{Push}(e, r))) | ||
| + | \] | ||
| - | <code> | + | \[ |
| - | ∀x, ∀e, size(move(Push(x, Push(e, r))))) = size(Push(x, Push(e, r))) | + | \begin{aligned} |
| - | </code> | + | \mathsf{size}(\mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(e, r)))) |
| + | &\overset{(\text{MOV3})}{=} | ||
| + | \mathsf{size}(\mathsf{Push}(e, \mathsf{move}(\mathsf{Push}(x, r)))) \\ | ||
| + | &\overset{(\text{SZ2})}{=} | ||
| + | 1 + \mathsf{size}(\mathsf{move}(\mathsf{Push}(x, r))) \\ | ||
| + | &\overset{(\text{II})}{=} | ||
| + | 1 + \mathsf{size}(\mathsf{Push}(x, r)) \\ | ||
| + | &\overset{(\text{SZ2})}{=} | ||
| + | 2 + \mathsf{size}(r) \\ | ||
| + | &\overset{(\text{SZ2})}{=} | ||
| + | 1 + \mathsf{size}(\mathsf{Push}(e, r)) \\ | ||
| + | &\overset{(\text{SZ2})}{=} | ||
| + | \mathsf{size}(\mathsf{Push}(x, \mathsf{Push}(e, r))) | ||
| + | \end{aligned} | ||
| + | \] | ||
| + | ==== 3. ∀i∈N,∀r∈Ring,element(i,move(r))=element(i+1,r) ==== | ||
| - | <code> | + | \[ |
| - | size(move(Push(x, Push(e, r)))) =(MOV3) size(Push(e, move(Push(x, r)))) =(SZ2) 1 + size(move(Push(x, r))) =(II) 1 + size(Push(x, r)) =(SZ2) 2 + size(r) =(SZ2) 1 + size(Push(e, r)) = size(Push(x, Push(e, r)) | + | \forall r,\forall i.\ |
| - | </code> | + | \mathsf{size}(r) \ge 2 |
| + | \Rightarrow | ||
| + | \mathsf{element}(i, \mathsf{move}(r)) | ||
| + | = | ||
| + | \mathsf{element}(i+1, r) | ||
| + | \] | ||
| - | 3. | + | Vom face o demonstrație prin **inducție matematică** după \(i\). |
| - | ∀r.∀i. size(r) >= 2 => element(i,move(r)) = element(i+1,r) | + | === Cazul de bază (i = 0) === |
| - | Vom face o demonstrație prin inducție matematică după ''i'': | + | Luăm \(i = 0\) și vrem să arătăm: |
| + | \[ | ||
| + | \mathsf{element}(0, \mathsf{move}(r)) = \mathsf{element}(1, r) | ||
| + | \] | ||
| - | Pentru **cazul de bază**, luăm ''i = 0'' și vrem să arătăm că: | + | Aceasta trebuie să fie adevărată pentru orice inel \(r\) cu \(\mathsf{size}(r) \ge 2\). |
| + | Pentru a o demonstra, facem **inducție structurală** după \(r\). | ||
| - | <code> | + | **Caz de bază:** |
| - | element(0, move(r)) = element(1, r) | + | |
| - | </code> | + | |
| - | Acesta trebuie să fie adevărat pentru orice inel ''r'' cu ''size(r) >= 2''; pentru a demonstra propoziția, vom face inducție structurală după ''r'': | + | \[ |
| + | \begin{aligned} | ||
| + | \mathsf{element}(0, \mathsf{move}(\mathsf{Push}(e, \mathsf{Push}(f, \mathsf{Empty})))) | ||
| + | &\overset{(\text{MOV3})}{=} | ||
| + | \mathsf{element}(0, \mathsf{Push}(f, \mathsf{move}(\mathsf{Push}(e, \mathsf{Empty})))) \\ | ||
| + | &\overset{(\text{MOV2})}{=} | ||
| + | \mathsf{element}(0, \mathsf{Push}(f, \mathsf{Push}(e, \mathsf{Empty}))) \\ | ||
| + | &\overset{(\text{ELEM})}{=} | ||
| + | \mathsf{elm}(0 \bmod 2, \mathsf{Push}(f, \mathsf{Push}(e, \mathsf{Empty}))) \\ | ||
| + | &\overset{(\text{ELM1})}{=} f | ||
| + | \end{aligned} | ||
| + | \] | ||
| - | **Caz de bază**: | + | \[ |
| + | \begin{aligned} | ||
| + | \mathsf{element}(1, \mathsf{Push}(e, \mathsf{Push}(f, \mathsf{Empty}))) | ||
| + | &\overset{(\text{ELEM})}{=} | ||
| + | \mathsf{elm}(1 \bmod 2, \mathsf{Push}(e, \mathsf{Push}(f, \mathsf{Empty}))) \\ | ||
| + | &\overset{(\text{ELM2})}{=} | ||
| + | \mathsf{elm}(0, \mathsf{Push}(f, \mathsf{Empty})) \\ | ||
| + | &\overset{(\text{ELM1})}{=} f | ||
| + | \end{aligned} | ||
| + | \] | ||
| - | <code> | + | **Pas de inducție:** |
| - | element(0, move(Push(e, Push(f, Empty)))) =(MOV2) element(0, Push(f, move(Push(e, Empty))) =(MOV1) = element(0, Push(f, Push(e, Empty))) =(ELEM) elm(0 `mod` 2, Push(f, Push(e, Empty))) = elm(0, Push(f, Push(e, Empty))) =(ELM1) f | + | |
| - | element(1, Push(e, Push(f, Empty))) =(ELEM) elm(1 `mod` 2, Push(e, Push(f, Empty))) = elm(1, Push(e, Push(f, Empty))) =(ELM2) elm(0, Push(f, Empty)) =(ELM1) f | + | Presupunem: |
| - | </code> | + | \[ |
| + | \mathsf{element}(0, \mathsf{move}(\mathsf{Push}(e, \mathsf{Push}(f, r)))) | ||
| + | = | ||
| + | \mathsf{element}(1, \mathsf{Push}(e, \mathsf{Push}(f, r))) | ||
| + | \] | ||
| - | **Pas de inducție**: | + | Arătăm: |
| + | \[ | ||
| + | \mathsf{element}(0, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(e, \mathsf{Push}(f, r))))) | ||
| + | = | ||
| + | \mathsf{element}(1, \mathsf{Push}(x, \mathsf{Push}(e, \mathsf{Push}(f, r)))) | ||
| + | \] | ||
| - | Presupunem: | + | \[ |
| + | \begin{aligned} | ||
| + | \mathsf{element}(0, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(e, \mathsf{Push}(f, r))))) | ||
| + | &\overset{(\text{MOV3})}{=} | ||
| + | \mathsf{element}(0, \mathsf{Push}(e, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r))))) \\ | ||
| + | &\overset{(\text{ELEM})}{=} | ||
| + | \mathsf{elm}(0, \mathsf{Push}(e, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r))))) \\ | ||
| + | &\overset{(\text{ELM1})}{=} e | ||
| + | \end{aligned} | ||
| + | \] | ||
| - | <code> | + | \[ |
| - | element(0, move(Push(e, Push(f, r)))) = element(1, Push(e, Push(f, Empty))) | + | \begin{aligned} |
| - | </code> | + | \mathsf{element}(1, \mathsf{Push}(x, \mathsf{Push}(e, \mathsf{Push}(f, r)))) |
| + | &\overset{(\text{ELEM})}{=} | ||
| + | \mathsf{elm}(1, \mathsf{Push}(x, \mathsf{Push}(e, \mathsf{Push}(f, r)))) \\ | ||
| + | &\overset{(\text{ELM2})}{=} | ||
| + | \mathsf{elm}(0, \mathsf{Push}(e, \mathsf{Push}(f, r))) \\ | ||
| + | &\overset{(\text{ELM1})}{=} e | ||
| + | \end{aligned} | ||
| + | \] | ||
| - | Arătăm: | + | Astfel se încheie demonstrația prin inducție structurală — deci cazul de bază al demonstrației principale (\(i = 0\)) este rezolvat. |
| - | <code> | + | === Pas de inducție (pe i) === |
| - | element(0, move(Push(x, Push(e, Push(f, r))))) = element(1, Push(x, Push(e, Push(f, Empty)))) | + | |
| - | </code> | + | |
| + | Presupunem: | ||
| + | \[ | ||
| + | \mathsf{element}(i, \mathsf{move}(r)) = \mathsf{element}(i + 1, r) | ||
| + | \] | ||
| - | <code> | + | Arătăm: |
| - | element(0, move(Push(x, Push(e, Push(f, r))))) =(MOV3) element(0, Push(e, move(Push(x, Push(f, r))))) =(ELEM + propr. de bază ale `mod`) elm(0, Push(e, move(Push(x, Push(f, r))))) =(ELM1) top(Push(e, move(Push(x, Push(f, r)))) =(TOP) e | + | \[ |
| + | \mathsf{element}(i + 1, \mathsf{move}(r)) = \mathsf{element}(i + 2, r) | ||
| + | \] | ||
| - | element(1, Push(x, Push(e, Push(f, Empty)))) =(ELEM + popr. `mod`) elm(1, Push(x, Push(e, Push(f, Empty))))) =(ELM2) elm(0, Push(e, Push(f, Empty)))) =(ELM1) e | + | Vom face din nou o **inducție structurală** după \(r\). |
| - | </code> | + | |
| - | Asta completează demonstrația prin inducție structurală, deci cazul de bază al demonstrației principale (''i = 0''). | + | **Caz de bază:** |
| - | **Pas de inducție**: | + | \[ |
| + | \begin{aligned} | ||
| + | \mathsf{element}(i + 1, \mathsf{move}(\mathsf{Push}(e, \mathsf{Push}(f, \mathsf{Empty})))) | ||
| + | &\overset{(\text{MOV3})}{=} | ||
| + | \mathsf{element}(i + 1, \mathsf{Push}(f, \mathsf{move}(\mathsf{Push}(e, \mathsf{Empty})))) \\ | ||
| + | &\overset{(\text{MOV2})}{=} | ||
| + | \mathsf{element}(i + 1, \mathsf{Push}(f, \mathsf{Push}(e, \mathsf{Empty}))) \\ | ||
| + | &\overset{(\text{ELEM})}{=} | ||
| + | \mathsf{elm}((i + 1) \bmod 2, \mathsf{Push}(f, \mathsf{Push}(e, \mathsf{Empty}))) | ||
| + | \end{aligned} | ||
| + | \] | ||
| - | Presupunem: | + | * Dacă \(i\) este impar, atunci \((i + 1) \bmod 2 = 0\): \[\mathsf{elm}(0, \mathsf{Push}(f, \mathsf{Push}(e, \mathsf{Empty}))) \overset{(\text{ELM1})}{=} f\] |
| + | iar în partea dreaptă: \[\begin{aligned} \mathsf{element}(i + 2, \mathsf{Push}(e, \mathsf{Push}(f, \mathsf{Empty}))) &\overset{(\text{ELEM})}{=} \mathsf{elm}((i + 2) \bmod 2, \mathsf{Push}(e, \mathsf{Push}(f, \mathsf{Empty}))) \\ &\text{(deoarece } i \text{ impar } \Rightarrow i+2 \text{ impar } \Rightarrow (i+2) \bmod 2 = 1) \\ &\overset{(\text{ELM2})}{=} \mathsf{elm}(0, \mathsf{Push}(f, \mathsf{Empty})) \\ &\overset{(\text{ELM1})}{=} f \end{aligned}\] | ||
| - | <code> | + | * Dacă \(i\) este par, atunci \((i + 1) \bmod 2 = 1\): \[\mathsf{elm}(1, \mathsf{Push}(f, \mathsf{Push}(e, \mathsf{Empty}))) \overset{(\text{ELM2})}{=} \mathsf{elm}(0, \mathsf{Push}(e, \mathsf{Empty})) \overset{(\text{ELM1})}{=} e\] |
| - | element(i, move(r)) = element(i + 1, r) | + | iar în partea dreaptă: \[\begin{aligned} \mathsf{element}(i + 2, \mathsf{Push}(e, \mathsf{Push}(f, \mathsf{Empty}))) &\overset{(\text{ELEM})}{=} \mathsf{elm}((i + 2) \bmod 2, \mathsf{Push}(e, \mathsf{Push}(f, \mathsf{Empty}))) \\ &\text{(deoarece } i \text{ par } \Rightarrow i+2 \text{ par } \Rightarrow (i+2) \bmod 2 = 0) \\ &\overset{(\text{ELM1})}{=} e \end{aligned}\] |
| - | echivalent cu: | + | **Pas de inducție:** |
| - | elm(i `mod` size(move(r)), move(r)) = elm((i + 1) `mod` size(r), r) | + | Presupunem: |
| - | </code> | + | \[ |
| + | \mathsf{element}(i + 1, \mathsf{move}(\mathsf{Push}(e, \mathsf{Push}(f, r)))) | ||
| + | = | ||
| + | \mathsf{element}(i + 2, \mathsf{Push}(e, \mathsf{Push}(f, r))) | ||
| + | \] | ||
| Arătăm: | Arătăm: | ||
| + | \[ | ||
| + | \mathsf{element}(i + 1, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(e, \mathsf{Push}(f, r))))) | ||
| + | = | ||
| + | \mathsf{element}(i + 2, \mathsf{Push}(x, \mathsf{Push}(e, \mathsf{Push}(f, r)))) | ||
| + | \] | ||
| - | <code> | + | Din ipoteza de inducție \(\mathsf{element}(i, \mathsf{move}(r)) = \mathsf{element}(i + 1, r)\), aplicată pentru \(\mathsf{Push}(x, \mathsf{Push}(f, r))\), obținem: |
| - | element(i + 1, move(r)) = element(i + 2, r) | + | \[ |
| + | \mathsf{element}(i, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r)))) | ||
| + | = | ||
| + | \mathsf{element}(i + 1, \mathsf{Push}(x, \mathsf{Push}(f, r))) | ||
| + | \] | ||
| - | echivalent cu: | + | Calculul complet pentru partea stângă: |
| + | \[ | ||
| + | \begin{aligned} | ||
| + | \mathsf{element}(i + 1, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(e, \mathsf{Push}(f, r))))) | ||
| + | &\overset{(\text{MOV3})}{=} | ||
| + | \mathsf{element}(i + 1, \mathsf{Push}(e, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r))))) \\ | ||
| + | &\overset{(\text{ELEM})}{=} | ||
| + | \mathsf{elm}((i + 1) \bmod \mathsf{size}(\mathsf{Push}(e, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r))))), \\ | ||
| + | &\quad\quad\mathsf{Push}(e, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r))))) | ||
| + | \end{aligned} | ||
| + | \] | ||
| - | elm((i + 1) `mod` size(move(r)), move(r)) = elm((i + 2) `mod` size(r), r) | + | Pentru \((i + 1) \bmod \mathsf{size}(\mathsf{Push}(e, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r)))))\), știind că \(\mathsf{size}(\mathsf{move}(r)) = \mathsf{size}(r)\) (din exercițiul 2), avem: |
| - | </code> | + | \[ |
| + | \mathsf{size}(\mathsf{Push}(e, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r))))) = 1 + \mathsf{size}(\mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r)))) = 3 + \mathsf{size}(r) | ||
| + | \] | ||
| - | Din nou, vom face o demonstrație prin inducție structurală după ''r''. | + | Notăm \(n = 3 + \mathsf{size}(r)\). |
| - | **Caz de bază**: | + | Dacă \((i + 1) \bmod n = 0\), atunci: |
| + | \[ | ||
| + | \mathsf{element}(i + 1, \mathsf{move}(...)) = \mathsf{elm}(0, \mathsf{Push}(e, ...)) = e | ||
| + | \] | ||
| - | <code> | + | \[ |
| - | element(i + 1, move(Push(e, Push(f, Empty)))) =(ELEM) elm((i + 1) `mod` size(move(Push(e, Push(f, Empty)))), move(Push(e, Push(f, Empty)))) =(2 aplicări de SIZE2, una de SIZE1 și aritmetică) elm((i + 1) `mod` 2, move(Push(e, Push(f, Empty)))) =(MOV3) elm((i + 1) `mod` 2, Push(f, move(Push(e, Empty)))) | + | \begin{aligned} |
| + | \mathsf{element}(i + 2, \mathsf{Push}(x, \mathsf{Push}(e, \mathsf{Push}(f, r)))) | ||
| + | &\overset{(\text{ELEM})}{=} | ||
| + | \mathsf{elm}((i + 2) \bmod n, \mathsf{Push}(x, ...)) \\ | ||
| + | &\overset{(\text{ELM2})}{=} | ||
| + | \mathsf{elm}((i + 1) \bmod (n-1), \mathsf{Push}(e, \mathsf{Push}(f, r))) \\ | ||
| + | &= \mathsf{elm}(0, \mathsf{Push}(e, ...)) = e | ||
| + | \end{aligned} | ||
| + | \] | ||
| - | Dacă i e impar: | + | Dacă \((i+1) \bmod n \neq 0\), folosim axioma ELM2 și reducem problema: |
| - | elm(0, Push(f, move(Push(e, Empty)))) =(ELM1) f | + | \[ |
| + | \begin{aligned} | ||
| + | \mathsf{element}(i + 1, \mathsf{move}(...)) | ||
| + | &= \mathsf{elm}((i+1) \bmod n, \mathsf{Push}(e, \mathsf{move}(...))) \\ | ||
| + | &\overset{(\text{ELM2})}{=} | ||
| + | \mathsf{elm}(i \bmod (n-1), \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r)))) \\ | ||
| + | &= \mathsf{element}(i, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r)))) | ||
| + | \end{aligned} | ||
| + | \] | ||
| - | iar în partea dreaptă avem: | + | Prin ipoteza de inducție pe \(i\): |
| - | element(i + 2, Push(e, Push(f, r))) =(ELEM) elm((i + 2) `mod` 2, Push(e, Push(f, r))) =(i impar, deci i+2 impar) elm(1, Push(e, Push(f, r))) =(ELM2) elm(0, Push(f, r)) =(ELM1) f | + | \[ |
| + | \mathsf{element}(i, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r))))) = \mathsf{element}(i+1, \mathsf{Push}(x, \mathsf{Push}(f, r))) | ||
| + | \] | ||
| - | ----------------- | + | Partea dreaptă: |
| + | \[ | ||
| + | \mathsf{element}(i + 2, \mathsf{Push}(x, \mathsf{Push}(e, \mathsf{Push}(f, r))))) | ||
| + | \overset{(\text{ELM2})}{=} | ||
| + | \mathsf{element}(i + 1, \mathsf{Push}(e, \mathsf{Push}(f, r))) | ||
| + | \] | ||
| - | Dacă i e par: elm(1, Push(f, move(Push(e, Empty)))) =(ELM2) elm(0, move(Push(e, Empty))) =(MOV2) elm(0, Push(e, Empty)) =(ELM1) e | + | Prin ipoteza de inducție structurală: |
| + | \[ | ||
| + | \mathsf{element}(i + 1, \mathsf{move}(\mathsf{Push}(e, \mathsf{Push}(f, r))))) = \mathsf{element}(i + 2, \mathsf{Push}(e, \mathsf{Push}(f, r))) | ||
| + | \] | ||
| - | iar în partea dreaptă avem: | + | obținem că ambele părți sunt egale. |
| - | element(i + 2, Push(e, Push(f, r))) =(ELEM) elm((i + 2) `mod` 2, Push(e, Push(f, r))) =(i par, deci i+2 par) elm(0, Push(e, Push(f, r))) =(ELM1) e | + | |
| - | </code> | + | |
| + | **Prin urmare, prin inducție matematică pe \(i\) și inducție structurală pe \(r\), avem că proprietatea este adevărată pentru toate valorile \(i \in \mathbb{N}\).** | ||