====== Soluții Laboratorul 4 ======
===== Enunțuri =====
Demonstrați următoarele proprietăți folosind inducție structurală:
  - **1.** ∀l∈List.reverse(reverse(l))=l
  - **2.** ∀r∈Ring,size(move(r))=size(r)  
  - **3.** ∀i∈N,∀r∈Ring,element(i,move(r))=element(i+1,r)
===== Soluții =====
==== 1. ∀l∈List.reverse(reverse(l))=l ====
**Cazul de bază:**
\[
\mathsf{reverse}(\mathsf{reverse}(\mathsf{Void})) 
\overset{(\text{REV1})}{=} 
\mathsf{reverse}(\mathsf{Void}) 
\overset{(\text{REV1})}{=} 
\mathsf{Void}
\]
**Pas de inducție:**
Presupunem:
\[
\mathsf{reverse}(\mathsf{reverse}(l)) = l
\]
Arătăm:
\[
\mathsf{reverse}(\mathsf{reverse}(\mathsf{Cons}(x, l))) = \mathsf{Cons}(x, l)
\]
\[
\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}
\]
Unde **L1** este lema:
\[
\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))
\]
care necesită o demonstrație separată, tot prin inducție structurală după \(l_1\).
=== Demonstrația lemei L1 ===
**Caz de bază:**
\[
\mathsf{reverse}(\mathsf{append}(\mathsf{Void}, l_2))
\overset{(\text{APP1})}{=}
\mathsf{reverse}(l_2)
\overset{(\text{L3})}{=}
\mathsf{reverse}(\mathsf{append}(l_2, \mathsf{Void}))
\]
unde **L3** este propoziția:
\[
\forall l \in \mathsf{List},\ \mathsf{append}(l, \mathsf{Void}) = l
\]
cu o demonstrație ușoară (omisă aici), ce se poate face prin inducție structurală după \(l\).
**Pas de inducție:**
Presupunem:
\[
\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}
\]
**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.
**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 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.
==== 2. ∀r∈Ring,size(move(r))=size(r) ====
**Cazuri de bază:**
\[
\mathsf{size}(\mathsf{move}(\mathsf{Empty}))
\overset{(\text{MOV1})}{=}
\mathsf{size}(\mathsf{Empty})
\]
\[
\forall x,\ 
\mathsf{size}(\mathsf{move}(\mathsf{Push}(x, \mathsf{Empty})))
=
\mathsf{size}(\mathsf{Push}(x, \mathsf{Empty}))
\]
Rezultă direct din axioma \(\text{MOV2}\).
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.
**Pas de inducție:**
Presupunem:
\[
\forall e,\ 
\mathsf{size}(\mathsf{move}(\mathsf{Push}(e, r))) 
= 
\mathsf{size}(\mathsf{Push}(e, r))
\]
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)))
\]
\[
\begin{aligned}
\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) ====
\[
\forall r,\forall i.\ 
\mathsf{size}(r) \ge 2 
\Rightarrow 
\mathsf{element}(i, \mathsf{move}(r)) 
= 
\mathsf{element}(i+1, r)
\]
Vom face o demonstrație prin **inducție matematică** după \(i\).
=== Cazul de bază (i = 0) ===
Luăm \(i = 0\) și vrem să arătăm:
\[
\mathsf{element}(0, \mathsf{move}(r)) = \mathsf{element}(1, r)
\]
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\).
**Caz de bază:**
\[
\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}
\]
\[
\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}
\]
**Pas de inducție:**
Presupunem:
\[
\mathsf{element}(0, \mathsf{move}(\mathsf{Push}(e, \mathsf{Push}(f, r)))) 
= 
\mathsf{element}(1, \mathsf{Push}(e, \mathsf{Push}(f, r)))
\]
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))))
\]
\[
\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}
\]
\[
\begin{aligned}
\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}
\]
Astfel se încheie demonstrația prin inducție structurală — deci cazul de bază al demonstrației principale (\(i = 0\)) este rezolvat.
=== Pas de inducție (pe i) ===
Presupunem:
\[
\mathsf{element}(i, \mathsf{move}(r)) = \mathsf{element}(i + 1, r)
\]
Arătăm:
\[
\mathsf{element}(i + 1, \mathsf{move}(r)) = \mathsf{element}(i + 2, r)
\]
Vom face din nou o **inducție structurală** după \(r\).
**Caz de bază:**
\[
\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}
\]
  * 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}\]
  * 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\]
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}\]
**Pas de inducție:**
Presupunem:
\[
\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:
\[
\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))))
\]
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:
\[
\mathsf{element}(i, \mathsf{move}(\mathsf{Push}(x, \mathsf{Push}(f, r)))) 
= 
\mathsf{element}(i + 1, \mathsf{Push}(x, \mathsf{Push}(f, r)))
\]
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}
\]
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:
\[
\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)
\]
Notăm \(n = 3 + \mathsf{size}(r)\).
Dacă \((i + 1) \bmod n = 0\), atunci:
\[
\mathsf{element}(i + 1, \mathsf{move}(...)) = \mathsf{elm}(0, \mathsf{Push}(e, ...)) = e
\]
\[
\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+1) \bmod n \neq 0\), folosim axioma ELM2 și reducem problema:
\[
\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}
\]
Prin ipoteza de inducție pe \(i\):
\[
\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)))
\]
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)))
\]
obținem că ambele părți sunt egale.
**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}\).**