(* T2: Demostraciones por inducción en Coq *)
Require Export Basics Induction.
(* ---------------------------------------------------------------------
Ejercicio 1.1. Demostrar que
forall n:nat, n * 0 = 0.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem mult_0_r : forall n:nat,
n * 0 = 0.
Proof.
intros n. induction n as [| n' IHn'].
- reflexivity.
- simpl. rewrite IHn'. reflexivity. Qed.
(* ---------------------------------------------------------------------
Ejercicio 1.2. Demostrar que
forall n m : nat, S (n + m) = n + (S m).
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem plus_n_Sm : forall n m : nat,
S (n + m) = n + (S m).
Proof.
intros n m. induction n as [|n' IHn'].
- simpl. reflexivity.
- simpl. rewrite IHn'. reflexivity. Qed.
(* ---------------------------------------------------------------------
Ejercicio 1.3. Demostrar que
forall n m : nat, n + m = m + n.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem plus_comm : forall n m : nat,
n + m = m + n.
Proof.
intros n m. induction n as [|n' IHn'].
- simpl. rewrite <- plus_n_O. reflexivity.
- simpl. rewrite IHn'. rewrite <- plus_n_Sm. reflexivity. Qed.
(* ---------------------------------------------------------------------
Ejercicio 1.4. Demostrar que
forall n m p : nat, n + (m + p) = (n + m) + p.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem plus_assoc : forall n m p : nat,
n + (m + p) = (n + m) + p.
Proof.
intros n m p. induction n as [|n' IHn'].
- reflexivity.
-simpl. rewrite IHn'. reflexivity. Qed.
(* ---------------------------------------------------------------------
Ejercicio 2. Se considera la siguiente función que dobla su argumento.
Fixpoint double (n:nat) :=
match n with
| O => O
| S n' => S (S (double n'))
end.
Demostrar que
forall n, double n = n + n.
------------------------------------------------------------------ *)
Fixpoint double (n:nat) :=
match n with
| O => O
| S n' => S (S (double n'))
end.
(* alerodrod5 *)
Lemma double_plus : forall n, double n = n + n .
Proof.
intros n. induction n as [|n' IHn'].
- reflexivity.
- simpl. rewrite IHn'. rewrite plus_n_Sm. reflexivity. Qed.
(* ---------------------------------------------------------------------
Ejercicio 3. Demostrar que
forall n : nat, evenb (S n) = negb (evenb n).
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem evenb_S : forall n : nat,
evenb (S n) = negb (evenb n).
Proof.
intros n. induction n as [|n' IHn'].
- simpl. reflexivity.
- rewrite IHn'. simpl. rewrite negb_involutive. reflexivity. Qed.
(* ---------------------------------------------------------------------
Ejercicio 7. Demostrar, usando assert pero no induct,
forall n m p : nat, n + (m + p) = m + (n + p).
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem plus_swap : forall n m p : nat,
n + (m + p) = m + (n + p).
Proof.
intros n m p. rewrite plus_assoc. rewrite plus_assoc.
assert (H : n + m = m+n). {rewrite plus_comm. reflexivity. }
rewrite H. reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 8. Demostrar que la multiplicación es conmutativa.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem one_id : forall n: nat,
n = n*1.
Proof.
intro n. induction n as [|n IHn'].
-reflexivity.
- simpl. rewrite <- IHn'. reflexivity.
Qed.
Theorem one_S : forall n : nat,
S n = n+1.
Proof.
intro n. induction n as [|n' HIn'].
- reflexivity.
- simpl. rewrite <-HIn'. reflexivity.
Qed.
Theorem mult_n_Sm : forall n m : nat,
n * (m+1) = n*m+n.
Proof.
intros n m. induction n as [|n' IHn'].
- rewrite <- plus_n_O. rewrite <- one_S. reflexivity.
- simpl. rewrite IHn'. rewrite plus_swap. rewrite <- plus_assoc.
rewrite one_S. rewrite <- one_S. rewrite plus_swap.
rewrite plus_assoc. reflexivity.
Qed.
Theorem mult_comm : forall m n : nat,
m * n = n * m.
Proof.
intros n m. induction n as [|n' HIn'].
- rewrite mult_0_r. reflexivity.
- simpl. rewrite HIn'. rewrite one_S. rewrite mult_n_Sm. rewrite plus_comm.
reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 9.1. Demostrar que
forall n:nat, true = leb n n.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem leb_refl : forall n:nat,
true = leb n n.
Proof. intro n. induction n as [| n' HIn'].
- reflexivity.
- rewrite HIn'. simpl. reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 9.2. Demostrar que
forall n:nat, beq_nat 0 (S n) = false.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem zero_nbeq_S : forall n:nat,
beq_nat 0 (S n) = false.
Proof.
intros n. simpl. reflexivity. Qed.
(* ---------------------------------------------------------------------
Ejercicio 9.3. Demostrar que
forall b : bool, andb b false = false.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem andb_false_r : forall b : bool,
andb b false = false.
Proof. intros b. destruct b.
- simpl. reflexivity.
- simpl. reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 9.4. Demostrar que
forall n m p : nat, leb n m = true -> leb (p + n) (p + m) = true.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem plus_ble_compat_l : forall n m p : nat,
leb n m = true -> leb (p + n) (p + m) = true.
Proof.
intros n m p H. rewrite <- H. induction p as [|p' HIn'].
- simpl. reflexivity.
- simpl. rewrite HIn'. reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 9.5. Demostrar que
forall n:nat, beq_nat (S n) 0 = false.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem S_nbeq_0 : forall n:nat,
beq_nat (S n) 0 = false.
Proof.
intro n. simpl. reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 9.6. Demostrar que
forall n:nat, 1 * n = n.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem mult_1_l : forall n:nat, 1 * n = n.
Proof.
intro n. simpl. rewrite plus_n_O. reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 9.7. Demostrar que
forall b c : bool, orb (andb b c)
(orb (negb b)
(negb c))
= true.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem all3_spec : forall b c : bool,
orb
(andb b c)
(orb (negb b)
(negb c))
= true.
Proof.
intros [] [].
- reflexivity.
- reflexivity.
- reflexivity.
- reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 9.8. Demostrar que
forall n m p : nat, (n + m) * p = (n * p) + (m * p).
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem mult_plus_distr_r : forall n m p : nat,
(n + m) * p = (n * p) + (m * p).
Proof.
intros n m p. induction p as [| p' HIp'].
- rewrite -> mult_0_r. rewrite mult_0_r. rewrite mult_0_r. reflexivity.
- rewrite one_S. rewrite mult_comm.
rewrite mult_n_Sm. rewrite mult_n_Sm.
rewrite plus_assoc. rewrite mult_comm.
rewrite mult_n_Sm. rewrite HIp'.
rewrite plus_swap. rewrite plus_assoc.
rewrite plus_assoc. rewrite <- plus_assoc.
rewrite plus_rearrange. rewrite plus_assoc. reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 9.9. Demostrar que
forall n m p : nat, n * (m * p) = (n * m) * p.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem mult_assoc : forall n m p : nat,
n * (m * p) = (n * m) * p.
Proof.
intros n m p. induction n as [|n' HIn'].
- simpl. reflexivity.
- simpl. rewrite HIn'. rewrite mult_plus_distr_r. reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 10. Demostrar que
forall n : nat, true = beq_nat n n.
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem beq_nat_refl : forall n : nat,
true = beq_nat n n.
Proof.
intro n. induction n as [| n' HIn'].
- simpl. reflexivity.
- simpl. rewrite HIn'. reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 11. La táctica replace permite especificar el subtérmino
que se desea reescribir y su sustituto: [replace (t) with (u)]
sustituye todas las copias de la expresión t en el objetivo por la
expresión u y añade la ecuación (t = u) como un nuevo subojetivo.
El uso de la táctica replace es especialmente útil cuando la táctica
rewrite actúa sobre una parte del objetivo que no es la que se desea.
Demostrar, usando la táctica replace y sin usar
[assert (n + m = m + n)], que
forall n m p : nat, n + (m + p) = m + (n + p).
------------------------------------------------------------------ *)
(* alerodrod5 *)
Theorem plus_swap' : forall n m p : nat,
n + (m + p) = m + (n + p).
Proof.
intros n m p. rewrite plus_assoc. rewrite plus_assoc.
replace (n+m) with (m+n).
- reflexivity.
- rewrite plus_comm. reflexivity.
Qed.