nus/cs3234/labs/week-06_a_simple_problem.v
2024-05-08 16:20:16 +08:00

73 lines
2.0 KiB
Coq

(* Paraphernalia: *)
Ltac fold_unfold_tactic name := intros; unfold name; fold name; reflexivity.
Require Import Arith Bool.
(* ********** *)
Check Bool.eqb. (* : bool -> bool -> bool *)
Check eqb. (* : bool -> bool -> bool *)
Search (eqb _ _ = true -> _ = _).
(* eqb_prop: forall a b : bool, eqb a b = true -> a = b *)
Search (eqb _ _ = true).
(* eqb_reflx: forall b : bool, eqb b b = true *)
Search (_ * _).
(* Definition is_even (n: nat) := *)
(* Proposition product_of_n_and_even_is_even : *)
(* forall n : nat, *)
Proposition product_of_2_consecutive_natural_numbers_is_even:
forall n: nat,
exists a: nat,
n * (S n) = 2 * a.
Proof.
intro n.
induction n as [ | n' IHn'].
- exists 0.
rewrite -> (Nat.mul_0_l 1).
rewrite -> (Nat.mul_0_r 2).
reflexivity.
- rewrite -> (Nat.mul_succ_r (S n') (S n')).
rewrite -> (Nat.mul_succ_r (S n') n').
rewrite -> (Nat.mul_comm (S n') n').
destruct IHn' as [k IHn'].
rewrite -> IHn'.
rewrite <- (Nat.add_assoc (2 * k) (S n') (S n')).
remember (S n' + S n') as x eqn:H_x.
rewrite <- (Nat.mul_1_l (S n')) in H_x at 1.
rewrite -> H_x.
rewrite <- (Nat.mul_succ_l 1 (S n')).
Search (_ * _ + _ * _).
rewrite <- (Nat.mul_add_distr_l 2 k (S n')).
exists (k + S n').
reflexivity.
Qed.
Proposition product_of_3_consecutive_natural_numbers_is_divisible_by_2:
forall n : nat,
exists a : nat,
n * (S n) * (S (S n)) = 2 * a.
Proof.
intro n.
induction n as [ | n' IHn' ].
- exists 0.
rewrite -> (Nat.mul_0_l 1).
rewrite -> (Nat.mul_0_l 2).
rewrite -> (Nat.mul_0_r 2).
reflexivity.
- destruct IHn' as [k IHn'].
destruct (product_of_2_consecutive_natural_numbers_is_even (S n')) as [x H_product_of_2_consecutive_natural_numbers_is_even].
rewrite -> H_product_of_2_consecutive_natural_numbers_is_even.
exists (x * S (S (S n'))).
Check (Nat.mul_assoc 2 x (S (S (S n')))).
rewrite -> (Nat.mul_assoc 2 x (S (S (S n')))).
reflexivity.
Qed.