Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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))=
-reverse(reverse(Void)) =(REV1) reverse(Void) =(REV1Void +  - **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(l1l2)) = 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}(xl))) = \mathsf{Cons}(xl) 
 +\]
  
-**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(Voidl2)) =(APP1) = reverse(l2) =(L3) reverse(append(l2, Void)) +\[ 
-</​code>​+\forall l_1, l_2 \in \mathsf{List},​\  
 +\mathsf{reverse}(\mathsf{append}(l_1l_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(ll2)) = 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(l1l2), l3) = append(l1, append(l2l3))$) 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}(ll_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 derivarecare 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 ​, din egalitatea ce trebuie demonstrată, ș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ă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) + 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) >=> 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 \(= 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țiavom 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(0move(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}(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 + 1r)+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 + 1move(Push(e, Push(f, ​Empty)))) =(ELEM) elm((i + 1`mod` size(move(Push(e, Push(fEmpty)))), 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(eEmpty)))) =(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 parelm(1,  ​Push(f, ​move(Push(e, ​Empty)))) =(ELM2) elm(0move(Push(e, ​Empty))) =(MOV2) elm(0, ​Push(eEmpty)) =(ELM1e+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}(fr))) 
 +\]
  
-iar în partea dreaptă avem: +obținem că ambele părțsunt egale.
-element(i + 2, Push(e, Push(f, ​r))) =(ELEM) elm((+ 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}\).**