====== 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}\).**