This is an old revision of the document!
Soluții inducție structurală
1.
Cazul de bază
reverse(reverse(Void)) =(REV1) reverse(Void) =(REV1) Void
Pas de inducție
Presupunem:
reverse(reverse(l)) = l
Arătăm:
reverse(reverse(Cons(x, l)) =( Cons(x, l)
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)
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.
Caz de bază:
reverse(append(Void, l2)) =(APP1) = reverse(l2) =(L3) reverse(append(l2, Void))
(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$).
Pas de inducție:
Presupunem:
reverse(append(l, l2)) = append(reverse(l2), reverse(l))
Arătăm:
reverse(append(Cons(x, l), l2)) = append(reverse(l2), reverse(Cons(x, l)))
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)))
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.
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”.
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.
</note>
2.
Cazuri de bază:
<code>
size(move(Empty)) =(MOV1) size(Empty)
∀x, size(move(Push(x, Empty)) = size(Push(x, Empty))
Rezultă direct din axioma MOV2.
</code>
<notes>
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:
∀e, size(move(Push(e, r))) = size(Push(e, r))
Arătăm:
∀x, ∀e, size(move(Push(x, Push(e, r))))) = size(Push(x, Push(e, r)))
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))