15/01/23 01:41:03.17 kQ1pk3tS
Coqというプログラムを使えば、計算機上で数学的な証明を厳密に行うことができます。
URLリンク(www.iij-ii.co.jp)
URLリンク(ja.wikipedia.org)
使いこなすには、大学レベルの数学と論理学とプログラミングと英語の知識が必要。
さあ、試してみよう!
2:片山博文MZ ◆T6xkBnTXz7B0
15/01/23 01:51:30.31 kQ1pk3tS
自然数nに対する2n=n+nの証明の例。
Require Import Arith.
Theorem t: forall n:nat, 2*n = n+n.
intros.
replace (n+n) with (1*n + 1*n).
replace 2 with (1+1).
apply mult_plus_distr_r.
auto.
replace (1*n) with n.
auto.
symmetry.
apply mult_1_l.
Qed.
3:片山博文MZ ◆T6xkBnTXz7B0
15/01/23 01:56:25.68 kQ1pk3tS
自然数nに対してn (n+1)が偶数であることの証明の例。
Require Import Even.
Theorem t:forall n:nat, even (n * (1+n)).
intros.
apply even_mult_aux.
elim n.
left.
apply even_O.
intros.
elim H.
right.
apply even_S.
apply odd_S.
apply H0.
left.
apply H0.
Qed.
4:片山博文MZ ◆T6xkBnTXz7B0
15/01/23 02:10:51.92 kQ1pk3tS
Coqは証明支援システムです。数学論文を英語で書ける程度の素養が必要です。
まずはTutorialを読むことから始めましょう。
natは自然数(natural numbers)の略です。
Coqでは英語や英語の略語がよく使われます。
5:132人目の素数さん
15/01/23 13:44:42.12 xOpKLzij
自動的に証明ができるんじゃないだろ
そこんとこ誤解させんなよ
6:132人目の素数さん
15/01/23 13:50:52.34 v4GbgrUP
____
/⌒ ⌒\
/ 癶 癶 \
/::::::⌒(__人__)⌒::::: \ あらあらうふふ
| |r┬-| |
\ `ー'´ /
7:片山博文MZ ◆T6xkBnTXz7B0
15/01/23 16:34:52.63 kQ1pk3tS
>>5 すみません。 >>6 English speakerに前置きなく「コック」って言ったら誤解を産むよね。
9:片山博文MZ ◆T6xkBnTXz7B0
15/01/23 16:42:51.44 kQ1pk3tS
「Require Import Arith.」は、
「Arith」というモジュール(部品)を読み込むコマンドだ。
コマンド「Theorem t: forall n:nat, 2*n = n+n.」について。
「Theorem t:」は、これから「t」という名前の定理を証明するよって意味。
「forall n:nat,」は、「∀n∈N」という意味。
ここで「∀」は論理学における「任意の…に対して」という意味。
「∈」は集合論の「…に属する」に相当する。
10:片山博文MZ ◆T6xkBnTXz7B0
15/01/23 16:48:37.07 kQ1pk3tS
掛け算について現在の定義を調べたいなら、掛け算の略は「mult」だから、「SearchAbout mult.」というコマンドを入力すればいい。
自然数について調べたいなら「SearchAbout nat.」を入力。
足し算なら「SearchAbout plus.」。
11:片山博文MZ ◆T6xkBnTXz7B0
15/01/23 16:57:07.60 kQ1pk3tS
Theoremコマンドを入力したら、証明モードに入る。
証明モードでは、証明するための「タクティク」(戦術)を入力できる。
コマンドは大文字で始まるが、タクティクは小文字で始まる。
タクティクの例を挙げると、intros,symmetry,left,right,auto,elim,applyなど、いろんなタクティクがある。
証明の終わりでは「Qed.」コマンドを入力する。
12:片山博文MZ ◆T6xkBnTXz7B0
15/01/23 17:12:06.01 kQ1pk3tS
さて、Coqのダウンロードとインストールが終わったら、早速Coqを起動しよう。
黒い画面に「Coq <」と表示されるだろう。
これはCoqのプロンプトであり、入力待ちであることを表している。
13:片山博文MZ ◆T6xkBnTXz7B0
15/01/23 17:15:42.51 kQ1pk3tS
Coqの終了コマンドは「Quit.」である。「Quit.」と打ち込んでEnterキーを押せば
黒い画面が消えるであろう。
14:132人目の素数さん
15/01/23 21:55:31.77 bh227Vy0
suck my coq!
15:132人目の素数さん
15/01/23 23:54:02.33 WDVlZtXn
まずは1がなんかお題だせよ。
16:132人目の素数さん
15/01/24 00:15:52.39 G4KHuvpv
Coqは数学、プログラミング両方で高い水準を要求されるからな。
このスレは人集まらないだろう。
数板ではプログラムの素養がネックになるか?
17:132人目の素数さん
15/01/24 00:29:02.73 w9MHCKHx
証明支援系のプログラムにバグがないことはどうやって
証明するの?
18:132人目の素数さん
15/01/24 08:29:32.31 jovcH18s
meta coqを使いなさい
19:片山博文MZ ◆T6xkBnTXz7B0
15/01/24 09:04:43.49 9w/8qlKh
お題:
x^2 - 2x + 1 = (x - 1)^2の証明。
20:132人目の素数さん
15/01/24 13:04:41.68 Wn9XFPkK
>>15
いやいや、いいスレだ。せいぜい集まろうぜ
21:132人目の素数さん
15/01/24 17:26:49.57 G4KHuvpv
-を+に変えた版はできた。
-の方はまだできてない。
Require Import Omega.
Require Import Arith.
Theorem t:forall n:nat,n*n+2*n+1=(n+1)*(n+1).
intros.
replace (2*n) with (n+n).
symmetry.
replace ((n+1)*(n+1)) with (n*(n+1)+1*(n+1)).
replace (n*(n+1)) with (n*n+n*1).
omega.
symmetry.
apply mult_plus_distr_l.
symmetry.
apply mult_plus_distr_r.
omega.
Qed.
22:片山博文MZ ◆T6xkBnTXz7B0
15/01/24 20:21:46.13 9w/8qlKh
>>20
もう少しだな。-2x=+(-2)xを使えば、できるはずだ。
23:132人目の素数さん
15/01/24 22:01:32.97 WXgNhwIy
/⌒ヽ⌒ヽ
Y
八 ヽ
( __//. ヽ,, ,)
丶1 八. !/
ζ, 八. j
i 丿 、 j
| 八 |
| ! i 、 |
| i し " i '|
|ノ ( i i|
( '~ヽ ! ∥
│ i ∥
| ! ||
| │ |
| | | |
| | | |
| ! | |
24:132人目の素数さん
15/01/25 19:37:01.31 4ki3LVZe
Coq の論理的バックグラウンド(?)になってる
Calculus of Inductive Construction (CIC)
(?:何種類かあって良く分からない)
について調べたいのですが良い文献ないですか?
25:132人目の素数さん
15/01/25 19:45:30.26 HYD7R+Gz
仕様記述言語Zとの関聯はないの?
26:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 16:34:55.90 SJxzPcnV
自然数の範囲では、>>18は証明できないよ。
整数か実数か複素数を使わないと。
27:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 17:08:56.67 SJxzPcnV
Require Import Arith.
Require Import Omega.
Open Scope Z_scope.
Theorem t: forall n:Z, n*n - 2*n + 1 = (n-1)*(n-1).
intros.
symmetry.
replace ((n-1)*(n-1)) with (n*(n-1)-1*(n-1)).
replace (1*(n-1)) with (n-1).
replace (n*(n-1)) with (n*n-n).
replace (n*n-n-(n-1)) with (n*n-(n-1)-n).
replace (n*n-(n-1)) with (n*n-n+1).
replace (n*n-n+1-n) with (n*n-n-n+1).
replace (n*n-n-n) with (n*n-2*n).
omega.
omega.
omega.
omega.
omega.
symmetry.
replace (n*n-n) with (n*n-n*1).
apply Z.mul_sub_distr_l.
omega.
symmetry.
apply Z.mul_sub_distr_r.
Qed.
28:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 17:13:27.24 SJxzPcnV
Require Import Omega.
Open Scope Z_scope.
の後で
SearchAbout Z.するとZの定義が見られるからね。
29:132人目の素数さん
15/01/27 19:50:17.70 BM4PDVdL
>>26
俺の環境だと証明が通らないんだが。
なんかミスってない?
30:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 20:07:13.17 SJxzPcnV
>>26
訂正。ガラケーで入力大変。
(誤)
apply Z.mul_sub_distr_l.
omega.
symmetry.
apply Z.mul_sub_distr_r.
Qed.
(正)
apply Z.mul_sub_distr_l.
omega.
omega.
symmetry.
apply Z.mul_sub_distr_r.
Qed.
31:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 20:10:46.94 SJxzPcnV
お題:
「3の倍数に6を足したものは3の倍数である」を証明せよ。
32:132人目の素数さん
15/01/27 20:19:16.49 BM4PDVdL
>>29
通った。
33:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 20:27:34.17 SJxzPcnV
>>24
聞いた覚えはないな
34:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 20:35:45.19 SJxzPcnV
>>30
「xは3の倍数である」
⇔
∃y∈Zに対して「x=3y」、
だな。1階述語とexistsを使って解いてくれ。
35:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 20:59:02.99 SJxzPcnV
例えば、
Definition trimul (n:nat) := exists m:nat, n = 3*m.
と定義すればtrimul(0)は次のように証明できる。
Theorem tmzero: trimul(0).
unfold trimul.
exists 0.
auto.
Qed.
36:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 21:17:44.23 SJxzPcnV
>>30
Require Import Arith.
Require Import Omega.
Open Scope Z_scope.
Definition trimul (x:Z) := exists y:Z, x = 3*y.
Theorem t: forall x:Z, trimul(x) -> trimul(x+6).
intros.
unfold trimul.
destruct H.
exists (x0+2).
replace (x) with (3*x0).
omega.
Qed.
37:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 21:25:18.31 SJxzPcnV
「Reset Initial.」コマンドでCoqを初期状態へ戻すことができる。
「unfold x.」はゴールにあるxをその定義に展開するタクティクだ。
「destruct H.」はHを崩すタクティク。
38:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 21:30:41.25 SJxzPcnV
お題:
「3の倍数に4を掛けたものは6の倍数である」を証明。
39:132人目の素数さん
15/01/27 21:32:30.82 BM4PDVdL
片山さん結構勉強進んでるな。
40:132人目の素数さん
15/01/27 21:52:51.06 BM4PDVdL
こう?
Require Import Omega.
Require Import Arith.
Open Scope Z_scope.
Definition tr(x:Z) := exists y:Z , x=3*y.
Definition s(x:Z) := exists y:Z,x=6*y.
Theorem t: forall x:Z,tr(x)->s(4*x).
intros.
unfold s.
destruct H.
exists (2*x0).
replace x with (3*x0).
omega.
Qed.
多分このスレには片山さんと俺しかいないぞw
41:片山博文MZ ◆T6xkBnTXz7B0
15/01/27 22:12:11.97 SJxzPcnV
>>39
正解!
このスレを立てた目的は…
1.Coqの知名度アップと啓蒙。
2.Coqによる「片山QZの定理」の証明。
3.Coqと人工知能の連携を考えること。
42:132人目の素数さん
15/01/28 08:18:03.12 Q7XfmRRj
>3.Coqと人工知能の連携を考えること。
ここをもう少し詳しく
43:132人目の素数さん
15/01/28 18:28:09.93 Q7XfmRRj
どのお題も超簡単なものだけに見えるのだが、それはなぜ?
Coqでの証明法がだれにも分かりやすくなるようあえて題材は
簡単なものを選んでいるの?
もっとCoqの強力さが分かる位難しい題材でやってくれんかな。
そもそもCoqではどの位難しいものがどの位の手間で証明できるの?
44:片山博文MZ ◆T6xkBnTXz7B0
15/01/28 18:52:58.11 xr03hxaD
>>41
単純に言えば、コンピューターでできた数学者を作ろうとしている。
数学の問題は、式の変形と問題の分解と解の探索の問題に還元されるから、
人工知能でもいくつかの問題を解くことができるはずだ。
45:片山博文MZ ◆T6xkBnTXz7B0
15/01/28 18:58:35.37 xr03hxaD
>>42
はじめは基礎と慣れが大事。不満なら君も出題してもかまわない。
次は集合論から出題したまえ。
46:132人目の素数さん
15/01/28 19:12:43.24 MQBQj2T8
>>44
なぜ集合論?
一応念のためいっとくが>>42は某スレの1(俺)とは別人だぞ。
47:片山博文MZ ◆T6xkBnTXz7B0
15/01/28 19:42:58.51 xr03hxaD
お題:
「Z⊆XかつZ⊆YならばZ⊆X∩Y」を証明せよ。
48:132人目の素数さん
15/01/28 20:04:26.42 Q7XfmRRj
>>43
Coqあるいは片山さんは、東大ロボプロジェクトはどう評価してるの?
49:132人目の素数さん
15/01/28 20:07:20.02 Q7XfmRRj
>>44
集合問題でなく整数問題の系統だが、まずはこういう易しめのお題はどう?
お題:正整数m、nがあり、LCM(m,n) + GCD(m,n) = m + n とする。
このとき、m, n のどちらか一方は、他方によって割り切れることを示せ。
50:132人目の素数さん
15/01/28 22:31:29.58 MQBQj2T8
易しいっていうけど>>48は>>48の証明をCoqでできるの?
51:132人目の素数さん
15/01/29 09:57:12.57 rxXHbRm8
俺はCoqのド素人だから聞いてる。
だが人間にとって証明問題といえばふつうこれくらいからだろ?
52:132人目の素数さん
15/01/30 10:46:00.89 NnXyGTxc
☆☆☆☆☆
☆ 自民党、グッジョブですわ。 ☆
URLリンク(www.soumu.go.jp)
☆ 日本国民の皆様方、2016年7月の『第24回 参議院選挙』で、改憲の参議院議員が
3分の2以上を超えると日本国憲法の改正です。皆様方、必ず投票に自ら足を運んでください。
そして、私たちの日本国憲法を絶対に改正しましょう。☆
53:132人目の素数さん
15/01/30 11:16:04.23 UCtzINaz
>>23