Note sulla lezione 1
E le chiamae ricorsive sono accettate anche su sotto-sotto-termini
Tipi di dato indiciati e i casi impossibili
Però lo facciamo in modo interattivo, usando dei comandi (tattiche) che costruiscono termini per noi.
I tipi (di dato) che abbiamo visto nella prima lezione non sono adatti a esprimere proprietà o enunciare veri e propri teoremi.
Ne definiamo quindi altri...
dimostrare una implicazione (introduzione)
Usare una implicazione (MP)
$$P \land Q$$
Ricordate l'esercizio 8bis?
$$P \lor Q$$
$$\bot$$
$$\neg$$
Note: questo lemma è uguale all'esempio 4
forall lega un termine
eq (Id) descrive una uguaglianza computazionale
da fuorie
da dentro
Nota: del tutto simile alla prova di P -> P fatta nella slide 2
Nota: anche in questo caso il comportamento di XXX\forallXXX è molto simile a quello di XXX\toXXX
Ora definiamo $$\exists x:A, P x$$ che può essere dimostrato fornendo un testimone t : A e una prova p : P t
Nota: è molto simile alla coppia, ma il tipo della seconda componente dipende val valore della prima
forall lega un predicato/funzione
apply: (fun x => match x with | conj (conj a b) c => conj (conj c a) b end).
apply: (fun f q => f (right q)).
move=> npnq. case: npnq => np nq. move=> poq. case: poq. apply: np. apply: nq.
move=> cc P. apply: (cc False). move=> truth. apply: right. move=> p. apply: truth. apply: left. apply: p.
case: b1; case: b2; apply: erefl.
case: b1; case: b2; case: b3; apply: erefl.
case: b; apply: erefl.
XXX m ^ 2 - n ^ 2 = (m - n) * (m + n) XXX
Usare solo la riscrittura rewrite e i seguenti simboli e lemmi che sono forniti
Traccia della prova
(m - n) * (m + n) = .. = m * (m + n) - n * (m + n) .. = m * m + m * n - n * (m + n) .. = m * m + m * n - (n * m + n * n) .. = m * n + m * m - (n * m + n * n) .. = n * m + m * m - (n * m + n * n) .. = m * m - n * n .. = m ^ 2 - n * n .. = m ^ 2 - n ^ 2
rewrite mulnBl. rewrite mulnDr. rewrite mulnDr. rewrite addnC. rewrite mulnC. rewrite subnDl. rewrite mulnn. rewrite mulnn. apply: erefl.