Coq演習
第二回
数学が分からん。
群というのはぐぐる限りかなり基礎的なことであるようだ。
http://maldoror-ducasse.cocolog-nifty.com/blog/2006/12/post_f319.html
a*/a = (1*a)*/a = [{/(/a)*/a}*a]*/a = {/(/a)*1}*/a=/(/a)*/a = 1 ですね。
ですね。とか言われてもなあ。
かなり当たり前のことを言ってる気はすんだけど、途中の式変形をどやってCoqに落とせばいいのか見当もつかん。
Require Import Arith. Goal forall x y, x < y -> x + 10 < y + 10. Proof. SearchAbout (_ + _ < _ + _). intros. apply NPeano.Nat.add_lt_mono_r. assumption. Qed. Goal forall P Q: nat -> Prop, P 0 -> (forall x, P x -> Q x) -> Q 0. Proof. intros. apply H0 . apply H. Qed. Goal forall P : nat -> Prop, P 2 -> (exists y, P (1 + y)). Proof. intros. exists 1. simpl. apply H. Qed. Goal forall P : nat -> Prop, (forall n m, P n -> P m) -> (exists p, P p) -> forall q, P q. Proof. intros. destruct H0. apply (H x). assumption. Qed. Goal forall m n : nat, (n * 10) + m = (10 * n) + m. intros. assert(n * 10 = 10 * n). apply mult_comm. rewrite H. reflexivity. Qed. (* SearchAbout (_ * _ = _ * _). *) Goal forall n m p q : nat, (n + m) + (p + q) = (n + p) + (m + q). Proof. intros. SearchAbout (_ + _ = _ + _). apply plus_permute_2_in_4. Qed. Goal forall n m : nat, (n + m) * (n + m) = n * n + m * m + 2 * n * m. Proof. SearchAbout ((_ + _) * _). intros. rewrite mult_plus_distr_l. rewrite mult_plus_distr_r. rewrite mult_plus_distr_r. assert(H: m * n = n * m). rewrite mult_comm. reflexivity. rewrite H. assert(H2: n * m + n * m = 2 * n * m). simpl. rewrite mult_plus_distr_r. rewrite mult_plus_distr_r. simpl. SearchAbout (_ + 0). rewrite <- plus_n_O. reflexivity. rewrite <- H2. SearchAbout (_ + _ + _). rewrite -> plus_assoc. rewrite -> plus_assoc. assert(H3:n * m + m * m = m * m + n * m). rewrite -> plus_comm. reflexivity. rewrite <- plus_assoc. rewrite H3. SearchAbout (_ + _ + _). rewrite <- plus_permute_2_in_4. rewrite -> plus_assoc. reflexivity. Qed. (* 課題10 *) Parameter G : Set. Parameter mult : G -> G -> G. Notation "x * y" := (mult x y). Parameter one : G. Notation "1" := one. Parameter inv : G -> G. Notation "/ x" := (inv x). Notation "x / y" := (mult x (inv y)). Axiom mult_assoc : forall x y z, x * (y * z) = (x * y) * z. Axiom one_unit_l : forall x, 1 * x = x. Axiom inv_l : forall x, /x * x = 1. Lemma inv_r : forall x, x * / x = 1. Proof. intros. assert (H: 1 * x * / x = x * / x). rewrite one_unit_l. reflexivity. rewrite <- one_unit_l. rewrite <- H. rewrite <- mult_assoc. Admitted.
寝よ。