diff options
Diffstat (limited to 'samples/coq/Basics.v')
| -rwxr-xr-x | samples/coq/Basics.v | 707 |
1 files changed, 707 insertions, 0 deletions
diff --git a/samples/coq/Basics.v b/samples/coq/Basics.v new file mode 100755 index 0000000..054fcbd --- /dev/null +++ b/samples/coq/Basics.v @@ -0,0 +1,707 @@ +Inductive day : Type := +| monday : day +| tuesday : day +| wednesday : day +| thursday : day +| friday : day +| saturday : day +| sunday : day. + +Definition next_weekday (d:day) : day := + match d with + | monday => tuesday + | tuesday => wednesday + | wednesday => thursday + | thursday => friday + | friday => monday + | saturday => monday + | sunday => monday + end. + +Example test_next_weekday: +(next_weekday (next_weekday saturday)) = tuesday. + +Proof. simpl. reflexivity. Qed. + +Inductive bool : Type := + | true : bool + | false : bool. + +Definition negb (b:bool) : bool := + match b with + | true => false + | false => true + end. + +Definition andb (b1:bool) (b2:bool) : bool := + match b1 with + | true => b2 + | false => false + end. + +Definition orb (b1:bool) (b2:bool) : bool := + match b1 with + | true => true + | false => b2 + end. + +Example test_orb1: (orb true false) = true. +Proof. simpl. reflexivity. Qed. + +Example test_orb2: (orb false false) = false. +Proof. simpl. reflexivity. Qed. + +Example test_orb3: (orb false true) = true. +Proof. simpl. reflexivity. Qed. + +Example test_orb4: (orb true true) = true. +Proof. simpl. reflexivity. Qed. + +Definition nandb (b1: bool) (b2:bool) : bool := + match b1 with + | true => match b2 with + | false => true + | true => false + end + | false => true + end. + +Example test_nandb1: (nandb true false) = true. +Proof. simpl. reflexivity. Qed. +Example test_nandb2: (nandb false false) = true. +Proof. simpl. reflexivity. Qed. +Example test_nandb3: (nandb false true) = true. +Proof. simpl. reflexivity. Qed. +Example test_nandb4: (nandb true true) = false. +Proof. simpl. reflexivity. Qed. + +Definition andb3 (b1: bool) (b2:bool) (b3:bool) : bool := + match b1 with + | false => false + | true => match b2 with + | false => false + | true => b3 + end + end. + +Example test_andb31: (andb3 true true true) = true. +Proof. simpl. reflexivity. Qed. +Example test_andb32: (andb3 false true true) = false. +Proof. simpl. reflexivity. Qed. +Example test_andb33: (andb3 true false true) = false. +Proof. simpl. reflexivity. Qed. +Example test_andb34: (andb3 true true false) = false. +Proof. simpl. reflexivity. Qed. + +Module Playground1. + +Inductive nat : Type := + | O : nat + | S : nat -> nat. + +Definition pred (n : nat) : nat := + match n with + | O => O + | S n' => n' + end. + +Definition minustwo (n : nat) : nat := + match n with + | O => O + | S O => O + | S (S n') => n' + end. + +Fixpoint evenb (n : nat) : bool := + match n with + | O => true + | S O => false + | S (S n') => evenb n' + end. + +Definition oddb (n : nat) : bool := negb (evenb n). + +Example test_oddb1: (oddb (S O)) = true. +Proof. reflexivity. Qed. +Example test_oddb2: (oddb (S (S (S (S O))))) = false. +Proof. reflexivity. Qed. + +Fixpoint plus (n : nat) (m : nat) : nat := + match n with + | O => m + | S n' => S (plus n' m) + end. + +Fixpoint mult (n m : nat) : nat := + match n with + | O => O + | S n' => plus m (mult n' m) + end. + +Fixpoint minus (n m : nat) : nat := + match n, m with + | O, _ => n + | S n', O => S n' + | S n', S m' => minus n' m' + end. + +Fixpoint exp (base power : nat) : nat := + match power with + | O => S O + | S p => mult base (exp base p) + end. + +Fixpoint factorial (n : nat) : nat := + match n with + | O => S O + | S n' => mult n (factorial n') + end. + +Example test_factorial1: (factorial (S (S (S O)))) = (S (S (S (S (S (S O)))))). +Proof. simpl. reflexivity. Qed. + +Notation "x + y" := (plus x y) (at level 50, left associativity) : nat_scope. +Notation "x - y" := (minus x y) (at level 50, left associativity) : nat_scope. +Notation "x * y" := (mult x y) (at level 40, left associativity) : nat_scope. + +Fixpoint beq_nat (n m : nat) : bool := + match n with + | O => match m with + | O => true + | S m' => false + end + | S n' => match m with + | O => false + | S m' => beq_nat n' m' + end + end. + +Fixpoint ble_nat (n m : nat) : bool := + match n with + | O => true + | S n' => + match m with + | O => false + | S m' => ble_nat n' m' + end + end. + +Example test_ble_nat1: (ble_nat (S (S O)) (S (S O))) = true. +Proof. simpl. reflexivity. Qed. +Example test_ble_nat2: (ble_nat (S (S O)) (S (S (S (S O))))) = true. +Proof. simpl. reflexivity. Qed. +Example test_ble_nat3: (ble_nat (S (S (S (S O)))) (S (S O))) = false. +Proof. simpl. reflexivity. Qed. + +Definition blt_nat (n m : nat) : bool := + (andb (negb (beq_nat n m)) (ble_nat n m)). + +Example test_blt_nat1: (blt_nat (S (S O)) (S (S O))) = false. +Proof. simpl. reflexivity. Qed. +Example test_blt_nat3: (blt_nat (S (S (S (S O)))) (S (S O))) = false. +Proof. simpl. reflexivity. Qed. +Example test_blt_nat2 : (blt_nat (S (S O)) (S (S (S (S O))))) = true. +Proof. simpl. reflexivity. Qed. + +Theorem plus_O_n : forall n : nat, O + n = n. +Proof. + simpl. reflexivity. Qed. + +Theorem plus_O_n' : forall n : nat, O + n = n. +Proof. + reflexivity. Qed. + +Theorem plus_O_n'' : forall n : nat, O + n = n. +Proof. + intros n. reflexivity. Qed. + +Theorem plus_1_1 : forall n : nat, (S O) + n = S n. +Proof. + intros n. reflexivity. Qed. + +Theorem mult_0_1: forall n : nat, O * n = O. +Proof. + intros n. reflexivity. Qed. + +Theorem plus_id_example : forall n m:nat, + n = m -> n + n = m + m. +Proof. + intros n m. + intros H. + rewrite -> H. + reflexivity. Qed. + +Theorem plus_id_exercise : forall n m o: nat, + n = m -> m = o -> n + m = m + o. +Proof. + intros n m o. + intros H. + intros H'. + rewrite -> H. + rewrite <- H'. + reflexivity. + Qed. + +Theorem mult_0_plus : forall n m : nat, + (O + n) * m = n * m. +Proof. + intros n m. + rewrite -> plus_O_n. + reflexivity. Qed. + +Theorem mult_1_plus : forall n m: nat, + ((S O) + n) * m = m + (n * m). +Proof. + intros n m. + rewrite -> plus_1_1. + reflexivity. + Qed. + +Theorem mult_1 : forall n : nat, + n * (S O) = n. +Proof. + intros n. + induction n as [| n']. + reflexivity. + simpl. + rewrite -> IHn'. + reflexivity. + Qed. + +Theorem plus_1_neq_0 : forall n : nat, + beq_nat (n + (S O)) O = false. +Proof. + intros n. + destruct n as [| n']. + reflexivity. + reflexivity. + Qed. + +Theorem zero_nbeq_plus_1 : forall n : nat, + beq_nat O (n + (S O)) = false. +Proof. + intros n. + destruct n. + reflexivity. + reflexivity. +Qed. + +Require String. Open Scope string_scope. + +Ltac move_to_top x := +match reverse goal with +| H : _ |- _ => try move x after H +end. + +Tactic Notation "assert_eq" ident(x) constr(v) := + let H := fresh in + assert (x = v) as H by reflexivity; + clear H. + + Tactic Notation "Case_aux" ident(x) constr(name) := + first [ + set (x := name); move_to_top x + | assert_eq x name; move_to_top x + | fail 1 "because we are working on a different case" ]. + + Ltac Case name := Case_aux Case name. + Ltac SCase name := Case_aux SCase name. + Ltac SSCase name := Case_aux SSCase name. + Ltac SSSCase name := Case_aux SSSCase name. + Ltac SSSSCase name := Case_aux SSSSCase name. + Ltac SSSSSCase name := Case_aux SSSSSCase name. + Ltac SSSSSSCase name := Case_aux SSSSSSCase name. + Ltac SSSSSSSCase name := Case_aux SSSSSSSCase name. + +Theorem andb_true_elim1 : forall b c : bool, + andb b c = true -> b = true. +Proof. + intros b c H. + destruct b. + Case "b = true". + reflexivity. + Case "b = false". + rewrite <- H. reflexivity. Qed. + +Theorem plus_0_r : forall n : nat, n + O = n. +Proof. + intros n. induction n as [| n']. + Case "n = 0". reflexivity. + Case "n = S n'". simpl. rewrite -> IHn'. reflexivity. Qed. + +Theorem minus_diag : forall n, + minus n n = O. +Proof. + intros n. induction n as [| n']. + Case "n = 0". + simpl. reflexivity. + Case "n = S n'". + simpl. rewrite -> IHn'. reflexivity. Qed. + + +Theorem mult_0_r : forall n:nat, + n * O = O. +Proof. + intros n. induction n as [| n']. + Case "n = 0". + reflexivity. + Case "n = S n'". + simpl. rewrite -> IHn'. reflexivity. Qed. + +Theorem plus_n_Sm : forall n m : nat, + S (n + m) = n + (S m). +Proof. + intros n m. induction n as [| n']. + Case "n = 0". + reflexivity. + Case "n = S n'". + simpl. rewrite -> IHn'. reflexivity. Qed. + +Theorem plus_assoc : forall n m p : nat, + n + (m + p) = (n + m) + p. +Proof. + intros n m p. + induction n as [| n']. + reflexivity. + simpl. + rewrite -> IHn'. + reflexivity. Qed. + +Theorem plus_distr : forall n m: nat, S (n + m) = n + (S m). +Proof. + intros n m. induction n as [| n']. + Case "n = 0". + reflexivity. + Case "n = S n'". + simpl. rewrite -> IHn'. reflexivity. Qed. + +Theorem mult_distr : forall n m: nat, n * ((S O) + m) = n * (S m). +Proof. + intros n m. + induction n as [| n']. + reflexivity. + reflexivity. + Qed. + +Theorem plus_comm : forall n m : nat, + n + m = m + n. +Proof. + intros n m. + induction n as [| n']. + Case "n = 0". + simpl. + rewrite -> plus_0_r. + reflexivity. + Case "n = S n'". + simpl. + rewrite -> IHn'. + rewrite -> plus_distr. + reflexivity. Qed. + +Fixpoint double (n:nat) := + match n with + | O => O + | S n' => S (S (double n')) + end. + +Lemma double_plus : forall n, double n = n + n. +Proof. + intros n. induction n as [| n']. + Case "n = 0". + reflexivity. + Case "n = S n'". + simpl. rewrite -> IHn'. + rewrite -> plus_distr. reflexivity. + Qed. + +Theorem beq_nat_refl : forall n : nat, + true = beq_nat n n. +Proof. + intros n. induction n as [| n']. + Case "n = 0". + reflexivity. + Case "n = S n". + simpl. rewrite <- IHn'. + reflexivity. Qed. + +Theorem plus_rearrange: forall n m p q : nat, + (n + m) + (p + q) = (m + n) + (p + q). +Proof. + intros n m p q. + assert(H: n + m = m + n). + Case "Proof by assertion". + rewrite -> plus_comm. reflexivity. + rewrite -> H. reflexivity. Qed. + +Theorem plus_swap : forall n m p: nat, + n + (m + p) = m + (n + p). +Proof. + intros n m p. + rewrite -> plus_assoc. + assert(H: m + (n + p) = (m + n) + p). + rewrite -> plus_assoc. + reflexivity. + rewrite -> H. + assert(H2: m + n = n + m). + rewrite -> plus_comm. + reflexivity. + rewrite -> H2. + reflexivity. + Qed. + +Theorem plus_swap' : forall n m p: nat, + n + (m + p) = m + (n + p). +Proof. + intros n m p. + rewrite -> plus_assoc. + assert(H: m + (n + p) = (m + n) + p). + rewrite -> plus_assoc. + reflexivity. + rewrite -> H. + replace (m + n) with (n + m). + rewrite -> plus_comm. + reflexivity. + rewrite -> plus_comm. + reflexivity. + Qed. + +Theorem mult_1_distr: forall m n: nat, + n * ((S O) + m) = n * (S O) + n * m. +Proof. + intros n m. + rewrite -> mult_1. + rewrite -> plus_1_1. + simpl. + induction m as [|m']. + simpl. + reflexivity. + simpl. + rewrite -> plus_swap. + rewrite <- IHm'. + reflexivity. + Qed. + +Theorem mult_comm: forall m n : nat, + m * n = n * m. +Proof. + intros m n. + induction n as [| n']. + Case "n = 0". + simpl. + rewrite -> mult_0_r. + reflexivity. + Case "n = S n'". + simpl. + rewrite <- mult_distr. + rewrite -> mult_1_distr. + rewrite -> mult_1. + rewrite -> IHn'. + reflexivity. + Qed. + +Theorem evenb_next : forall n : nat, + evenb n = evenb (S (S n)). +Proof. + intros n. +Admitted. + +Theorem negb_negb : forall n : bool, + n = negb (negb n). +Proof. + intros n. + destruct n. + reflexivity. + reflexivity. + Qed. + +Theorem evenb_n_oddb_Sn : forall n : nat, + evenb n = negb (evenb (S n)). +Proof. + intros n. + induction n as [|n']. + reflexivity. + assert(H: evenb n' = evenb (S (S n'))). + reflexivity. + rewrite <- H. + rewrite -> IHn'. + rewrite <- negb_negb. + reflexivity. + Qed. + +(*Fixpoint bad (n : nat) : bool := + match n with + | O => true + | S O => bad (S n) + | S (S n') => bad n' + end.*) + +Theorem ble_nat_refl : forall n:nat, + true = ble_nat n n. +Proof. + intros n. + induction n as [|n']. + Case "n = 0". + reflexivity. + Case "n = S n". + simpl. + rewrite <- IHn'. + reflexivity. + Qed. + +Theorem zero_nbeq_S : forall n: nat, + beq_nat O (S n) = false. +Proof. + intros n. + reflexivity. + Qed. + +Theorem andb_false_r : forall b : bool, + andb b false = false. +Proof. + intros b. + destruct b. + reflexivity. + reflexivity. + Qed. + +Theorem plus_ble_compat_1 : forall n m p : nat, + ble_nat n m = true -> ble_nat (p + n) (p + m) = true. +Proof. + intros n m p. + intros H. + induction p. + Case "p = 0". + simpl. + rewrite -> H. + reflexivity. + Case "p = S p'". + simpl. + rewrite -> IHp. + reflexivity. + Qed. + +Theorem S_nbeq_0 : forall n:nat, + beq_nat (S n) O = false. +Proof. + intros n. + reflexivity. + Qed. + +Theorem mult_1_1 : forall n:nat, (S O) * n = n. +Proof. + intros n. + simpl. + rewrite -> plus_0_r. + reflexivity. Qed. + +Theorem all3_spec : forall b c : bool, + orb (andb b c) + (orb (negb b) + (negb c)) + = true. +Proof. + intros b c. + destruct b. + destruct c. + reflexivity. + reflexivity. + reflexivity. + Qed. + +Lemma mult_plus_1 : forall n m : nat, + S(m + n) = m + (S n). +Proof. + intros n m. + induction m. + reflexivity. + simpl. + rewrite -> IHm. + reflexivity. + Qed. + +Theorem mult_mult : forall n m : nat, + n * (S m) = n * m + n. +Proof. + intros n m. + induction n. + reflexivity. + simpl. + rewrite -> IHn. + rewrite -> plus_assoc. + rewrite -> mult_plus_1. + reflexivity. + Qed. + +Theorem mult_plus_distr_r : forall n m p:nat, + (n + m) * p = (n * p) + (m * p). +Proof. + intros n m p. + induction p. + rewrite -> mult_0_r. + rewrite -> mult_0_r. + rewrite -> mult_0_r. + reflexivity. + rewrite -> mult_mult. + rewrite -> mult_mult. + rewrite -> mult_mult. + rewrite -> IHp. + assert(H1: ((n * p) + n) + (m * p + m) = (n * p) + (n + (m * p + m))). + rewrite <- plus_assoc. + reflexivity. + rewrite -> H1. + assert(H2: (n + (m * p + m)) = (m * p + (n + m))). + rewrite -> plus_swap. + reflexivity. + rewrite -> H2. + assert(H3: (n * p) + (m * p + (n + m)) = ((n * p ) + (m * p)) + (n + m)). + rewrite -> plus_assoc. + reflexivity. + rewrite -> H3. + reflexivity. + Qed. + +Theorem mult_assoc : forall n m p : nat, + n * (m * p) = (n * m) * p. +Proof. + intros n m p. + induction n. + simpl. + reflexivity. + simpl. + rewrite -> mult_plus_distr_r. + rewrite -> IHn. + reflexivity. + Qed. + +Inductive bin : Type := + | BO : bin + | D : bin -> bin + | M : bin -> bin. + +Fixpoint incbin (n : bin) : bin := + match n with + | BO => M (BO) + | D n' => M n' + | M n' => D (incbin n') + end. + +Fixpoint bin2un (n : bin) : nat := + match n with + | BO => O + | D n' => double (bin2un n') + | M n' => S (double (bin2un n')) + end. + +Theorem bin_comm : forall n : bin, + bin2un(incbin n) = S (bin2un n). +Proof. + intros n. + induction n. + reflexivity. + reflexivity. + simpl. + rewrite -> IHn. + reflexivity. + Qed. + +End Playground1. |
