├── .gitignore ├── images ├── Logo1.png ├── Menu.png ├── format1.png ├── tac-left.png ├── formation1.png ├── formation2.png ├── hello-coq1.png ├── hello-coq2.png ├── hello-coq3.png ├── hello-coq4.png ├── hello-coq5.png ├── tac-apply.png ├── tac-exact.png ├── tac-right.png ├── tac-simpl1.png ├── tac-simpl2.png ├── tac-simpl3.png ├── tac-split.png ├── coq-response.png ├── logicalSymbol.png ├── tac-destruct1.png ├── tac-destruct2.png ├── tac-intros1.png ├── tac-intros2.png ├── tac-intros3.png ├── tac-rewrite1.png ├── tac-rewrite2.png ├── tac-rewrite3.png ├── two-proccess.png ├── two-subgoals.png ├── tac-assumption.png └── tac-reflexivity.png ├── .ipynb_checkpoints ├── 1-Logic-Copy1-checkpoint.ipynb ├── 1-Logic-Copy2-checkpoint.ipynb ├── Logic-checkpoint.ipynb ├── 1−Logic-checkpoint.ipynb ├── Equal−Ex-checkpoint.ipynb ├── Equal-Ex-checkpoint.ipynb ├── Induction-Ex-checkpoint.ipynb ├── Logic-Ex-checkpoint.ipynb ├── 1_basic-checkpoint.ipynb ├── 0-Contents-checkpoint.ipynb ├── Introduction-checkpoint.ipynb ├── 0-Introduction-checkpoint.ipynb ├── Equal-Ex-Work-checkpoint.ipynb ├── Equal-Ex-Answer-checkpoint.ipynb ├── Induction-Ex-Work-checkpoint.ipynb └── Logic-Ex-Work-checkpoint.ipynb ├── README.md ├── 0-Contents.ipynb └── 0-Introduction.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /images/Logo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/Logo1.png -------------------------------------------------------------------------------- /images/Menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/Menu.png -------------------------------------------------------------------------------- /images/format1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/format1.png -------------------------------------------------------------------------------- /images/tac-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-left.png -------------------------------------------------------------------------------- /images/formation1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/formation1.png -------------------------------------------------------------------------------- /images/formation2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/formation2.png -------------------------------------------------------------------------------- /images/hello-coq1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/hello-coq1.png -------------------------------------------------------------------------------- /images/hello-coq2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/hello-coq2.png -------------------------------------------------------------------------------- /images/hello-coq3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/hello-coq3.png -------------------------------------------------------------------------------- /images/hello-coq4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/hello-coq4.png -------------------------------------------------------------------------------- /images/hello-coq5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/hello-coq5.png -------------------------------------------------------------------------------- /images/tac-apply.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-apply.png -------------------------------------------------------------------------------- /images/tac-exact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-exact.png -------------------------------------------------------------------------------- /images/tac-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-right.png -------------------------------------------------------------------------------- /images/tac-simpl1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-simpl1.png -------------------------------------------------------------------------------- /images/tac-simpl2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-simpl2.png -------------------------------------------------------------------------------- /images/tac-simpl3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-simpl3.png -------------------------------------------------------------------------------- /images/tac-split.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-split.png -------------------------------------------------------------------------------- /images/coq-response.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/coq-response.png -------------------------------------------------------------------------------- /images/logicalSymbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/logicalSymbol.png -------------------------------------------------------------------------------- /images/tac-destruct1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-destruct1.png -------------------------------------------------------------------------------- /images/tac-destruct2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-destruct2.png -------------------------------------------------------------------------------- /images/tac-intros1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-intros1.png -------------------------------------------------------------------------------- /images/tac-intros2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-intros2.png -------------------------------------------------------------------------------- /images/tac-intros3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-intros3.png -------------------------------------------------------------------------------- /images/tac-rewrite1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-rewrite1.png -------------------------------------------------------------------------------- /images/tac-rewrite2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-rewrite2.png -------------------------------------------------------------------------------- /images/tac-rewrite3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-rewrite3.png -------------------------------------------------------------------------------- /images/two-proccess.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/two-proccess.png -------------------------------------------------------------------------------- /images/two-subgoals.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/two-subgoals.png -------------------------------------------------------------------------------- /images/tac-assumption.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-assumption.png -------------------------------------------------------------------------------- /images/tac-reflexivity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maruyama097/coq-tutorial/HEAD/images/tac-reflexivity.png -------------------------------------------------------------------------------- /.ipynb_checkpoints/1-Logic-Copy1-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "coq_kernel_metadata": { 18 | "auto_roll_back": true 19 | } 20 | }, 21 | "source": [ 22 | "# 等式の証明" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": null, 28 | "metadata": { 29 | "coq_kernel_metadata": { 30 | "auto_roll_back": true 31 | } 32 | }, 33 | "outputs": [], 34 | "source": [] 35 | } 36 | ], 37 | "metadata": { 38 | "kernelspec": { 39 | "display_name": "Coq", 40 | "language": "coq", 41 | "name": "coq" 42 | }, 43 | "language_info": { 44 | "file_extension": ".v", 45 | "mimetype": "text/x-coq", 46 | "name": "coq", 47 | "version": "8.9.1" 48 | } 49 | }, 50 | "nbformat": 4, 51 | "nbformat_minor": 2 52 | } 53 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/1-Logic-Copy2-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "coq_kernel_metadata": { 18 | "auto_roll_back": true 19 | } 20 | }, 21 | "source": [ 22 | "# 等式の証明" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": null, 28 | "metadata": { 29 | "coq_kernel_metadata": { 30 | "auto_roll_back": true 31 | } 32 | }, 33 | "outputs": [], 34 | "source": [] 35 | } 36 | ], 37 | "metadata": { 38 | "kernelspec": { 39 | "display_name": "Coq", 40 | "language": "coq", 41 | "name": "coq" 42 | }, 43 | "language_info": { 44 | "file_extension": ".v", 45 | "mimetype": "text/x-coq", 46 | "name": "coq", 47 | "version": "8.9.1" 48 | } 49 | }, 50 | "nbformat": 4, 51 | "nbformat_minor": 2 52 | } 53 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # このチュートリアルについて 2 | 3 | このチュートリアルは、coq-jupyter の形式で記述されています。Coqとcoq-jupyter をインストールしていれば、ドキュメントの内部でCoqのコマンドが実行できます。 4 | 5 | 全体の構成については[目次](0-Contents.ipynb)をご覧ください。(ファイル名は、0-Contents.ipynbです。) 6 | git clone https://github.com/maruyama097/coq-tutorial でダウンロードできます。 7 | 8 | Coqとcoq-jupyterのインストールなしでも、jupyter のnotebookとしてだけなら、GitHubへのアクセスだけでも、画像を含めてドキュメントの多くの部分を読むことは可能です。 9 | - ただ、文字の一部が欠けていたり、HTMLのタグがそのまま表示されることがあります。 10 | - もちろん、Coqのコマンドは実行できません。 11 | 12 | Coqとcoq-jupyterのインストールをお勧めします。 13 | 14 | # Coqとcoq-jupyterのインストールについて 15 | 16 | Mac とWindowsでは、インストールのやり方が異なりますので、ご注意ください。 17 | 18 | ## Macの場合 19 | 20 | Anacondaを既にインストールしている場合と、そうでない場合とで、別々のインストールの仕方を紹介します。 21 | 22 | ### Anacondaがインストール済の場合 23 | 24 | 次のコマンドで、Coqとcoq-jupyterのインストールができます。 25 | ``` 26 | conda config --add channels conda-forge 27 | conda create -n coq coq-jupyter 28 | conda activate coq 29 | ``` 30 | ### Anacondaを使わずにインストールしたい場合 31 | 32 | 次の資料を参考にしてください。 33 | 34 | #### 「macOSにbrewでcoq_jupyterをインストールする」  http://bit.ly/33vHeX3 35 | 36 | ## Windowsの場合 37 | 38 | Windowsの場合には、WSLを使って Coqとcoq-jupyter をインストールします。 39 | 40 | 次の資料を参考にしてください。 41 | 42 | #### 「WSLにcoq-jupyterをインストールする」 http://bit.ly/33nw8TB 43 | 44 | 平原さん、情報提供ありがとうございました! -------------------------------------------------------------------------------- /.ipynb_checkpoints/Logic-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# 論理式の証明" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "coq_kernel_metadata": { 18 | "auto_roll_back": true 19 | } 20 | }, 21 | "source": [ 22 | "## 演習問題\n", 23 | "#### 演習問題 1-1 \n", 24 | "\n", 25 | "次の定理を証明せよ。\n", 26 | " Theorem my_first_proof : (forall A : Prop, A -> A).\n", 27 | "
\n", 28 | "[作業用ページで証明をして見る](./samples/work/ex01.ipynb) / [ヒントを見る](./samples/hints/ex01.ipynb ) / [解答を見る](./samples/answers/ex01.ipynb) / [演習問題に戻る](../../Logic-Ex.ipynb ) " 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": null, 34 | "metadata": { 35 | "collapsed": true, 36 | "coq_kernel_metadata": { 37 | "auto_roll_back": true 38 | } 39 | }, 40 | "outputs": [], 41 | "source": [] 42 | } 43 | ], 44 | "metadata": { 45 | "kernelspec": { 46 | "display_name": "Coq", 47 | "language": "coq", 48 | "name": "coq" 49 | }, 50 | "language_info": { 51 | "file_extension": ".v", 52 | "mimetype": "text/x-coq", 53 | "name": "coq", 54 | "version": "8.9.1" 55 | } 56 | }, 57 | "nbformat": 4, 58 | "nbformat_minor": 2 59 | } 60 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/1−Logic-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# 論理式の証明" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": null, 17 | "metadata": { 18 | "collapsed": true, 19 | "coq_kernel_metadata": { 20 | "auto_roll_back": true 21 | } 22 | }, 23 | "outputs": [], 24 | "source": [] 25 | }, 26 | { 27 | "cell_type": "markdown", 28 | "metadata": { 29 | "coq_kernel_metadata": { 30 | "auto_roll_back": true 31 | } 32 | }, 33 | "source": [ 34 | "## 演習問題\n", 35 | "\n", 36 | "#### 演習問題 1-1 \n", 37 | "次の定理を証明せよ。\n", 38 | " Theorem my_first_proof : (forall A : Prop, A -> A).\n", 39 | "
\n", 40 | "[作業用ページで証明をして見る](./samples/work/ex01.ipynb) / [ヒントを見る](./samples/hints/ex01.ipynb ) / [解答を見る](./samples/answers/ex01.ipynb) " 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": null, 46 | "metadata": { 47 | "collapsed": true, 48 | "coq_kernel_metadata": { 49 | "auto_roll_back": true 50 | } 51 | }, 52 | "outputs": [], 53 | "source": [] 54 | } 55 | ], 56 | "metadata": { 57 | "kernelspec": { 58 | "display_name": "Coq", 59 | "language": "coq", 60 | "name": "coq" 61 | }, 62 | "language_info": { 63 | "file_extension": ".v", 64 | "mimetype": "text/x-coq", 65 | "name": "coq", 66 | "version": "8.9.1" 67 | } 68 | }, 69 | "nbformat": 4, 70 | "nbformat_minor": 2 71 | } 72 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Equal−Ex-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# 等式の証明 演習問題" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "coq_kernel_metadata": { 18 | "auto_roll_back": true 19 | } 20 | }, 21 | "source": [ 22 | "## 演習問題 2-1\n", 23 | " 次の定理を証明せよ。\n", 24 | " Theorem plus_O_n : (forall n : nat , 0+n = n ).\n", 25 | "
\n", 26 | "[作業用ページで証明をして見る](./samples/work/ex10.ipynb) / [ヒントを見る](./samples/hints/ex10.ipynb ) / [解答を見る](./samples/answers/ex10.ipynb) " 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "coq_kernel_metadata": { 33 | "auto_roll_back": true 34 | } 35 | }, 36 | "source": [ 37 | "## 演習問題 2-2\n", 38 | " 次の定理を証明せよ。\n", 39 | " Theorem plus_1_n : (forall n : nat , 1+n = S n ).\n", 40 | "
\n", 41 | "[作業用ページで証明をして見る](./samples/work/ex11.ipynb) / [ヒントを見る](./samples/hints/ex11.ipynb ) / [解答を見る](./samples/answers/ex11.ipynb) " 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": { 47 | "coq_kernel_metadata": { 48 | "auto_roll_back": true 49 | } 50 | }, 51 | "source": [ 52 | "## 演習問題 2-3\n", 53 | " 次の定理を証明せよ。\n", 54 | " Theorem mult_0_n : (forall n : nat , 0 * n = 0 ).\n", 55 | "
\n", 56 | "[作業用ページで証明をして見る](./samples/work/ex12.ipynb) / [ヒントを見る](./samples/hints/ex12.ipynb ) / [解答を見る](./samples/answers/ex12.ipynb) " 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": { 62 | "coq_kernel_metadata": { 63 | "auto_roll_back": true 64 | } 65 | }, 66 | "source": [ 67 | "## 演習問題 2-4\n", 68 | " 次の定理を証明せよ。\n", 69 | " Theorem plus_id_nm : (forall n m : nat , n = m -> n+n = m + m ).\n", 70 | "
\n", 71 | "[作業用ページで証明をして見る](./samples/work/ex13.ipynb) / [ヒントを見る](./samples/hints/ex13.ipynb ) / [解答を見る](./samples/answers/ex13.ipynb) " 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": { 77 | "coq_kernel_metadata": { 78 | "auto_roll_back": true 79 | } 80 | }, 81 | "source": [ 82 | "## 演習問題 2-5\n", 83 | " 次の定理を証明せよ。\n", 84 | " Theorem plus_id : (forall n m o : nat , n = m -> m = o -> n + m = m + o ).\n", 85 | "
\n", 86 | "[作業用ページで証明をして見る](./samples/work/ex14.ipynb) / [ヒントを見る](./samples/hints/ex14.ipynb ) / [解答を見る](./samples/answers/ex14.ipynb) " 87 | ] 88 | }, 89 | { 90 | "cell_type": "markdown", 91 | "metadata": { 92 | "coq_kernel_metadata": { 93 | "auto_roll_back": true 94 | } 95 | }, 96 | "source": [ 97 | "## 演習問題 2-6\n", 98 | " 次の定理を証明せよ。\n", 99 | " Theorem mult_0_plus : (forall n m : nat , ( 0 + n ) \\* m = n \\* m ).\n", 100 | "
\n", 101 | "[作業用ページで証明をして見る](./samples/work/ex15.ipynb) / [ヒントを見る](./samples/hints/ex15.ipynb ) / [解答を見る](./samples/answers/ex15.ipynb) " 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": { 107 | "coq_kernel_metadata": { 108 | "auto_roll_back": true 109 | } 110 | }, 111 | "source": [ 112 | "## 演習問題 2-7\n", 113 | " 次の定理を証明せよ。\n", 114 | " Theorem mult_S_1 : (forall n m : nat, m = S n -> m \\* (1 + n) = m \\* m).\n", 115 | "
\n", 116 | "[作業用ページで証明をして見る](./samples/work/ex16.ipynb) / [ヒントを見る](./samples/hints/ex16.ipynb ) / [解答を見る](./samples/answers/ex16.ipynb) " 117 | ] 118 | } 119 | ], 120 | "metadata": { 121 | "kernelspec": { 122 | "display_name": "Coq", 123 | "language": "coq", 124 | "name": "coq" 125 | }, 126 | "language_info": { 127 | "file_extension": ".v", 128 | "mimetype": "text/x-coq", 129 | "name": "coq", 130 | "version": "8.9.1" 131 | } 132 | }, 133 | "nbformat": 4, 134 | "nbformat_minor": 2 135 | } 136 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Equal-Ex-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# 演習問題 2\n", 12 | "\n", 13 | "[演習問題 2-1](./Equal-Ex.ipynb#ex21) [演習問題 2-2](./Equal-Ex.ipynb#ex22) [演習問題 2-3](./Equal-Ex.ipynb#ex23) [演習問題 2-4](./Equal-Ex.ipynb#ex24) [演習問題 2-5](./Equal-Ex.ipynb#ex25) [演習問題 2-6](./Equal-Ex.ipynb#ex26) [演習問題 2-7](./Equal-Ex.ipynb#ex27) " 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "coq_kernel_metadata": { 20 | "auto_roll_back": true 21 | } 22 | }, 23 | "source": [ 24 | "\n", 25 | "## 演習問題 2-1\n", 26 | " 次の定理を証明せよ。\n", 27 | "
 Theorem plus_O_n : (forall n : nat , 0+n = n ).
\n", 28 | "\n", 29 | "#### [作業用ページで証明をしてみる](./Equal-Ex-Work.ipynb#ex21) / [解答を見る](./Equal-Ex-Answer.ipynb#ex21) \n", 30 | "### ヒント\n", 31 | "- 冒頭の forall を intros で削除する。\n", 32 | "- A -> A の最初のAを intros で仮説に入れる。\n", 33 | "- そうすると、サブゴールが仮説の一つと一致していることがわかるので、assumption または、exact を使う。" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": { 39 | "coq_kernel_metadata": { 40 | "auto_roll_back": true 41 | } 42 | }, 43 | "source": [ 44 | "\n", 45 | "## 演習問題 2-2\n", 46 | " 次の定理を証明せよ。\n", 47 | "
Theorem plus_1_n : (forall n : nat , 1+n = S n ).
\n", 48 | "\n", 49 | "#### [作業用ページで証明をしてみる](./Equal-Ex-Work.ipynb#ex22) / [解答を見る](./Equal-Ex-Answer.ipynb#ex22) \n", 50 | "### ヒント\n", 51 | "- intros で forall を削除する。\n", 52 | "- simpl. で、サブゴールの計算式を簡単にする。\n", 53 | "- 左項と右項が等しかったら reflexivity を使う。" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": { 59 | "coq_kernel_metadata": { 60 | "auto_roll_back": true 61 | } 62 | }, 63 | "source": [ 64 | "\n", 65 | "## 演習問題 2-3\n", 66 | " 次の定理を証明せよ。\n", 67 | "
Theorem mult_0_n : (forall n : nat , 0 * n = 0 ).
\n", 68 | "\n", 69 | "#### [作業用ページで証明をしてみる](./Equal-Ex-Work.ipynb#ex23) / [解答を見る](./Equal-Ex-Answer.ipynb#ex23) \n", 70 | "### ヒント\n", 71 | "- intros で forall を削除する。\n", 72 | "- simpl. で、サブゴールの計算式を簡単にする。\n", 73 | "- 左項と右項が等しかったら reflexivity を使う。" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": { 79 | "coq_kernel_metadata": { 80 | "auto_roll_back": true 81 | } 82 | }, 83 | "source": [ 84 | "\n", 85 | "## 演習問題 2-4\n", 86 | " 次の定理を証明せよ。\n", 87 | "
Theorem plus_id_nm : (forall n m : nat , n = m -> n+n = m + m ).
\n", 88 | "\n", 89 | "#### [作業用ページで証明をしてみる](./Equal-Ex-Work.ipynb#ex24) / [解答を見る](./Equal-Ex-Answer.ipynb#ex24) \n", 90 | "### ヒント\n", 91 | "- intros で forall を消す。\n", 92 | "- サブゴールの前提部分を intros で仮定に移す。\n", 93 | "- サブゴールの左項を、等式Hを使って rewriite で書き換える。\n", 94 | "- サブゴールの左項と右項が等しいので、reflexivity を使う。" 95 | ] 96 | }, 97 | { 98 | "cell_type": "markdown", 99 | "metadata": { 100 | "coq_kernel_metadata": { 101 | "auto_roll_back": true 102 | } 103 | }, 104 | "source": [ 105 | "\n", 106 | "## 演習問題 2-5\n", 107 | " 次の定理を証明せよ。\n", 108 | "
Theorem plus_id : (forall n m o : nat , n = m -> m = o -> n + m = m + o ).
\n", 109 | "\n", 110 | "#### [作業用ページで証明をしてみる](./Equal-Ex-Work.ipynb#ex25) / [解答を見る](./Equal-Ex-Answer.ipynb#ex25) \n", 111 | "### ヒント\n", 112 | "- intros で forall を削除 \n", 113 | "- intoros で、前提部分を仮説に移す。\n", 114 | "- 等式 n_eq_m の左辺 を使って、rewriteでサブゴールを書き換える。\n", 115 | "- 等式 m_eq_o の右辺を使って、rewriteでサブゴールのを書き換える。\n", 116 | "- サブゴールの等式の左辺と右辺が等しくなるので reflexivity を使う。" 117 | ] 118 | }, 119 | { 120 | "cell_type": "markdown", 121 | "metadata": { 122 | "coq_kernel_metadata": { 123 | "auto_roll_back": true 124 | } 125 | }, 126 | "source": [ 127 | "\n", 128 | "## 演習問題 2-6\n", 129 | " 次の定理を証明せよ。\n", 130 | "
Theorem mult_0_plus : (forall n m : nat , ( 0 + n ) \\* m = n \\* m ).
\n", 131 | "\n", 132 | "#### [作業用ページで証明をしてみる](./Equal-Ex-Work.ipynb#ex26) / [解答を見る](./Equal-Ex-Answer.ipynb#ex26) \n", 133 | "### ヒント\n", 134 | "- intros で forall を消す。\n", 135 | "- simpl. で、サブゴール中の計算式を簡単なものにする。\n", 136 | "- 左辺と右辺が等しいので、reflexivity を使う。" 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": { 142 | "coq_kernel_metadata": { 143 | "auto_roll_back": true 144 | } 145 | }, 146 | "source": [ 147 | "\n", 148 | "## 演習問題 2-7\n", 149 | " 次の定理を証明せよ。\n", 150 | "
Theorem mult_S_1 : (forall n m : nat, m = S n -> m \\* (1 + n) = m \\* m).
\n", 151 | "\n", 152 | "#### [作業用ページで証明をしてみる](./Equal-Ex-Work.ipynb#ex27) / [解答を見る](./Equal-Ex-Answer.ipynb#ex27) \n", 153 | "### ヒント\n", 154 | "- intros で forall を消し、前提を仮説に移す。\n", 155 | "- サブゴールの計算式を simpl で簡単にする。\n", 156 | "- rewriteで、サブゴールを m_eq_Sn を使って書き換える。\n", 157 | "- サブゴールの左辺と右辺は等しい。" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": null, 163 | "metadata": { 164 | "coq_kernel_metadata": { 165 | "auto_roll_back": true 166 | } 167 | }, 168 | "outputs": [], 169 | "source": [] 170 | } 171 | ], 172 | "metadata": { 173 | "kernelspec": { 174 | "display_name": "Coq", 175 | "language": "coq", 176 | "name": "coq" 177 | }, 178 | "language_info": { 179 | "file_extension": ".v", 180 | "mimetype": "text/x-coq", 181 | "name": "coq", 182 | "version": "8.9.1" 183 | } 184 | }, 185 | "nbformat": 4, 186 | "nbformat_minor": 2 187 | } 188 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Induction-Ex-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# 演習問題 3\n", 12 | "\n", 13 | "[演習問題 3-1](./Induction-Ex.ipynb#ex11) [演習問題 3-2](./Induction-Ex.ipynb#ex12) [演習問題 3-3](./Induction-Ex.ipynb#ex13) [演習問題 3-4](./Induction-Ex.ipynb#ex14) [演習問題 3-5](./Induction-Ex.ipynb#ex15) [演習問題 3-6](./Induction-Ex.ipynb#ex16) [演習問題 3-7](./Induction-Ex.ipynb#ex17) [演習問題 3-8](./Induction-Ex.ipynb#ex18) " 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "coq_kernel_metadata": { 20 | "auto_roll_back": true 21 | } 22 | }, 23 | "source": [ 24 | "\n", 25 | "## 演習問題 3-1\n", 26 | " 次の定理を証明せよ。\n", 27 | "
 Theorem plus_n_O : (forall n : nat, n + 0 = n).
\n", 28 | "\n", 29 | "[作業用ページで証明をしてみる](./Induction-Ex-Work.ipynb#ex31)\n", 30 | "\n", 31 | "### ヒント\n", 32 | "- intros で forall の削除 \n", 33 | "- tactic induction n を使って、nについての帰納法を利用する。\n", 34 | "- サブゴールは、n=0の場合とそうでない場合の、二つに分かれる。\n", 35 | "- 一つ目のサブゴールについて。simplで簡単な形にする。\n", 36 | "- 一つ目のサブゴールについて。reflexivityを使う。\n", 37 | "- 一つ目のゴールは消える。\n", 38 | "- IHn の左項を使って、サブゴールを rewrite で書き換える。\n", 39 | "- 左項と右項が等しいので、reflexivityを使う。\n", 40 | "\n", 41 | "### [解答を見る](./Induction-Ex-Answer.ipynb#ex31) " 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": { 47 | "coq_kernel_metadata": { 48 | "auto_roll_back": true 49 | } 50 | }, 51 | "source": [ 52 | "\n", 53 | "## 演習問題 3-2\n", 54 | " 次の定理を証明せよ。\n", 55 | "
 Theorem minus_diag : (forall n : nat, minus n n = 0).
\n", 56 | "\n", 57 | "[作業用ページで証明をしてみる](./Induction-Ex-Work.ipynb#ex32)\n", 58 | "\n", 59 | "### ヒント\n", 60 | "- ntros でforall を消す。\n", 61 | "- induction n で、nについての minus の帰納法の定義を使う。\n", 62 | "- 最初のサブゴールを simpl で簡単な形にする。\n", 63 | "- reflexivityで、最初のサブゴールは消える。\n", 64 | "- simpl で残りのサブゴールを簡単な形にする。\n", 65 | "- 仮定の一つが、サブゴールと一致している。\n", 66 | "\n", 67 | "### [解答を見る](./Induction-Ex-Answer.ipynb#ex32) " 68 | ] 69 | }, 70 | { 71 | "cell_type": "markdown", 72 | "metadata": { 73 | "coq_kernel_metadata": { 74 | "auto_roll_back": true 75 | } 76 | }, 77 | "source": [ 78 | "\n", 79 | "## 演習問題 3-3\n", 80 | " 次の定理を証明せよ。\n", 81 | "
 Theorem mult_0_r : (forall n : nat, n * 0 = 0).
\n", 82 | "\n", 83 | "[作業用ページで証明をしてみる](./Induction-Ex-Work.ipynb#ex33)\n", 84 | "\n", 85 | "### ヒント\n", 86 | "\n", 87 | "\n", 88 | "### [解答を見る](./Induction-Ex-Answer.ipynb#ex33) " 89 | ] 90 | }, 91 | { 92 | "cell_type": "markdown", 93 | "metadata": { 94 | "coq_kernel_metadata": { 95 | "auto_roll_back": true 96 | } 97 | }, 98 | "source": [ 99 | "\n", 100 | "## 演習問題 3-4\n", 101 | " 次の定理を証明せよ。\n", 102 | "
 Theorem plus_n_Sm : (forall n m : nat, S (n + m) = n + (S m) ).
\n", 103 | "\n", 104 | "[作業用ページで証明をしてみる](./Induction-Ex-Work.ipynb#ex34)\n", 105 | "\n", 106 | "### ヒント\n", 107 | "\n", 108 | "\n", 109 | "### [解答を見る](./Induction-Ex-Answer.ipynb#ex34) " 110 | ] 111 | }, 112 | { 113 | "cell_type": "markdown", 114 | "metadata": { 115 | "coq_kernel_metadata": { 116 | "auto_roll_back": true 117 | } 118 | }, 119 | "source": [ 120 | "\n", 121 | "## 演習問題 3-5\n", 122 | " 次の定理を証明せよ。\n", 123 | "
 Theorem plus_comm : (forall n m : nat, n + m = m + n ).
\n", 124 | "\n", 125 | "[作業用ページで証明をしてみる](./Induction-Ex-Work.ipynb#ex35)\n", 126 | "\n", 127 | "### ヒント\n", 128 | "\n", 129 | "\n", 130 | "### [解答を見る](./Induction-Ex-Answer.ipynb#ex35) " 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": { 136 | "coq_kernel_metadata": { 137 | "auto_roll_back": true 138 | } 139 | }, 140 | "source": [ 141 | "\n", 142 | "## 演習問題 3-6\n", 143 | " 次の定理を証明せよ。\n", 144 | "
 Theorem plus_assoc : (forall n m o : nat, n + (m +o) = (n + m) + o ).
\n", 145 | "\n", 146 | "[作業用ページで証明をしてみる](./Induction-Ex-Work.ipynb#ex36)\n", 147 | "\n", 148 | "### ヒント\n", 149 | "\n", 150 | "\n", 151 | "### [解答を見る](./Induction-Ex-Answer.ipynb#ex36) " 152 | ] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": { 157 | "coq_kernel_metadata": { 158 | "auto_roll_back": true 159 | } 160 | }, 161 | "source": [ 162 | "\n", 163 | "## 演習問題 3-7\n", 164 | " 次の定理を証明せよ。\n", 165 | "
 Theorem mul_succ_r : forall n m : nat, n \\* S m = n \\* m + n ).
\n", 166 | "\n", 167 | "[作業用ページで証明をしてみる](./Induction-Ex-Work.ipynb#ex37)\n", 168 | "\n", 169 | "### ヒント\n", 170 | "\n", 171 | "\n", 172 | "### [解答を見る](./Induction-Ex-Answer.ipynb#ex37) " 173 | ] 174 | }, 175 | { 176 | "cell_type": "markdown", 177 | "metadata": { 178 | "coq_kernel_metadata": { 179 | "auto_roll_back": true 180 | } 181 | }, 182 | "source": [ 183 | "\n", 184 | "## 演習問題 3-8\n", 185 | " 次の定理を証明せよ。\n", 186 | "
 Theorem mult_comm : (forall n m : nat, n \\* m = m \\* n ).
\n", 187 | "\n", 188 | "[作業用ページで証明をしてみる](./Induction-Ex-Work.ipynb#ex38)\n", 189 | "\n", 190 | "### ヒント\n", 191 | "\n", 192 | "\n", 193 | "### [解答を見る](./Induction-Ex-Answer.ipynb#ex38) " 194 | ] 195 | } 196 | ], 197 | "metadata": { 198 | "kernelspec": { 199 | "display_name": "Coq", 200 | "language": "coq", 201 | "name": "coq" 202 | }, 203 | "language_info": { 204 | "file_extension": ".v", 205 | "mimetype": "text/x-coq", 206 | "name": "coq", 207 | "version": "8.9.1" 208 | } 209 | }, 210 | "nbformat": 4, 211 | "nbformat_minor": 2 212 | } 213 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Logic-Ex-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# 演習問題 1\n", 12 | "\n", 13 | "[演習問題 1-1](./Logic-Ex.ipynb#ex11) [演習問題 1-2](./Logic-Ex.ipynb#ex12) [演習問題 1-3](./Logic-Ex.ipynb#ex13) [演習問題 1-4](./Logic-Ex.ipynb#ex14) [演習問題 1-5](./Logic-Ex.ipynb#ex15) [演習問題 1-6](./Logic-Ex.ipynb#ex16) [演習問題 1-7](./Logic-Ex.ipynb#ex17) [演習問題 1-8](./Logic-Ex.ipynb#ex18) [演習問題 1-9](./Logic-Ex.ipynb#ex19) " 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "coq_kernel_metadata": { 20 | "auto_roll_back": true 21 | } 22 | }, 23 | "source": [ 24 | "\n", 25 | "## 演習問題 1-1 \n", 26 | "次の定理を証明せよ。\n", 27 | "
Theorem my_first_proof : (forall A : Prop, A -> A).
\n", 28 | "\n", 29 | "#### [作業用ページで証明をしてみる](./Logic-Ex-Work.ipynb#ex11) / [解答を見る](./Logic-Ex-Answer.ipynb#ex11) \n", 30 | "### ヒント\n", 31 | "- 冒頭の forall を intros で削除する。\n", 32 | "- A -> A の最初のAを intros で仮説に入れる。\n", 33 | "- そうすると、サブゴールが仮説の一つと一致していることがわかるので、assumption または、exact を使う。" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": { 39 | "collapsed": true, 40 | "coq_kernel_metadata": { 41 | "auto_roll_back": true 42 | } 43 | }, 44 | "source": [ 45 | "\n", 46 | "## 演習問題 1-2\n", 47 | "次の定理を証明せよ。\n", 48 | "
Theorem and1 : (forall A B: Prop, A /\\ B -> A).
\n", 49 | "\n", 50 | "#### [作業用ページで証明をしてみる](./Logic-Ex-Work.ipynb#ex12) / [解答を見る](./Logic-Ex-Answer.ipynb#ex12) \n", 51 | "### ヒント\n", 52 | "- intros. で forall を削除し、`A /\\ B -> A` の前提部分の`A /\\ B`を仮説に移す。\n", 53 | "- 仮説中の`A /\\ B`を、destruct で分解する。\n", 54 | "- 仮説の一つがサブゴールに一致している。" 55 | ] 56 | }, 57 | { 58 | "cell_type": "markdown", 59 | "metadata": { 60 | "coq_kernel_metadata": { 61 | "auto_roll_back": true 62 | } 63 | }, 64 | "source": [ 65 | "\n", 66 | "## 演習問題 1-3\n", 67 | "次の定理を証明せよ。\n", 68 | "
Theorem and1 : (forall A B: Prop, A /\\ B -> B).
\n", 69 | "\n", 70 | "#### [作業用ページで証明をしてみる](./Logic-Ex-Work.ipynb#ex13) / [解答を見る](./Logic-Ex-Answer.ipynb#ex13) \n", 71 | "### ヒント\n", 72 | "- intros. で forall を削除し、`A /\\ B -> B` の前提部分の`A /\\ B`を仮説に移す。\n", 73 | "- 仮説中の`A /\\ B`を、destruct で分解する。\n", 74 | "- 仮説の一つがサブゴールに一致している。" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": { 80 | "coq_kernel_metadata": { 81 | "auto_roll_back": true 82 | } 83 | }, 84 | "source": [ 85 | "\n", 86 | "## 演習問題 1-4\n", 87 | "次の定理を証明せよ。\n", 88 | "
Theorem or1 : (forall A B: Prop, A -> A \\\\/ B).
\n", 89 | "\n", 90 | "#### [作業用ページで証明をしてみる](./Logic-Ex-Work.ipynb#ex14) / [解答を見る](./Logic-Ex-Answer.ipynb#ex14) \n", 91 | "### ヒント\n", 92 | "- intros. でforallを消す。\n", 93 | "- left. でAを仮説に取り込む。\n", 94 | "- サブゴールと仮説が一致している。" 95 | ] 96 | }, 97 | { 98 | "cell_type": "markdown", 99 | "metadata": { 100 | "coq_kernel_metadata": { 101 | "auto_roll_back": true 102 | } 103 | }, 104 | "source": [ 105 | "\n", 106 | "## 演習問題 1-5\n", 107 | "次の定理を証明せよ。\n", 108 | "
Theorem or2 : (forall A B: Prop, B -> A \\\\/ B).
\n", 109 | "\n", 110 | "#### [作業用ページで証明をしてみる](./Logic-Ex-Work.ipynb#ex15) / [解答を見る](./Logic-Ex-Answer.ipynb#ex15) \n", 111 | "### ヒント\n", 112 | "- intros. でforallを消す。\n", 113 | "- right. でBを仮説に取り込む。\n", 114 | "- サブゴールと仮説が一致している。" 115 | ] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": { 120 | "coq_kernel_metadata": { 121 | "auto_roll_back": true 122 | } 123 | }, 124 | "source": [ 125 | "\n", 126 | "## 演習問題 1-6\n", 127 | "次の定理を証明せよ。\n", 128 | "
Theorem modus_ponens : (forall A B: Prop, A -> (A -> B) ->B).
\n", 129 | "\n", 130 | "#### [作業用ページで証明をしてみる](./Logic-Ex-Work.ipynb#ex16) / [解答を見る](./Logic-Ex-Answer.ipynb#ex16) \n", 131 | "### ヒント\n", 132 | "- intros. で先頭のforall を削除する。\n", 133 | "- 再び intros で、AとA -> Bを仮説に移す。\n", 134 | "- 仮説A -> Bを仮説(この場合はA)に適用して、サブゴールをBに変える。applyを使う。\n", 135 | "- 仮説とサブゴールが一致する。" 136 | ] 137 | }, 138 | { 139 | "cell_type": "markdown", 140 | "metadata": { 141 | "coq_kernel_metadata": { 142 | "auto_roll_back": true 143 | } 144 | }, 145 | "source": [ 146 | "\n", 147 | "## 演習問題 1-7\n", 148 | "次の定理を証明せよ。\n", 149 | "
Theorem modus_ponens2 : (forall A B C: Prop, A -> (A -> B) ->(B ->C) -> C).
\n", 150 | "\n", 151 | "#### [作業用ページで証明をしてみる](./Logic-Ex-Work.ipynb#ex17) / [解答を見る](./Logic-Ex-Answer.ipynb#ex17) \n", 152 | "### ヒント\n", 153 | "- intros でforallを削除する。\n", 154 | "- intros で、全ての -> の前提部分を仮説に移す。この時、適当なラベルをつけておくと分かりやすくなる。この例の場合なら、intros Proof_of_A A_implies_B B_implies_C とか。\n", 155 | "- apply B_implies_C で、サブゴールをBに変える。\n", 156 | "- apply A_implies_B で、サブゴールをAに変える。\n", 157 | "- 仮説とサブゴールが一致している。" 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": { 163 | "coq_kernel_metadata": { 164 | "auto_roll_back": true 165 | } 166 | }, 167 | "source": [ 168 | "\n", 169 | "## 演習問題 1-8\n", 170 | "次の定理を証明せよ。\n", 171 | "
Theorem and_comm : (forall A B: Prop, A /\\ B -> B /\\ A ).
\n", 172 | "\n", 173 | "#### [作業用ページで証明をしてみる](./Logic-Ex-Work.ipynb#ex18) / [解答を見る](./Logic-Ex-Answer.ipynb#ex18) \n", 174 | "### ヒント\n", 175 | "- intros で、forall を削除し、\"A /\\ B\" にH というラベルをつける 。\n", 176 | "- \"H: A/\\ B\" を destruct で分解し、A, B を仮説に追加する。 \n", 177 | "- サブゴール \"A\\/ B\" を split で、二つのサブゴールに分割する。 \n", 178 | "- 一つ目のサブゴールは仮説の一つと同じなので解ける。サブゴールは一つになる。\n", 179 | "- 残ったサブゴールも仮説の一つと一緒なので、解ける。\n", 180 | "- サブゴールは残っていないので証明終了。" 181 | ] 182 | }, 183 | { 184 | "cell_type": "markdown", 185 | "metadata": { 186 | "coq_kernel_metadata": { 187 | "auto_roll_back": true 188 | } 189 | }, 190 | "source": [ 191 | "\n", 192 | "## 演習問題 1-9\n", 193 | "次の定理を証明せよ。\n", 194 | "
Theorem or_comm : (forall A B: Prop, A \\\\/ B -> B \\\\/ A ) .
\n", 195 | "\n", 196 | "#### [作業用ページで証明をしてみる](./Logic-Ex-Work.ipynb#ex19) / [解答を見る](./Logic-Ex-Answer.ipynb#ex19) \n", 197 | "### ヒント\n", 198 | "- intros で\"A \\/ B\" を仮定に移し、A_or_B というラベルをつける。\n", 199 | "- A\\/B をdestructすると、Aが仮定に残り、サブゴールが二つに分割される。\n", 200 | "- 一つ目のサブゴールから、right でB\\/A の右の項Aをサブゴールに残す。 \n", 201 | "- サブゴールと仮定が一致している。 サブゴールは一つになる。\n", 202 | "- 一つ目のサブゴールから、left でB\\/A の左の項Bをサブゴールに残す。 " 203 | ] 204 | } 205 | ], 206 | "metadata": { 207 | "kernelspec": { 208 | "display_name": "Coq", 209 | "language": "coq", 210 | "name": "coq" 211 | }, 212 | "language_info": { 213 | "file_extension": ".v", 214 | "mimetype": "text/x-coq", 215 | "name": "coq", 216 | "version": "8.9.1" 217 | } 218 | }, 219 | "nbformat": 4, 220 | "nbformat_minor": 2 221 | } 222 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/1_basic-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\"Note: Trusted Notebook\" width=\"700 px\" align=\"center\">" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 第一章 量子情報理論の三つの基本原理 \n", 15 | "\n", 16 | "**本章の内容**     [全体目次](./Contents.ipynb)\n", 17 | "\n", 18 | "- [量子情報理論の三つの基本原理](#postulate )\n", 19 | " - [重ね合わせの原理](#superposition )\n", 20 | " - [観測の原理](#measurement)\n", 21 | " - [ユニタリ発展の原理](#unitary)\n", 22 | " \n", 23 | "- [数学的準備1 ](#math1)\n", 24 | "\n", 25 | "\n", 26 | "### 量子情報理論には、次の三つの基本原理がある。\n", 27 | "\n", 28 | "1. #### 重ね合わせの原理\n", 29 | "1. #### 観測の原理\n", 30 | "1. #### ユニタリ発展の原理\n", 31 | "\n", 32 | "\n", 33 | "## 1. 重ね合わせの原理 \n", 34 | "### qubitの状態は、互いに直交する二つのベクトルの和として、列ベクトルで表される。\n", 35 | "\n", 36 | "### x-y平面との類似で考える\n", 37 | "- それは、x-y平面上の任意の点を表すベクトルが、x軸方向のベクトルとy軸方向のベクトルの和として表されるのと同じである。\n", 38 | "- x-y平面で、二つのx軸方向の長さ1のベクトル(1,0) をx、y軸方向の長さ1のベクトル(0,1)をyとすると、原点から点P(m,n)に向かうベクトルPは、P=mx+ny=m(1,0)+n(0,1) と表すことができる。\n", 39 | "- この時、mをPの「x成分」、nをPの「y成分」という。\n", 40 | "- また、二つの単位ベクトル x(1,0), y(0,1)を、**「基底」ベクトル**と呼ぶ。\n", 41 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 42 | "  " 43 | ] 44 | }, 45 | { 46 | "cell_type": "markdown", 47 | "metadata": {}, 48 | "source": [ 49 | "### qubitの場合の重ね合わせ\n", 50 | "- x-y平面の場合ベクトルの成分は実数だが、qubitの重ね合わせの場合には、その成分は **複素数** となる。qubitの状態は、二つの複素数のペアで定義される。\n", 51 | "- x-y平面の場合、基底 x(1,0), y(0,1)は、行ベクトルとして表現されるが、qubitの基底は、$\\begin{pmatrix} 1 \\\\ 0 \\\\\\end{pmatrix}$ と$\\begin{pmatrix} 0 \\\\ 1 \\\\\\end{pmatrix}$ と、**列ベクトル** で表現される。\n", 52 | "- x-y平面の成分(m,n)を持つ任意のベクトルが、二つの基底ベクトル x(1,0), y(0,1)を用いて、(m,n)=m(1,0)+n(0,1)と表すことができるように、qubitの成分を$\\begin{pmatrix} \\alpha \\\\ \\beta \\\\\\end{pmatrix}$とする時、$\\begin{pmatrix} \\alpha \\\\ \\beta \\\\\\end{pmatrix}= \\alpha \\begin{pmatrix} 1 \\\\ 0 \\\\\\end{pmatrix} + \\beta \\begin{pmatrix} 0 \\\\ 1 \\\\\\end{pmatrix}$と表すことができる。\n", 53 | "- ただし、qubitの成分 $\\alpha, \\beta$は、次の条件を満たす。$|\\alpha|^2+|\\beta|^2=1$\n", 54 | "\n", 55 | "### ket記法\n", 56 | "- Aが列ベクトルの時、それを$|A\\rangle$と表す。これを **ket記法** と呼ぶ。\n", 57 | "- qubitの基底である二つの列ベクトルを、$|0\\rangle, |1\\rangle$と表す。すなわち、$|0\\rangle=\\begin{pmatrix} 1 \\\\ 0 \\\\\\end{pmatrix}, |1\\rangle=\\begin{pmatrix} 0 \\\\ 1 \\\\\\end{pmatrix}$とする。\n", 58 | "- この時、任意のqubitの状態$|\\psi\\rangleは、|\\psi\\rangle=\\alpha |0\\rangle+\\beta|1\\rangle  (ただし|\\alpha|^2+|\\beta|^2=1)$と表される。\n", 59 | "\n", 60 | "### 一般化\n", 61 | "- qubitの状態は、二つの複素数を成分とする列ベクトルで表現されるが、任意の量子状態$|\\psi\\rangle$は、n個の基底$|0\\rangle, |1\\rangle, |2\\rangle, \\cdots, |n-1\\rangle$を持つn個の複素数$\\alpha_0, \\alpha_1, \\alpha_{n-1}$を成分とする列ベクトルで表現される。$|\\psi\\rangle=\\alpha_0|0\\rangle+\\alpha_1|1\\rangle+\\alpha|2\\rangle+ \\cdots + \\alpha_{n-1}|n-1\\rangle$\n", 62 | "- この時、各成分の絶対値の二乗を全て加えた値は、1に等しくなければならない。$|\\alpha_0|^2+|\\alpha_1|^2+|\\alpha|_2|^2+\\cdots + |\\alpha_{n-1}|^2=1$\n", 63 | "\n", 64 | "\"Note: Trusted Notebook\" width=\"600 px\" align=\"left\">" 65 | ] 66 | }, 67 | { 68 | "cell_type": "markdown", 69 | "metadata": {}, 70 | "source": [ 71 | "## 2. 観測の原理 \n", 72 | "### qubitを観測すると、重ね合わせの状態は失われて、古典bit 0か1が観測される\n", 73 | "一般に、n個の基底からなる量子の状態を観測すると、重ね合わせの状態は失われて、その基底の一つが観測される。\n", 74 | "\n", 75 | "### qubit $|\\psi\\rangle=\\alpha |0\\rangle+\\beta|1\\rangle$を観測した時、$|0\\rangle$ (古典bit 0に対応)が観測される確率は$|\\alpha|^2$、$|1\\rangle$ (古典bit 1に対応)が観測される確率は$|\\beta|^2$に等しい\n", 76 | "一般に、先の量子の状態 $|\\psi\\rangle$を観測した時、重ね合わせの状態が失われて、基底$|i\\rangle$が観測される確率は、$|\\alpha_i|^2$に等しい。\n", 77 | "$|\\alpha_0|^2+|\\alpha_1|^2+|\\alpha|_2|^2+\\cdots + |\\alpha_{n-1}|^2=1$という条件は、観測によって、いずれかの基底が観測されるという条件と等しい。\n", 78 | "\n", 79 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 80 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">" 81 | ] 82 | }, 83 | { 84 | "cell_type": "markdown", 85 | "metadata": {}, 86 | "source": [ 87 | "## 3. ユニタリ発展の原理 \n", 88 | "### 量子の状態$|\\psi_0\\rangle$が$|\\psi_1\\rangle$に変化したとする。この時、$|\\psi_1\\rangle=U|\\psi_1\\rangle$となるユニタリ行列$U$が存在する\n", 89 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "\n", 97 | "\n", 98 | "# 数学的準備 1 \n", 99 | "\n", 100 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 101 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 102 | "\n", 103 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 104 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 105 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 106 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 107 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 108 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 109 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n", 110 | "\"Note: Trusted Notebook\" width=\"550 px\" align=\"left\">\n" 111 | ] 112 | }, 113 | { 114 | "cell_type": "markdown", 115 | "metadata": {}, 116 | "source": [ 117 | "\n", 118 | "###         [前の章へ](./0_index.ipynb) [全体目次](./Contents.ipynb)  [次の章へ](./2_circuit.ipynb)" 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": null, 124 | "metadata": {}, 125 | "outputs": [], 126 | "source": [] 127 | } 128 | ], 129 | "metadata": { 130 | "anaconda-cloud": {}, 131 | "kernelspec": { 132 | "display_name": "Python 3", 133 | "language": "python", 134 | "name": "python3" 135 | }, 136 | "language_info": { 137 | "codemirror_mode": { 138 | "name": "ipython", 139 | "version": 3 140 | }, 141 | "file_extension": ".py", 142 | "mimetype": "text/x-python", 143 | "name": "python", 144 | "nbconvert_exporter": "python", 145 | "pygments_lexer": "ipython3", 146 | "version": "3.6.8" 147 | } 148 | }, 149 | "nbformat": 4, 150 | "nbformat_minor": 1 151 | } 152 | -------------------------------------------------------------------------------- /0-Contents.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "coq_kernel_metadata": { 18 | "auto_roll_back": true 19 | } 20 | }, 21 | "source": [ 22 | "# 目次 " 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": { 28 | "coq_kernel_metadata": { 29 | "auto_roll_back": true 30 | } 31 | }, 32 | "source": [ 33 | "# [Hello Coq!](./0-Introduction.ipynb)\n", 34 | "\n", 35 | "- [Coqとのはじめての対話](./0-Introduction.ipynb#sec1)\n", 36 | "- [Coqとのはじめての対話をふりかえる。](./0-Introduction.ipynb#sec2)\n", 37 | " - [人間は、Coqに何を伝えたか?](./0-Introduction.ipynb#sec21)\n", 38 | " - [Coqは、反応として人間に何を伝えたか?](./0-Introduction.ipynb#sec22)\n", 39 | "\n" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": { 45 | "coq_kernel_metadata": { 46 | "auto_roll_back": true 47 | } 48 | }, 49 | "source": [ 50 | "# [論理式の証明](./1-Logic.ipynb)\n", 51 | "- [論理式はどのような形をしているか?](./1-Logic.ipynb#sec1)\n", 52 | " - [命題の構成ルール -- Formation Rule](./1-Logic.ipynb#sec11)\n", 53 | " - [命題の分解ルール -- 部分式への分解](./1-Logic.ipynb#sec12)\n", 54 | " - [証明のサブゴールと命題の部分式](./1-Logic.ipynb#sec13)\n", 55 | "- [Coqが返す「証明の状態」が持つ情報](./1-Logic.ipynb#sec2)\n", 56 | " - [「証明の状態」=「仮説部分」+「サブゴール」](./1-Logic.ipynb#sec21)\n", 57 | " - [証明が進むと「仮説部分」も「サブゴール」も部分式に置き換わります](./1-Logic.ipynb#sec22)\n", 58 | "- [tacticの選択](./1-Logic.ipynb#sec3)\n", 59 | " - [サブゴールの論理式の形で、選択すべきtactic](./1-Logic.ipynb#sec31)\n", 60 | " - [仮説部の論理式の形で、選択すべきtactic](./1-Logic.ipynb#sec32)\n", 61 | " - [仮説部の論理式の一つとサブゴールが一致する時](./1-Logic.ipynb#sec33)\n", 62 | "- [論理式の証明で利用できるtacticsの働きを見る](./1-Logic.ipynb#sec4)\n", 63 | " - [intros](./1-Logic.ipynb#sec41)\n", 64 | " - [introsの もう一つの使い方](./1-Logic.ipynb#sec42)\n", 65 | " - [split](./1-Logic.ipynb#sec43)\n", 66 | " - [left または right](./1-Logic.ipynb#sec44)\n", 67 | " - [destruct](./1-Logic.ipynb#sec45)\n", 68 | " - [apply](./1-Logic.ipynb#sec46)\n", 69 | " - [exact](./1-Logic.ipynb#sec47)\n", 70 | " - [assumption](./1-Logic.ipynb#sec48)\n", 71 | " - [trivial](./1-Logic.ipynb#sec49)\n", 72 | "- [論理式の証明の自動化 tauto](./1-Logic.ipynb#sec5)\n", 73 | " - [tautoで証明できる命題](./1-Logic.ipynb#sec51)\n", 74 | " - [tautoで証明できない命題](./1-Logic.ipynb#sec52)\n", 75 | "\n" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": { 81 | "coq_kernel_metadata": { 82 | "auto_roll_back": true 83 | } 84 | }, 85 | "source": [ 86 | "# [演習問題 1](./1-logic-answer.ipynb)\n", 87 | "- [演習問題 1-1](./1-logic-answer.ipynb#ex11) [解答](./1-logic-answer.ipynb#ans11)  A -> A\n", 88 | "- [演習問題 1-2](./1-logic-answer.ipynb#ex12) [解答](./1-logic-answer.ipynb#ans12)  A /\\ B -> A\n", 89 | "- [演習問題 1-3](./1-logic-answer.ipynb#ex13) [解答](./1-logic-answer.ipynb#ans13)  A /\\ B -> B\n", 90 | "- [演習問題 1-4](./1-logic-answer.ipynb#ex14) [解答](./1-logic-answer.ipynb#ans14)  A -> A \\\\/ B\n", 91 | "- [演習問題 1-5](./1-logic-answer.ipynb#ex15) [解答](./1-logic-answer.ipynb#ans15)  B -> A \\\\/ B\n", 92 | "- [演習問題 1-6](./1-logic-answer.ipynb#ex16) [解答](./1-logic-answer.ipynb#ans16)  A -> (A -> B) -> B\n", 93 | "- [演習問題 1-7](./1-logic-answer.ipynb#ex17) [解答](./1-logic-answer.ipynb#ans17)  A -> (A -> B) -> (B ->C) -> C\n", 94 | "- [演習問題 1-8](./1-logic-answer.ipynb#ex18) [解答](./1-logic-answer.ipynb#ans18)  A /\\ B -> B /\\ A\n", 95 | "- [演習問題 1-9](./1-logic-answer.ipynb#ex19) [解答](./1-logic-answer.ipynb#ans19)  A \\\\/ B -> B \\\\/ A\n", 96 | "\n" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": { 102 | "coq_kernel_metadata": { 103 | "auto_roll_back": true 104 | } 105 | }, 106 | "source": [ 107 | "# [関数と等式を含んだ命題の証明](./2-Equality.ipynb)\n", 108 | "- [Coqでの関数と等式を含んだ命題の証明](./2-Equality.ipynb#sec1)\n", 109 | "- [等式の性質](./2-Equality.ipynb#sec2)\n", 110 | " - [Coqでの等式の証明の戦略](./2-Equality.ipynb#sec21)\n", 111 | "- [Coqでの関数](./2-Equality.ipynb#sec3)\n", 112 | " - [Coqでの関数の定義](./2-Equality.ipynb#sec31)\n", 113 | " - [Coqでの関数の型](./2-Equality.ipynb#sec32)\n", 114 | "- [簡単な関数の例](./2-Equality.ipynb#sec4)\n", 115 | " - [関数 negb: 引数に与えられたブール値の否定を返す関数](./2-Equality.ipynb#sec41)\n", 116 | " - [関数 eqb  引数に与えられた二つのブール値が等しいかを返す関数](./2-Equality.ipynb#sec42)\n", 117 | "- [再帰的な関数定義の例](./2-Equality.ipynb#sec5)\n", 118 | " - [二つの自然数の和を返す関数 plus](./2-Equality.ipynb#sec51)\n", 119 | " - [二つの自然数の積を返す関数 mult](./2-Equality.ipynb#sec52)\n", 120 | "- [等式を含む命題の証明で利用できるtacticsについて](./2-Equality.ipynb#sec6)\n", 121 | "- [reflexivity tactics](./2-Equality.ipynb#sec605)\n", 122 | "- [simpl tactic](./2-Equality.ipynb#sec7)\n", 123 | " - [1 + n = S n で式を単純にする](./2-Equality.ipynb#sec71)\n", 124 | " - [0 + n = n で式を単純にする](./2-Equality.ipynb#sec72)\n", 125 | " - [0 * n = 0 で式を単純にする](./2-Equality.ipynb#sec73)\n", 126 | "- [rewrite tactic](./2-Equality.ipynb#sec8)\n", 127 | " - [rewrite -> H の例](./2-Equality.ipynb#sec81)\n", 128 | " - [もう一つ rewrite -> H の例](./2-Equality.ipynb#sec82)\n", 129 | " - [rewrite <- H の例](./2-Equality.ipynb#sec83)\n", 130 | " " 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": { 136 | "coq_kernel_metadata": { 137 | "auto_roll_back": true 138 | } 139 | }, 140 | "source": [ 141 | "# [演習問題 2](./2-equality-answer.ipynb)\n", 142 | "- [演習問題 2-1](./2-equality-answer.ipynb#ex21) [解答](./2-equality-answer.ipynb#ans21)  0 + n = n\n", 143 | "- [演習問題 2-2](./2-equality-answer.ipynb#ex22) [解答](./2-equality-answer.ipynb#ans22)  1 + n = S n\n", 144 | "- [演習問題 2-3](./2-equality-answer.ipynb#ex23) [解答](./2-equality-answer.ipynb#ans23)  0 * n = 0\n", 145 | "- [演習問題 2-4](./2-equality-answer.ipynb#ex24) [解答](./2-equality-answer.ipynb#ans24)  n = m -> n+n = m + m\n", 146 | "- [演習問題 2-5](./2-equality-answer.ipynb#ex25) [解答](./2-equality-answer.ipynb#ans25)  n = m -> m = o -> n + m = m + o\n", 147 | "- [演習問題 2-6](./2-equality-answer.ipynb#ex26) [解答](./2-equality-answer.ipynb#ans26)  ( 0 + n ) * m = n * m\n", 148 | "- [演習問題 2-7](./2-equality-answer.ipynb#ex27) [解答](./2-equality-answer.ipynb#ans27)  m = S n -> m * (1 + n) = m * m" 149 | ] 150 | }, 151 | { 152 | "cell_type": "markdown", 153 | "metadata": { 154 | "coq_kernel_metadata": { 155 | "auto_roll_back": true 156 | } 157 | }, 158 | "source": [ 159 | "# [帰納的データ型と帰納法を用いた証明](./3-Induction.ipynb)\n", 160 | "- [Coq での「型」について](./3-Induction.ipynb#sec1)\n", 161 | "- [列挙によるデータ型の定義](./3-Induction.ipynb#sec2)\n", 162 | " - [型 bool ](./3-Induction.ipynb#sec21)\n", 163 | " - [型 rgb](./3-Induction.ipynb#sec22)\n", 164 | " - [定義済みの型から、新しい型を定義する](./3-Induction.ipynb#sec23)\n", 165 | "- [帰納的データ型](./3-Induction.ipynb#sec3)\n", 166 | " - [Coqでの自然数の定義](./3-Induction.ipynb#sec31)\n", 167 | "- [t : T という表記の意味](./3-Induction.ipynb#sec32)\n", 168 | "- [帰納法を使った命題の証明](./3-Induction.ipynb#sec4)\n", 169 | " - [数学的帰納法について](./3-Induction.ipynb#sec41)\n", 170 | " - [帰納法を使った証明の例 1: n + 0 = n](./3-Induction.ipynb#sec42)\n", 171 | " - [帰納法を使った証明の例 2: S (n + m) = n + (S m)](./3-Induction.ipynb#sec43)\n", 172 | "- [帰納法を使う場合の証明の流れ](./3-Induction.ipynb#sec5)\n", 173 | " - [tactic induction](./3-Induction.ipynb#sec51)\n", 174 | " - [induction nを用いた証明の留意点](./3-Induction.ipynb#sec52)\n", 175 | "- [Coqのライブラリーの利用](./3-Induction.ipynb#sec6)\n", 176 | " - [Coqでは、多数の証明済みの命題がライブラリーとして提供されています。](./3-Induction.ipynb#sec61)\n", 177 | " - [Coq ライブラリーを利用した証明の例 : n * m = m * n](./3-Induction.ipynb#sec62)\n", 178 | "\n" 179 | ] 180 | }, 181 | { 182 | "cell_type": "markdown", 183 | "metadata": { 184 | "coq_kernel_metadata": { 185 | "auto_roll_back": true 186 | } 187 | }, 188 | "source": [ 189 | "# [演習問題 3](./3-induction-answer.ipynb)\n", 190 | "- [演習問題 3-1](./3-induction-answer.ipynb#ex31) [解答](./3-induction-answer.ipynb#ans31)  n + 0 = n\n", 191 | "- [演習問題 3-2](./3-induction-answer.ipynb#ex32) [解答](./3-induction-answer.ipynb#ans32)  minus n n = 0\n", 192 | "- [演習問題 3-3](./3-induction-answer.ipynb#ex33) [解答](./3-induction-answer.ipynb#ans33)  n * 0 = 0\n", 193 | "- [演習問題 3-4](./3-induction-answer.ipynb#ex34) [解答](./3-induction-answer.ipynb#ans34)  S (n + m) = n + (S m)\n", 194 | "- [演習問題 3-5](./3-induction-answer.ipynb#ex35) [解答](./3-induction-answer.ipynb#ans35)  n + m = m + n\n", 195 | "- [演習問題 3-6](./3-induction-answer.ipynb#ex36) [解答](./3-induction-answer.ipynb#ans36)  n + (m +o) = (n + m) + o \n", 196 | "- [演習問題 3-7](./3-induction-answer.ipynb#ex37) [解答](./3-induction-answer.ipynb#ans37)  n * S m = n * m + n\n", 197 | "- [演習問題 3-8](./3-induction-answer.ipynb#ex38) [解答](./3-induction-answer.ipynb#ans38)  n * m = m * n\n" 198 | ] 199 | } 200 | ], 201 | "metadata": { 202 | "kernelspec": { 203 | "display_name": "Coq", 204 | "language": "coq", 205 | "name": "coq" 206 | }, 207 | "language_info": { 208 | "file_extension": ".v", 209 | "mimetype": "text/x-coq", 210 | "name": "coq", 211 | "version": "8.9.1" 212 | } 213 | }, 214 | "nbformat": 4, 215 | "nbformat_minor": 2 216 | } 217 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/0-Contents-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "coq_kernel_metadata": { 18 | "auto_roll_back": true 19 | } 20 | }, 21 | "source": [ 22 | "# 目次 " 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": { 28 | "coq_kernel_metadata": { 29 | "auto_roll_back": true 30 | } 31 | }, 32 | "source": [ 33 | "# [Hello Coq!](./0-Introduction.ipynb)\n", 34 | "\n", 35 | "- [Coqとのはじめての対話](./0-Introduction.ipynb#sec1)\n", 36 | "- [Coqとのはじめての対話をふりかえる。](./0-Introduction.ipynb#sec2)\n", 37 | " - [人間は、Coqに何を伝えたか?](./0-Introduction.ipynb#sec21)\n", 38 | " - [Coqは、反応として人間に何を伝えたか?](./0-Introduction.ipynb#sec22)\n", 39 | "\n" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": { 45 | "coq_kernel_metadata": { 46 | "auto_roll_back": true 47 | } 48 | }, 49 | "source": [ 50 | "# [論理式の証明](./1-Logic.ipynb)\n", 51 | "- [論理式はどのような形をしているか?](./1-Logic.ipynb#sec1)\n", 52 | " - [命題の構成ルール -- Formation Rule](./1-Logic.ipynb#sec11)\n", 53 | " - [命題の分解ルール -- 部分式への分解](./1-Logic.ipynb#sec12)\n", 54 | " - [証明のサブゴールと命題の部分式](./1-Logic.ipynb#sec13)\n", 55 | "- [Coqが返す「証明の状態」が持つ情報](./1-Logic.ipynb#sec2)\n", 56 | " - [「証明の状態」=「仮説部分」+「サブゴール」](./1-Logic.ipynb#sec21)\n", 57 | " - [証明が進むと「仮説部分」も「サブゴール」も部分式に置き換わります](./1-Logic.ipynb#sec22)\n", 58 | "- [tacticの選択](./1-Logic.ipynb#sec3)\n", 59 | " - [サブゴールの論理式の形で、選択すべきtactic](./1-Logic.ipynb#sec31)\n", 60 | " - [仮説部の論理式の形で、選択すべきtactic](./1-Logic.ipynb#sec32)\n", 61 | " - [仮説部の論理式の一つとサブゴールが一致する時](./1-Logic.ipynb#sec33)\n", 62 | "- [論理式の証明で利用できるtacticsの働きを見る](./1-Logic.ipynb#sec4)\n", 63 | " - [intros](./1-Logic.ipynb#sec41)\n", 64 | " - [introsの もう一つの使い方](./1-Logic.ipynb#sec42)\n", 65 | " - [split](./1-Logic.ipynb#sec43)\n", 66 | " - [left または right](./1-Logic.ipynb#sec44)\n", 67 | " - [destruct](./1-Logic.ipynb#sec45)\n", 68 | " - [apply](./1-Logic.ipynb#sec46)\n", 69 | " - [exact](./1-Logic.ipynb#sec47)\n", 70 | " - [assumption](./1-Logic.ipynb#sec48)\n", 71 | " - [trivial](./1-Logic.ipynb#sec49)\n", 72 | "- [論理式の証明の自動化 tauto](./1-Logic.ipynb#sec5)\n", 73 | " - [tautoで証明できる命題](./1-Logic.ipynb#sec51)\n", 74 | " - [tautoで証明できない命題](./1-Logic.ipynb#sec52)\n", 75 | "\n" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": { 81 | "coq_kernel_metadata": { 82 | "auto_roll_back": true 83 | } 84 | }, 85 | "source": [ 86 | "# [演習問題 1](./1-logic-answer.ipynb)\n", 87 | "- [演習問題 1-1](./1-logic-answer.ipynb#ex11) [解答](./1-logic-answer.ipynb#ans11)  A -> A\n", 88 | "- [演習問題 1-2](./1-logic-answer.ipynb#ex12) [解答](./1-logic-answer.ipynb#ans12)  A /\\ B -> A\n", 89 | "- [演習問題 1-3](./1-logic-answer.ipynb#ex13) [解答](./1-logic-answer.ipynb#ans13)  A /\\ B -> B\n", 90 | "- [演習問題 1-4](./1-logic-answer.ipynb#ex14) [解答](./1-logic-answer.ipynb#ans14)  A -> A \\\\/ B\n", 91 | "- [演習問題 1-5](./1-logic-answer.ipynb#ex15) [解答](./1-logic-answer.ipynb#ans15)  B -> A \\\\/ B\n", 92 | "- [演習問題 1-6](./1-logic-answer.ipynb#ex16) [解答](./1-logic-answer.ipynb#ans16)  A -> (A -> B) -> B\n", 93 | "- [演習問題 1-7](./1-logic-answer.ipynb#ex17) [解答](./1-logic-answer.ipynb#ans17)  A -> (A -> B) -> (B ->C) -> C\n", 94 | "- [演習問題 1-8](./1-logic-answer.ipynb#ex18) [解答](./1-logic-answer.ipynb#ans18)  A /\\ B -> B /\\ A\n", 95 | "- [演習問題 1-9](./1-logic-answer.ipynb#ex19) [解答](./1-logic-answer.ipynb#ans19)  A \\\\/ B -> B \\\\/ A\n", 96 | "\n" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": { 102 | "coq_kernel_metadata": { 103 | "auto_roll_back": true 104 | } 105 | }, 106 | "source": [ 107 | "# [関数と等式を含んだ命題の証明](./2-Equality.ipynb)\n", 108 | "- [Coqでの関数と等式を含んだ命題の証明](./2-Equality.ipynb#sec1)\n", 109 | "- [等式の性質](./2-Equality.ipynb#sec2)\n", 110 | " - [Coqでの等式の証明の戦略](./2-Equality.ipynb#sec21)\n", 111 | "- [Coqでの関数](./2-Equality.ipynb#sec3)\n", 112 | " - [Coqでの関数の定義](./2-Equality.ipynb#sec31)\n", 113 | " - [Coqでの関数の型](./2-Equality.ipynb#sec32)\n", 114 | "- [簡単な関数の例](./2-Equality.ipynb#sec4)\n", 115 | " - [関数 negb: 引数に与えられたブール値の否定を返す関数](./2-Equality.ipynb#sec41)\n", 116 | " - [関数 eqb  引数に与えられた二つのブール値が等しいかを返す関数](./2-Equality.ipynb#sec42)\n", 117 | "- [再帰的な関数定義の例](./2-Equality.ipynb#sec5)\n", 118 | " - [二つの自然数の和を返す関数 plus](./2-Equality.ipynb#sec51)\n", 119 | " - [二つの自然数の積を返す関数 mult](./2-Equality.ipynb#sec52)\n", 120 | "- [等式を含む命題の証明で利用できるtacticsについて](./2-Equality.ipynb#sec6)\n", 121 | "- [reflexivity tactics](./2-Equality.ipynb#sec605)\n", 122 | "- [simpl tactic](./2-Equality.ipynb#sec7)\n", 123 | " - [1 + n = S n で式を単純にする](./2-Equality.ipynb#sec71)\n", 124 | " - [0 + n = n で式を単純にする](./2-Equality.ipynb#sec72)\n", 125 | " - [0 * n = 0 で式を単純にする](./2-Equality.ipynb#sec73)\n", 126 | "- [rewrite tactic](./2-Equality.ipynb#sec8)\n", 127 | " - [rewrite -> H の例](./2-Equality.ipynb#sec81)\n", 128 | " - [もう一つ rewrite -> H の例](./2-Equality.ipynb#sec82)\n", 129 | " - [rewrite <- H の例](./2-Equality.ipynb#sec83)\n", 130 | " " 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": { 136 | "coq_kernel_metadata": { 137 | "auto_roll_back": true 138 | } 139 | }, 140 | "source": [ 141 | "# [演習問題 2](./2-equality-answer.ipynb)\n", 142 | "- [演習問題 2-1](./2-equality-answer.ipynb#ex21) [解答](./2-equality-answer.ipynb#ans21)  0 + n = n\n", 143 | "- [演習問題 2-2](./2-equality-answer.ipynb#ex22) [解答](./2-equality-answer.ipynb#ans22)  1 + n = S n\n", 144 | "- [演習問題 2-3](./2-equality-answer.ipynb#ex23) [解答](./2-equality-answer.ipynb#ans23)  0 * n = 0\n", 145 | "- [演習問題 2-4](./2-equality-answer.ipynb#ex24) [解答](./2-equality-answer.ipynb#ans24)  n = m -> n+n = m + m\n", 146 | "- [演習問題 2-5](./2-equality-answer.ipynb#ex25) [解答](./2-equality-answer.ipynb#ans25)  n = m -> m = o -> n + m = m + o\n", 147 | "- [演習問題 2-6](./2-equality-answer.ipynb#ex26) [解答](./2-equality-answer.ipynb#ans26)  ( 0 + n ) * m = n * m\n", 148 | "- [演習問題 2-7](./2-equality-answer.ipynb#ex27) [解答](./2-equality-answer.ipynb#ans27)  m = S n -> m * (1 + n) = m * m" 149 | ] 150 | }, 151 | { 152 | "cell_type": "markdown", 153 | "metadata": { 154 | "coq_kernel_metadata": { 155 | "auto_roll_back": true 156 | } 157 | }, 158 | "source": [ 159 | "# [帰納的データ型と帰納法を用いた証明](./3-Induction.ipynb)\n", 160 | "- [Coq での「型」について](./3-Induction.ipynb#sec1)\n", 161 | "- [列挙によるデータ型の定義](./3-Induction.ipynb#sec2)\n", 162 | " - [型 bool ](./3-Induction.ipynb#sec21)\n", 163 | " - [型 rgb](./3-Induction.ipynb#sec22)\n", 164 | " - [定義済みの型から、新しい型を定義する](./3-Induction.ipynb#sec23)\n", 165 | "- [帰納的データ型](./3-Induction.ipynb#sec3)\n", 166 | " - [Coqでの自然数の定義](./3-Induction.ipynb#sec31)\n", 167 | "- [t : T という表記の意味](./3-Induction.ipynb#sec32)\n", 168 | "- [帰納法を使った命題の証明](./3-Induction.ipynb#sec4)\n", 169 | " - [数学的帰納法について](./3-Induction.ipynb#sec41)n * 0 = 0\n", 170 | " - [帰納法を使った証明の例 1: n + 0 = n](./3-Induction.ipynb#sec42)\n", 171 | " - [帰納法を使った証明の例 2: S (n + m) = n + (S m)](./3-Induction.ipynb#sec43)\n", 172 | "- [帰納法を使う場合の証明の流れ](./3-Induction.ipynb#sec5)\n", 173 | " - [tactic induction](./3-Induction.ipynb#sec51)\n", 174 | " - [induction nを用いた証明の留意点](./3-Induction.ipynb#sec52)\n", 175 | "- [Coqのライブラリーの利用](./3-Induction.ipynb#sec6)\n", 176 | " - [Coqでは、多数の証明済みの命題がライブラリーとして提供されています。](./3-Induction.ipynb#sec61)\n", 177 | " - [Coq ライブラリーを利用した証明の例 : n * m = m * n](./3-Induction.ipynb#sec62)\n", 178 | "\n" 179 | ] 180 | }, 181 | { 182 | "cell_type": "markdown", 183 | "metadata": { 184 | "coq_kernel_metadata": { 185 | "auto_roll_back": true 186 | } 187 | }, 188 | "source": [ 189 | "# [演習問題 3](./3-induction-answer.ipynb)\n", 190 | "- [演習問題 3-1](./3-induction-answer.ipynb#ex31) [解答](./3-induction-answer.ipynb#ans31)  n + 0 = n\n", 191 | "- [演習問題 3-2](./3-induction-answer.ipynb#ex32) [解答](./3-induction-answer.ipynb#ans32)  minus n n = 0\n", 192 | "- [演習問題 3-3](./3-induction-answer.ipynb#ex33) [解答](./3-induction-answer.ipynb#ans33)  n * 0 = 0\n", 193 | "- [演習問題 3-4](./3-induction-answer.ipynb#ex34) [解答](./3-induction-answer.ipynb#ans34)  S (n + m) = n + (S m)\n", 194 | "- [演習問題 3-5](./3-induction-answer.ipynb#ex35) [解答](./3-induction-answer.ipynb#ans35)  n + m = m + n\n", 195 | "- [演習問題 3-6](./3-induction-answer.ipynb#ex36) [解答](./3-induction-answer.ipynb#ans36)  n + (m +o) = (n + m) + o \n", 196 | "- [演習問題 3-7](./3-induction-answer.ipynb#ex37) [解答](./3-induction-answer.ipynb#ans37)  n * S m = n * m + n\n", 197 | "- [演習問題 3-8](./3-induction-answer.ipynb#ex38) [解答](./3-induction-answer.ipynb#ans38)  n * m = m * n\n" 198 | ] 199 | } 200 | ], 201 | "metadata": { 202 | "kernelspec": { 203 | "display_name": "Coq", 204 | "language": "coq", 205 | "name": "coq" 206 | }, 207 | "language_info": { 208 | "file_extension": ".v", 209 | "mimetype": "text/x-coq", 210 | "name": "coq", 211 | "version": "8.9.1" 212 | } 213 | }, 214 | "nbformat": 4, 215 | "nbformat_minor": 2 216 | } 217 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Introduction-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# MaruLabo " 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "coq_kernel_metadata": { 18 | "auto_roll_back": true 19 | } 20 | }, 21 | "source": [ 22 | "# はじめての証明" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": { 28 | "coq_kernel_metadata": { 29 | "auto_roll_back": true 30 | } 31 | }, 32 | "source": [ 33 | "次のセルを実行してみてください。次のような出力があるはずです。\n", 34 | "" 35 | ] 36 | }, 37 | { 38 | "cell_type": "markdown", 39 | "metadata": { 40 | "coq_kernel_metadata": { 41 | "auto_roll_back": true 42 | } 43 | }, 44 | "source": [ 45 | "
\n", 46 | "\n", 47 | "
" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 1, 53 | "metadata": { 54 | "coq_kernel_metadata": { 55 | "auto_roll_back": true, 56 | "cell_id": "7774a2227f494ad18622054a5fda738d", 57 | "execution_id": "9B0735FF845E4B73820D47975CE978CF" 58 | } 59 | }, 60 | "outputs": [ 61 | { 62 | "data": { 63 | "text/html": [ 64 | "\n", 65 | "
\n", 66 | "
Proving: Hello_Coq\n",
 67 |        "\n",
 68 |        "1 subgoal\n",
 69 |        "\n",
 70 |        "1/1 -----------\n",
 71 |        "forall A : Prop, A -> A
\n", 72 | "
\n", 73 | "\n", 74 | "
\n", 75 | " \n", 76 | " Cell evaluated.\n", 77 | "
\n", 78 | "\n", 79 | "
\n", 80 | " \n", 81 | " Cell rolled back.\n", 82 | "
\n", 83 | "\n", 84 | "
\n", 85 | " \n", 89 | "\n", 90 | "
\n", 91 | " \n", 92 | " Auto rollback\n", 93 | "
\n", 94 | "
\n" 95 | ], 96 | "text/plain": [ 97 | "Proving: Hello_Coq\n", 98 | "\n", 99 | "1 subgoal\n", 100 | "\n", 101 | "1/1 -----------\n", 102 | "forall A : Prop, A -> A" 103 | ] 104 | }, 105 | "execution_count": 2, 106 | "metadata": { 107 | "coq_kernel_evaluated": true, 108 | "coq_kernel_execution_id": "9B0735FF845E4B73820D47975CE978CF", 109 | "coq_kernel_rolled_back": false 110 | }, 111 | "output_type": "execute_result" 112 | } 113 | ], 114 | "source": [ 115 | "Theorem Hello_Coq : (forall A : Prop, A -> A)." 116 | ] 117 | }, 118 | { 119 | "cell_type": "markdown", 120 | "metadata": { 121 | "coq_kernel_metadata": { 122 | "auto_roll_back": true 123 | } 124 | }, 125 | "source": [ 126 | "今度は、次のセルを実行してみてください。次のような出力があるはずです。\n", 127 | "" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 2, 133 | "metadata": { 134 | "coq_kernel_metadata": { 135 | "auto_roll_back": true, 136 | "cell_id": "107c5f7ec1354ef492e28a159d5d9d9c", 137 | "execution_id": "DAD112078A37407E8EE32A0E3FF9DA77" 138 | }, 139 | "scrolled": false 140 | }, 141 | "outputs": [ 142 | { 143 | "data": { 144 | "text/html": [ 145 | "\n", 146 | "
\n", 147 | "
Proving: Hello_Coq\n",
148 |        "\n",
149 |        "1 subgoal\n",
150 |        "\n",
151 |        "1/1 -----------\n",
152 |        "forall A : Prop, A -> A
\n", 153 | "
\n", 154 | "\n", 155 | "
\n", 156 | " \n", 157 | " Cell evaluated.\n", 158 | "
\n", 159 | "\n", 160 | "
\n", 161 | " \n", 162 | " Cell rolled back.\n", 163 | "
\n", 164 | "\n", 165 | "
\n", 166 | " \n", 170 | "\n", 171 | "
\n", 172 | " \n", 173 | " Auto rollback\n", 174 | "
\n", 175 | "
\n" 176 | ], 177 | "text/plain": [ 178 | "Proving: Hello_Coq\n", 179 | "\n", 180 | "1 subgoal\n", 181 | "\n", 182 | "1/1 -----------\n", 183 | "forall A : Prop, A -> A" 184 | ] 185 | }, 186 | "execution_count": 3, 187 | "metadata": { 188 | "coq_kernel_evaluated": true, 189 | "coq_kernel_execution_id": "DAD112078A37407E8EE32A0E3FF9DA77", 190 | "coq_kernel_rolled_back": false 191 | }, 192 | "output_type": "execute_result" 193 | } 194 | ], 195 | "source": [ 196 | "Proof." 197 | ] 198 | }, 199 | { 200 | "cell_type": "markdown", 201 | "metadata": { 202 | "coq_kernel_metadata": { 203 | "auto_roll_back": true 204 | } 205 | }, 206 | "source": [ 207 | "今度は、次のセルを実行してみてください。次のような出力があるはずです。その意味を説明します。\n", 208 | "" 209 | ] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "execution_count": 3, 214 | "metadata": { 215 | "coq_kernel_metadata": { 216 | "auto_roll_back": true, 217 | "cell_id": "456f37c34dee4c5680781cf89cc9a1ce", 218 | "execution_id": "C2AF206FEA7042F4816B1E717626F4CD" 219 | }, 220 | "scrolled": true 221 | }, 222 | "outputs": [ 223 | { 224 | "data": { 225 | "text/html": [ 226 | "\n", 227 | "
\n", 228 | "
Proving: Hello_Coq\n",
229 |        "\n",
230 |        "1 subgoal\n",
231 |        "\n",
232 |        "A : Prop\n",
233 |        "H : A\n",
234 |        "\n",
235 |        "1/1 -----------\n",
236 |        "A
\n", 237 | "
\n", 238 | "\n", 239 | "
\n", 240 | " \n", 241 | " Cell evaluated.\n", 242 | "
\n", 243 | "\n", 244 | "
\n", 245 | " \n", 246 | " Cell rolled back.\n", 247 | "
\n", 248 | "\n", 249 | "
\n", 250 | " \n", 254 | "\n", 255 | "
\n", 256 | " \n", 257 | " Auto rollback\n", 258 | "
\n", 259 | "
\n" 260 | ], 261 | "text/plain": [ 262 | "Proving: Hello_Coq\n", 263 | "\n", 264 | "1 subgoal\n", 265 | "\n", 266 | "A : Prop\n", 267 | "H : A\n", 268 | "\n", 269 | "1/1 -----------\n", 270 | "A" 271 | ] 272 | }, 273 | "execution_count": 4, 274 | "metadata": { 275 | "coq_kernel_evaluated": true, 276 | "coq_kernel_execution_id": "C2AF206FEA7042F4816B1E717626F4CD", 277 | "coq_kernel_rolled_back": false 278 | }, 279 | "output_type": "execute_result" 280 | } 281 | ], 282 | "source": [ 283 | "intros." 284 | ] 285 | }, 286 | { 287 | "cell_type": "markdown", 288 | "metadata": { 289 | "coq_kernel_metadata": { 290 | "auto_roll_back": true 291 | } 292 | }, 293 | "source": [ 294 | "今度は、次のセルを実行してみてください。次のような出力があるはずです。\n", 295 | "" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 4, 301 | "metadata": { 302 | "coq_kernel_metadata": { 303 | "auto_roll_back": true, 304 | "cell_id": "3f4dfe31f672462fa18cde95827a8d8b", 305 | "execution_id": "5236AD7A7C9F41838CE5B3A9F37F2C4E" 306 | }, 307 | "scrolled": true 308 | }, 309 | "outputs": [ 310 | { 311 | "data": { 312 | "text/html": [ 313 | "\n", 314 | "
\n", 315 | "
Proving: Hello_Coq\n",
316 |        "\n",
317 |        "No more subgoals
\n", 318 | "
\n", 319 | "\n", 320 | "
\n", 321 | " \n", 322 | " Cell evaluated.\n", 323 | "
\n", 324 | "\n", 325 | "
\n", 326 | " \n", 327 | " Cell rolled back.\n", 328 | "
\n", 329 | "\n", 330 | "
\n", 331 | " \n", 335 | "\n", 336 | "
\n", 337 | " \n", 338 | " Auto rollback\n", 339 | "
\n", 340 | "
\n" 341 | ], 342 | "text/plain": [ 343 | "Proving: Hello_Coq\n", 344 | "\n", 345 | "No more subgoals" 346 | ] 347 | }, 348 | "execution_count": 5, 349 | "metadata": { 350 | "coq_kernel_evaluated": true, 351 | "coq_kernel_execution_id": "5236AD7A7C9F41838CE5B3A9F37F2C4E", 352 | "coq_kernel_rolled_back": false 353 | }, 354 | "output_type": "execute_result" 355 | } 356 | ], 357 | "source": [ 358 | "exact H." 359 | ] 360 | }, 361 | { 362 | "cell_type": "markdown", 363 | "metadata": { 364 | "coq_kernel_metadata": { 365 | "auto_roll_back": true 366 | } 367 | }, 368 | "source": [ 369 | "今度は、次のセルを実行してみてください。次のような出力があるはずです。\n", 370 | "" 371 | ] 372 | }, 373 | { 374 | "cell_type": "code", 375 | "execution_count": 5, 376 | "metadata": { 377 | "coq_kernel_metadata": { 378 | "auto_roll_back": true, 379 | "cell_id": "6b1e72f14e3a4bb8bc2d0300c92ae95f", 380 | "execution_id": "C5AF1A1C5CCB4A0C9B8B439056C556F1" 381 | } 382 | }, 383 | "outputs": [ 384 | { 385 | "data": { 386 | "text/html": [ 387 | "\n", 388 | "
\n", 389 | "
\n",
390 |        "
\n", 391 | "\n", 392 | "
\n", 393 | " \n", 394 | " Cell evaluated.\n", 395 | "
\n", 396 | "\n", 397 | "
\n", 398 | " \n", 399 | " Cell rolled back.\n", 400 | "
\n", 401 | "\n", 402 | "
\n", 403 | " \n", 407 | "\n", 408 | "
\n", 409 | " \n", 410 | " Auto rollback\n", 411 | "
\n", 412 | "
\n" 413 | ], 414 | "text/plain": [] 415 | }, 416 | "execution_count": 6, 417 | "metadata": { 418 | "coq_kernel_evaluated": true, 419 | "coq_kernel_execution_id": "C5AF1A1C5CCB4A0C9B8B439056C556F1", 420 | "coq_kernel_rolled_back": false 421 | }, 422 | "output_type": "execute_result" 423 | } 424 | ], 425 | "source": [ 426 | "Qed." 427 | ] 428 | }, 429 | { 430 | "cell_type": "markdown", 431 | "metadata": { 432 | "collapsed": true, 433 | "coq_kernel_metadata": { 434 | "auto_roll_back": true 435 | } 436 | }, 437 | "source": [] 438 | } 439 | ], 440 | "metadata": { 441 | "kernelspec": { 442 | "display_name": "Coq", 443 | "language": "coq", 444 | "name": "coq" 445 | }, 446 | "language_info": { 447 | "file_extension": ".v", 448 | "mimetype": "text/x-coq", 449 | "name": "coq", 450 | "version": "8.9.1" 451 | } 452 | }, 453 | "nbformat": 4, 454 | "nbformat_minor": 2 455 | } 456 | -------------------------------------------------------------------------------- /0-Introduction.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "coq_kernel_metadata": { 18 | "auto_roll_back": true 19 | } 20 | }, 21 | "source": [ 22 | "    [全体目次](./0-Contents.ipynb)  [次の章へ](./1-Logic.ipynb)" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": { 28 | "coq_kernel_metadata": { 29 | "auto_roll_back": true 30 | } 31 | }, 32 | "source": [ 33 | "# Hello Coq !" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": { 39 | "coq_kernel_metadata": { 40 | "auto_roll_back": true 41 | } 42 | }, 43 | "source": [ 44 | "\n", 45 | "# Coqとのはじめての対話\n", 46 | "\n", 47 | "Coqは、対話型の証明支援システムです。対話するのは人間と機械(Coq)です。\n", 48 | "\n", 49 | "人間と機械の対話でどのように証明が進んでいくかについては、おいおい説明するとして、ここではまず、Coqとのはじめての対話を経験して見ましょう。簡単な証明をしてみます。\n", 50 | "\n", 51 | "次の In [1]: で始まる空白の行に、次のブルーの文字列を入力して実行して見てください。" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": { 57 | "coq_kernel_metadata": { 58 | "auto_roll_back": true 59 | } 60 | }, 61 | "source": [ 62 | "
\n", 63 | " ハンズオン環境 coq-jupyter -- 入力の実行\n", 64 | "

\n", 65 | " 今回のハンズオンで利用している環境は、jupyter notebookからCoqを呼び出せるようにした coq-jupyter というものです。操作法はjupyterと同じです。\n", 66 | " jupyterでは、操作の単位をセルと呼んでいます。 セルに入力したの字列を実行するには、セルにカーソルを合わせて、 画面上部の Runボタンを押します。\n", 67 | "
\n", 68 | "\n" 69 | ] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "metadata": { 74 | "coq_kernel_metadata": { 75 | "auto_roll_back": true 76 | } 77 | }, 78 | "source": [ 79 | "
\n", 80 | "Shift-RET(シフトキーを押しながらRETキーを押す)でも、セルの実行ができます。\n", 81 | "
\n", 82 | "\n", 83 | "最初に入力して実行するの、この文字列です。この文字列で一番大事なのは、冒頭の \"Theorem\" です。この文字列は、Coqに証明すべき式と、証明すべき式の名前を伝えています。こうした文字列を Coqコマンドと呼ぶことにしましょう。" 84 | ] 85 | }, 86 | { 87 | "cell_type": "markdown", 88 | "metadata": { 89 | "coq_kernel_metadata": { 90 | "auto_roll_back": true 91 | } 92 | }, 93 | "source": [ 94 | "Theorem Hello_Coq : (forall A : Prop, A -> A ).\n", 95 | "\n", 96 | "文字列の入力では、コロンやコンマやピリオド、\"->\"(マイナス記号'-'+'>' )に注意してください。\n", 97 | "" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": null, 103 | "metadata": { 104 | "coq_kernel_metadata": { 105 | "auto_roll_back": true, 106 | "cell_id": "ecf27221f8c64117aa9fd72f870003df", 107 | "execution_id": "a4e06ef9b93e4d0d8237490a7eec840c" 108 | }, 109 | "scrolled": true 110 | }, 111 | "outputs": [], 112 | "source": [] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": { 117 | "coq_kernel_metadata": { 118 | "auto_roll_back": true 119 | } 120 | }, 121 | "source": [ 122 | "入力がおわったら、先のセルを実行してみてください。Coqから次のような反応があるはずです。\n", 123 | "ここで初めてCoqに証明したい定理の情報を伝えました。Coqが返した情報の意味は、次のようなものです。\n", 124 | "\n", 125 | "\n" 126 | ] 127 | }, 128 | { 129 | "cell_type": "markdown", 130 | "metadata": { 131 | "coq_kernel_metadata": { 132 | "auto_roll_back": true 133 | } 134 | }, 135 | "source": [ 136 | "今度は、次の文字列を入力して実行してください。(最後の、ピリオドを忘れずに)\n", 137 | "

\n", 138 | "Proof.\n", 139 | "
" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": null, 145 | "metadata": { 146 | "coq_kernel_metadata": { 147 | "auto_roll_back": true, 148 | "cell_id": "84d24fe8d5bd418f909b9d922ad3f4bf", 149 | "execution_id": "9B0735FF845E4B73820D47975CE978CF" 150 | }, 151 | "scrolled": true 152 | }, 153 | "outputs": [], 154 | "source": [] 155 | }, 156 | { 157 | "cell_type": "markdown", 158 | "metadata": { 159 | "coq_kernel_metadata": { 160 | "auto_roll_back": true 161 | } 162 | }, 163 | "source": [ 164 | "次のような反応がcoqからあるはずです。基本的には、先の反応と同じです。\n", 165 | "coqコマンドの \"Proof.\"は、これから証明が始まることを宣言しています。\n", 166 | "\n", 167 | "ここでは、先に説明していなかった下二行の説明をしています。これらの出力は、coq-jupyterからのものです。\n", 168 | "\"Cell evaluated\"がでていれば、証明は、順調に進んでいると思って構いません。\n", 169 | "\n", 170 | "\n", 171 | "" 172 | ] 173 | }, 174 | { 175 | "cell_type": "markdown", 176 | "metadata": { 177 | "coq_kernel_metadata": { 178 | "auto_roll_back": true 179 | } 180 | }, 181 | "source": [ 182 | "今度は、次の文字列を入力して実行してください。(最後の、ピリオドを忘れずに)\n", 183 | "

\n", 184 | "intros.\n", 185 | "
" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": null, 191 | "metadata": { 192 | "coq_kernel_metadata": { 193 | "auto_roll_back": true, 194 | "cell_id": "2b72a7e19d34461982cfd26a9dad43de", 195 | "execution_id": "DAD112078A37407E8EE32A0E3FF9DA77" 196 | }, 197 | "scrolled": false 198 | }, 199 | "outputs": [], 200 | "source": [] 201 | }, 202 | { 203 | "cell_type": "markdown", 204 | "metadata": { 205 | "coq_kernel_metadata": { 206 | "auto_roll_back": true 207 | } 208 | }, 209 | "source": [ 210 | "次のような反応があるはずです。その意味を説明しています。\n", 211 | "" 212 | ] 213 | }, 214 | { 215 | "cell_type": "markdown", 216 | "metadata": { 217 | "coq_kernel_metadata": { 218 | "auto_roll_back": true 219 | } 220 | }, 221 | "source": [ 222 | "今度は、次の文字列を入力して実行してください。(最後の、ピリオドを忘れずに)\n", 223 | "

\n", 224 | "exact H.\n", 225 | "
" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": null, 231 | "metadata": { 232 | "coq_kernel_metadata": { 233 | "auto_roll_back": true 234 | } 235 | }, 236 | "outputs": [], 237 | "source": [] 238 | }, 239 | { 240 | "cell_type": "markdown", 241 | "metadata": { 242 | "coq_kernel_metadata": { 243 | "auto_roll_back": true 244 | } 245 | }, 246 | "source": [ 247 | "次のような反応があるはずです。\n", 248 | "\n", 249 | "\n", 250 | "" 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": { 256 | "coq_kernel_metadata": { 257 | "auto_roll_back": true 258 | } 259 | }, 260 | "source": [ 261 | "今度は、次の文字列を入力して実行してください。(最後の、ピリオドを忘れずに)\n", 262 | "

\n", 263 | "Qed..\n", 264 | "
" 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": null, 270 | "metadata": { 271 | "coq_kernel_metadata": { 272 | "auto_roll_back": true, 273 | "cell_id": "868b4dae6c1c456abad8bd188cf0d134", 274 | "execution_id": "5236AD7A7C9F41838CE5B3A9F37F2C4E" 275 | }, 276 | "scrolled": true 277 | }, 278 | "outputs": [], 279 | "source": [] 280 | }, 281 | { 282 | "cell_type": "markdown", 283 | "metadata": { 284 | "coq_kernel_metadata": { 285 | "auto_roll_back": true 286 | } 287 | }, 288 | "source": [ 289 | "次のような反応ががあるはずです。\n", 290 | "\n", 291 | "" 292 | ] 293 | }, 294 | { 295 | "cell_type": "markdown", 296 | "metadata": { 297 | "coq_kernel_metadata": { 298 | "auto_roll_back": true 299 | } 300 | }, 301 | "source": [ 302 | "これで、定理 Hello_Coq の証明は、終了です。\n", 303 | "\n", 304 | "\n", 305 | "\n", 306 | "# Coqとのはじめての対話をふりかえる。\n", 307 | "\n", 308 | "Coqとのはじめての対話を、人間の側とCoqの側の、それぞれから振り返ってみましょう。\n", 309 | "\n", 310 | "\n", 311 | "## 人間は、Coqに何を伝えたか?\n", 312 | "\n", 313 | "人間が、Coqに伝えた一連の命令を抜き出してみましょう。次のようになります。" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": 1, 319 | "metadata": { 320 | "coq_kernel_metadata": { 321 | "auto_roll_back": true, 322 | "cell_id": "f6945826b13e445788c25fbd1254ca52", 323 | "execution_id": "548394fdcbcd42faa4958c4cadd30d99" 324 | }, 325 | "scrolled": true 326 | }, 327 | "outputs": [ 328 | { 329 | "data": { 330 | "text/html": [ 331 | "\n", 332 | "
\n", 333 | "
\n",
334 |        "
\n", 335 | "\n", 336 | "
\n", 337 | " \n", 338 | " Cell evaluated.\n", 339 | "
\n", 340 | "\n", 341 | "
\n", 342 | " \n", 343 | " Cell rolled back.\n", 344 | "
\n", 345 | "\n", 346 | "
\n", 347 | " \n", 351 | "\n", 352 | "
\n", 353 | " \n", 354 | " Auto rollback\n", 355 | "
\n", 356 | "
\n" 357 | ], 358 | "text/plain": [] 359 | }, 360 | "execution_count": 6, 361 | "metadata": { 362 | "coq_kernel_evaluated": true, 363 | "coq_kernel_execution_id": "548394fdcbcd42faa4958c4cadd30d99", 364 | "coq_kernel_rolled_back": false 365 | }, 366 | "output_type": "execute_result" 367 | } 368 | ], 369 | "source": [ 370 | "Theorem Hello_Coq' : (forall A : Prop, A -> A ).\n", 371 | "Proof.\n", 372 | " intros.\n", 373 | " exact H.\n", 374 | "Qed." 375 | ] 376 | }, 377 | { 378 | "cell_type": "markdown", 379 | "metadata": { 380 | "coq_kernel_metadata": { 381 | "auto_roll_back": true 382 | } 383 | }, 384 | "source": [ 385 | "これだけ見ていると、これが定理Hello_Coq (forall A : Prop, A -> A )の証明とは、とても思えないと思います。\n", 386 | "逆に、定理Hello_Coq が与えられた時、上のような証明をすぐに思いつくことは、ほとんどの人にはできないと思います。\n", 387 | "\n", 388 | "それには理由があります。Coqの証明は、人間とCoqの「対話」を通じて進行します。人間は、Coqの反応を見て、証明を進めるために次にCoqに何を命ずるかを考えます。そのやり取りの過程が省略されて、その結果だけを抜き出しても、その命令を選択した意図は見えてきません。\n", 389 | "\n", 390 | "### 証明を進めるために、人間がCoqに与える命令を tactic と呼びます。\n", 391 | "\n", 392 | "tactic というのは「戦略」という意味ですね。Coqの反応を見て、証明を進めるために、どのような攻め方をするのかと考えて出てきた結論が、あるtacticを選択するということです。なぜ、あるtactic が選ばれたかは、tacticの選択の直前のCoqの反応を見てみないとわかりません。この例では、introsやexact H がtacticです。\n", 393 | "\n", 394 | "一方、人間の入力のうち、Theorem や Proof やQed は、証明の進め方やCoqの反応とは直接は関係がありません。これらは、tactics とは別のグループのCoqの命令群に族します。これらのCoqコマンドは、大文字で始まっています。tactics は小文字から始まりますので、区別は容易です。\n", 395 | "\n", 396 | "### 完成した証明を、「対話」なしに、人間はCoqに与えることができます。\n", 397 | "\n", 398 | "では、ある証明が正しいことを示すために、人間は、Coqとの「対話」を毎回繰り返す必要があるのでしょうか? そうでは、ありません。先のセルを実行してみてください。\"Cell evaluated.\"が出て、証明がすぐに終わることが確認できます。\n", 399 | "\n", 400 | "人間とCoqが「対話」していったん完成した証明は、人間はtactic ごとのCoqの反応を見ることなく、それを丸ごとCoqに与えることで証明を実行することができます。これは、証明の完成のためにCoqと「対話」した相手が誰であろうと構わないという点で、実践的には、とても重要なことです。我々は、第三者の行なった証明を、利用することができるのです。ただし、これは、人間はとCoqとの「対話」を通じて証明を作っていく過程とは区別されるべき、「証明の検証」 ともいうべきものです。\n", 401 | "\n", 402 | "上のセルのことを、「これだけ見ていると、これが定理Hello_Coq (forall A : Prop, A -> A )の証明とは、とても思えない」と、先ほど書きましたが、それは人間にとってのこと。Coqは、これを正しく証明として認識し、それが正しい証明かチェックできます。\n", 403 | "\n", 404 | "\n", 405 | "\n", 406 | "\n" 407 | ] 408 | }, 409 | { 410 | "cell_type": "markdown", 411 | "metadata": { 412 | "coq_kernel_metadata": { 413 | "auto_roll_back": true 414 | } 415 | }, 416 | "source": [ 417 | "
\n", 418 | " 先に実行したセルの中では、定理の名前が、元のHello_CoqからHello_Coq'に変更されています(最後にダッシュ=プライムが追加されている)それは、元の名前の定理が、このページの演習の中で、すでに「証明済」になっていて、再度の証明の実行が開始できないからです。\n", 419 | "
\n", 420 | "\n", 421 | "\n", 422 | "## Coqは、反応として人間に何を伝えたか?\n", 423 | "\n", 424 | "ここでは、先の例での人間が intros と打ち込んだ時のCoqの反応を、改めて、見ることにしましょう。\n", 425 | "次のような情報が含まれていることがわかります。\n", 426 | "\n", 427 | "- 証明中の定理の名前\n", 428 | "- 証明すべきサブゴールの数\n", 429 | "- 証明の状態を表す大事な情報\n", 430 | "( この情報は、横線の上下で大きく二つに分かれています。)\n", 431 | " - サブゴールを証明するにあたって前提として利用できる仮説\n", 432 | " - 証明すべきサブゴール\n", 433 | " \n", 434 | " \n" 435 | ] 436 | }, 437 | { 438 | "cell_type": "code", 439 | "execution_count": null, 440 | "metadata": { 441 | "coq_kernel_metadata": { 442 | "auto_roll_back": true 443 | } 444 | }, 445 | "outputs": [], 446 | "source": [] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": null, 451 | "metadata": { 452 | "coq_kernel_metadata": { 453 | "auto_roll_back": true 454 | } 455 | }, 456 | "outputs": [], 457 | "source": [] 458 | }, 459 | { 460 | "cell_type": "markdown", 461 | "metadata": { 462 | "coq_kernel_metadata": { 463 | "auto_roll_back": true 464 | } 465 | }, 466 | "source": [ 467 | "### Coqの反応には、当面の証明で集中すべきサブゴールが含まれています。\n", 468 | "\n", 469 | "Coqが返す反応で一番大事なのは、その時点での「証明の状態」を表す情報です。その状態は、直前に人間が投入した tactic コマンドによって変化します。tactics は、まさに、証明の状態を変化させるために、人間が利用するコマンドです。あるtactics コマンドが、どのように証明の状態を変化させるかについては、次章以降で説明したいと思います。ここでは、それについては触れません。ただ、ここでは、「証明の状態」の情報のうち、「サブゴール」といわれるものだけに注目しましょう。\n", 470 | "\n", 471 | "Coqの反応の中に含まれるサブゴールというのは、「当面は、この問題の証明に集中しようよ」という、Coqから人間へのサジェスションです。Coqから人間への指示と思っても構いません。人間とCoqは、大きな問題を複数のより簡単な問題に分割して、一つづつ分割された問題を解こうとします。こうして分割された問題の一つが、サブゴールです。ですので、ある問題を解くために必要なサブゴールの数は、一つとは限りません。\n", 472 | "\n", 473 | "次の例は、destruct というtactic を実行した結果、二つのサブゴールを持つ証明の状態が生まれたことを示しています。\n", 474 | " \n" 475 | ] 476 | }, 477 | { 478 | "cell_type": "markdown", 479 | "metadata": { 480 | "coq_kernel_metadata": { 481 | "auto_roll_back": true 482 | } 483 | }, 484 | "source": [ 485 | "### Coqでの証明の最終目標は、サブゴールをなくすことです。\n", 486 | "\n", 487 | "先に述べたように、Coqは、元の問題をより簡単な問題(サブゴール)に分解して、それをすべて解こうとします。すべてのサブゴールが解かれたとき、元の問題の証明が終わります。別の言い方をすれば、Coqでの証明の最終的な目標は、証明されていないサブゴールの数をゼロにすることです。\n", 488 | "\n", 489 | "# 次章の目標\n", 490 | "\n", 491 | "次の章は、Coqでの論理式の証明を取り上げます。この章では詳しく触れなかった、あるtactic が証明の状態をどのように変化させるのかを学びます。" 492 | ] 493 | }, 494 | { 495 | "cell_type": "markdown", 496 | "metadata": { 497 | "coq_kernel_metadata": { 498 | "auto_roll_back": true 499 | } 500 | }, 501 | "source": [ 502 | "    [全体目次](./0-Contents.ipynb)  [この章の演習問題へ](./1-logic-answer.ipynb)  [前の章へ](./0-Introduction.ipynb)  [次の章へ](./2-Equality.ipynb)" 503 | ] 504 | } 505 | ], 506 | "metadata": { 507 | "kernelspec": { 508 | "display_name": "Coq", 509 | "language": "coq", 510 | "name": "coq" 511 | }, 512 | "language_info": { 513 | "file_extension": ".v", 514 | "mimetype": "text/x-coq", 515 | "name": "coq", 516 | "version": "8.9.1" 517 | } 518 | }, 519 | "nbformat": 4, 520 | "nbformat_minor": 2 521 | } 522 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/0-Introduction-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "coq_kernel_metadata": { 18 | "auto_roll_back": true 19 | } 20 | }, 21 | "source": [ 22 | "    [全体目次](./0-Contents.ipynb)  [次の章へ](./1-Logic.ipynb)" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": { 28 | "coq_kernel_metadata": { 29 | "auto_roll_back": true 30 | } 31 | }, 32 | "source": [ 33 | "# Hello Coq !" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": { 39 | "coq_kernel_metadata": { 40 | "auto_roll_back": true 41 | } 42 | }, 43 | "source": [ 44 | "\n", 45 | "# Coqとのはじめての対話\n", 46 | "\n", 47 | "Coqは、対話型の証明支援システムです。対話するのは人間と機械(Coq)です。\n", 48 | "\n", 49 | "人間と機械の対話でどのように証明が進んでいくかについては、おいおい説明するとして、ここではまず、Coqとのはじめての対話を経験して見ましょう。簡単な証明をしてみます。\n", 50 | "\n", 51 | "次の In [1]: で始まる空白の行に、次のブルーの文字列を入力して実行して見てください。" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": { 57 | "coq_kernel_metadata": { 58 | "auto_roll_back": true 59 | } 60 | }, 61 | "source": [ 62 | "
\n", 63 | " ハンズオン環境 coq-jupyter -- 入力の実行\n", 64 | "

\n", 65 | " 今回のハンズオンで利用している環境は、jupyter notebookからCoqを呼び出せるようにした coq-jupyter というものです。操作法はjupyterと同じです。\n", 66 | " jupyterでは、操作の単位をセルと呼んでいます。 セルに入力したの字列を実行するには、セルにカーソルを合わせて、 画面上部の Runボタンを押します。\n", 67 | "
\n", 68 | "\n" 69 | ] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "metadata": { 74 | "coq_kernel_metadata": { 75 | "auto_roll_back": true 76 | } 77 | }, 78 | "source": [ 79 | "
\n", 80 | "Shift-RET(シフトキーを押しながらRETキーを押す)でも、セルの実行ができます。\n", 81 | "
\n", 82 | "\n", 83 | "最初に入力して実行するの、この文字列です。この文字列で一番大事なのは、冒頭の \"Theorem\" です。この文字列は、Coqに証明すべき式と、証明すべき式の名前を伝えています。こうした文字列を Coqコマンドと呼ぶことにしましょう。" 84 | ] 85 | }, 86 | { 87 | "cell_type": "markdown", 88 | "metadata": { 89 | "coq_kernel_metadata": { 90 | "auto_roll_back": true 91 | } 92 | }, 93 | "source": [ 94 | "Theorem Hello_Coq : (forall A : Prop, A -> A ).\n", 95 | "\n", 96 | "文字列の入力では、コロンやコンマやピリオド、\"->\"(マイナス記号'-'+'>' )に注意してください。\n", 97 | "" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": null, 103 | "metadata": { 104 | "coq_kernel_metadata": { 105 | "auto_roll_back": true, 106 | "cell_id": "ecf27221f8c64117aa9fd72f870003df", 107 | "execution_id": "a4e06ef9b93e4d0d8237490a7eec840c" 108 | }, 109 | "scrolled": true 110 | }, 111 | "outputs": [], 112 | "source": [] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": { 117 | "coq_kernel_metadata": { 118 | "auto_roll_back": true 119 | } 120 | }, 121 | "source": [ 122 | "入力がおわったら、先のセルを実行してみてください。Coqから次のような反応があるはずです。\n", 123 | "ここで初めてCoqに証明したい定理の情報を伝えました。Coqが返した情報の意味は、次のようなものです。\n", 124 | "\n", 125 | "\n" 126 | ] 127 | }, 128 | { 129 | "cell_type": "markdown", 130 | "metadata": { 131 | "coq_kernel_metadata": { 132 | "auto_roll_back": true 133 | } 134 | }, 135 | "source": [ 136 | "今度は、次の文字列を入力して実行してください。(最後の、ピリオドを忘れずに)\n", 137 | "

\n", 138 | "Proof.\n", 139 | "
" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": null, 145 | "metadata": { 146 | "coq_kernel_metadata": { 147 | "auto_roll_back": true, 148 | "cell_id": "84d24fe8d5bd418f909b9d922ad3f4bf", 149 | "execution_id": "9B0735FF845E4B73820D47975CE978CF" 150 | }, 151 | "scrolled": true 152 | }, 153 | "outputs": [], 154 | "source": [] 155 | }, 156 | { 157 | "cell_type": "markdown", 158 | "metadata": { 159 | "coq_kernel_metadata": { 160 | "auto_roll_back": true 161 | } 162 | }, 163 | "source": [ 164 | "次のような反応がcoqからあるはずです。基本的には、先の反応と同じです。\n", 165 | "coqコマンドの \"Proof.\"は、これから証明が始まることを宣言しています。\n", 166 | "\n", 167 | "ここでは、先に説明していなかった下二行の説明をしています。これらの出力は、coq-jupyterからのものです。\n", 168 | "\"Cell evaluated\"がでていれば、証明は、順調に進んでいると思って構いません。\n", 169 | "\n", 170 | "\n", 171 | "" 172 | ] 173 | }, 174 | { 175 | "cell_type": "markdown", 176 | "metadata": { 177 | "coq_kernel_metadata": { 178 | "auto_roll_back": true 179 | } 180 | }, 181 | "source": [ 182 | "今度は、次の文字列を入力して実行してください。(最後の、ピリオドを忘れずに)\n", 183 | "

\n", 184 | "intros.\n", 185 | "
" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": null, 191 | "metadata": { 192 | "coq_kernel_metadata": { 193 | "auto_roll_back": true, 194 | "cell_id": "2b72a7e19d34461982cfd26a9dad43de", 195 | "execution_id": "DAD112078A37407E8EE32A0E3FF9DA77" 196 | }, 197 | "scrolled": false 198 | }, 199 | "outputs": [], 200 | "source": [] 201 | }, 202 | { 203 | "cell_type": "markdown", 204 | "metadata": { 205 | "coq_kernel_metadata": { 206 | "auto_roll_back": true 207 | } 208 | }, 209 | "source": [ 210 | "次のような反応があるはずです。その意味を説明しています。\n", 211 | "" 212 | ] 213 | }, 214 | { 215 | "cell_type": "markdown", 216 | "metadata": { 217 | "coq_kernel_metadata": { 218 | "auto_roll_back": true 219 | } 220 | }, 221 | "source": [ 222 | "今度は、次の文字列を入力して実行してください。(最後の、ピリオドを忘れずに)\n", 223 | "

\n", 224 | "exact H.\n", 225 | "
" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": null, 231 | "metadata": { 232 | "coq_kernel_metadata": { 233 | "auto_roll_back": true 234 | } 235 | }, 236 | "outputs": [], 237 | "source": [] 238 | }, 239 | { 240 | "cell_type": "markdown", 241 | "metadata": { 242 | "coq_kernel_metadata": { 243 | "auto_roll_back": true 244 | } 245 | }, 246 | "source": [ 247 | "次のような反応があるはずです。\n", 248 | "\n", 249 | "\n", 250 | "" 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": { 256 | "coq_kernel_metadata": { 257 | "auto_roll_back": true 258 | } 259 | }, 260 | "source": [ 261 | "今度は、次の文字列を入力して実行してください。(最後の、ピリオドを忘れずに)\n", 262 | "

\n", 263 | "Qed..\n", 264 | "
" 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": null, 270 | "metadata": { 271 | "coq_kernel_metadata": { 272 | "auto_roll_back": true, 273 | "cell_id": "868b4dae6c1c456abad8bd188cf0d134", 274 | "execution_id": "5236AD7A7C9F41838CE5B3A9F37F2C4E" 275 | }, 276 | "scrolled": true 277 | }, 278 | "outputs": [], 279 | "source": [] 280 | }, 281 | { 282 | "cell_type": "markdown", 283 | "metadata": { 284 | "coq_kernel_metadata": { 285 | "auto_roll_back": true 286 | } 287 | }, 288 | "source": [ 289 | "次のような反応ががあるはずです。\n", 290 | "\n", 291 | "" 292 | ] 293 | }, 294 | { 295 | "cell_type": "markdown", 296 | "metadata": { 297 | "coq_kernel_metadata": { 298 | "auto_roll_back": true 299 | } 300 | }, 301 | "source": [ 302 | "これで、定理 Hello_Coq の証明は、終了です。\n", 303 | "\n", 304 | "\n", 305 | "\n", 306 | "# Coqとのはじめての対話をふりかえる。\n", 307 | "\n", 308 | "Coqとのはじめての対話を、人間の側とCoqの側の、それぞれから振り返ってみましょう。\n", 309 | "\n", 310 | "\n", 311 | "## 人間は、Coqに何を伝えたか?\n", 312 | "\n", 313 | "人間が、Coqに伝えた一連の命令を抜き出してみましょう。次のようになります。" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": 1, 319 | "metadata": { 320 | "coq_kernel_metadata": { 321 | "auto_roll_back": true, 322 | "cell_id": "f6945826b13e445788c25fbd1254ca52", 323 | "execution_id": "548394fdcbcd42faa4958c4cadd30d99" 324 | }, 325 | "scrolled": true 326 | }, 327 | "outputs": [ 328 | { 329 | "data": { 330 | "text/html": [ 331 | "\n", 332 | "
\n", 333 | "
\n",
334 |        "
\n", 335 | "\n", 336 | "
\n", 337 | " \n", 338 | " Cell evaluated.\n", 339 | "
\n", 340 | "\n", 341 | "
\n", 342 | " \n", 343 | " Cell rolled back.\n", 344 | "
\n", 345 | "\n", 346 | "
\n", 347 | " \n", 351 | "\n", 352 | "
\n", 353 | " \n", 354 | " Auto rollback\n", 355 | "
\n", 356 | "
\n" 357 | ], 358 | "text/plain": [] 359 | }, 360 | "execution_count": 6, 361 | "metadata": { 362 | "coq_kernel_evaluated": true, 363 | "coq_kernel_execution_id": "548394fdcbcd42faa4958c4cadd30d99", 364 | "coq_kernel_rolled_back": false 365 | }, 366 | "output_type": "execute_result" 367 | } 368 | ], 369 | "source": [ 370 | "Theorem Hello_Coq' : (forall A : Prop, A -> A ).\n", 371 | "Proof.\n", 372 | " intros.\n", 373 | " exact H.\n", 374 | "Qed." 375 | ] 376 | }, 377 | { 378 | "cell_type": "markdown", 379 | "metadata": { 380 | "coq_kernel_metadata": { 381 | "auto_roll_back": true 382 | } 383 | }, 384 | "source": [ 385 | "これだけ見ていると、これが定理Hello_Coq (forall A : Prop, A -> A )の証明とは、とても思えないと思います。\n", 386 | "逆に、定理Hello_Coq が与えられた時、上のような証明をすぐに思いつくことは、ほとんどの人にはできないと思います。\n", 387 | "\n", 388 | "それには理由があります。Coqの証明は、人間とCoqの「対話」を通じて進行します。人間は、Coqの反応を見て、証明を進めるために次にCoqに何を命ずるかを考えます。そのやり取りの過程が省略されて、その結果だけを抜き出しても、その命令を選択した意図は見えてきません。\n", 389 | "\n", 390 | "### 証明を進めるために、人間がCoqに与える命令を tactic と呼びます。\n", 391 | "\n", 392 | "tactic というのは「戦略」という意味ですね。Coqの反応を見て、証明を進めるために、どのような攻め方をするのかと考えて出てきた結論が、あるtacticを選択するということです。なぜ、あるtactic が選ばれたかは、tacticの選択の直前のCoqの反応を見てみないとわかりません。この例では、introsやexact H がtacticです。\n", 393 | "\n", 394 | "一方、人間の入力のうち、Theorem や Proof やQed は、証明の進め方やCoqの反応とは直接は関係がありません。これらは、tactics とは別のグループのCoqの命令群に族します。これらのCoqコマンドは、大文字で始まっています。tactics は小文字から始まりますので、区別は容易です。\n", 395 | "\n", 396 | "### 完成した証明を、「対話」なしに、人間はCoqに与えることができます。\n", 397 | "\n", 398 | "では、ある証明が正しいことを示すために、人間は、Coqとの「対話」を毎回繰り返す必要があるのでしょうか? そうでは、ありません。先のセルを実行してみてください。\"Cell evaluated.\"が出て、証明がすぐに終わることが確認できます。\n", 399 | "\n", 400 | "人間とCoqが「対話」していったん完成した証明は、人間はtactic ごとのCoqの反応を見ることなく、それを丸ごとCoqに与えることで証明を実行することができます。これは、証明の完成のためにCoqと「対話」した相手が誰であろうと構わないという点で、実践的には、とても重要なことです。我々は、第三者の行なった証明を、利用することができるのです。ただし、これは、人間はとCoqとの「対話」を通じて証明を作っていく過程とは区別されるべき、「証明の検証」 ともいうべきものです。\n", 401 | "\n", 402 | "上のセルのことを、「これだけ見ていると、これが定理Hello_Coq (forall A : Prop, A -> A )の証明とは、とても思えない」と、先ほど書きましたが、それは人間にとってのこと。Coqは、これを正しく証明として認識し、それが正しい証明かチェックできます。\n", 403 | "\n", 404 | "\n", 405 | "\n", 406 | "\n" 407 | ] 408 | }, 409 | { 410 | "cell_type": "markdown", 411 | "metadata": { 412 | "coq_kernel_metadata": { 413 | "auto_roll_back": true 414 | } 415 | }, 416 | "source": [ 417 | "
\n", 418 | " 先に実行したセルの中では、定理の名前が、元のHello_CoqからHello_Coq'に変更されています(最後にダッシュ=プライムが追加されている)それは、元の名前の定理が、このページの演習の中で、すでに「証明済」になっていて、再度の証明の実行が開始できないからです。\n", 419 | "
\n", 420 | "\n", 421 | "\n", 422 | "## Coqは、反応として人間に何を伝えたか?\n", 423 | "\n", 424 | "ここでは、先の例での人間が intros と打ち込んだ時のCoqの反応を、改めて、見ることにしましょう。\n", 425 | "次のような情報が含まれていることがわかります。\n", 426 | "\n", 427 | "- 証明中の定理の名前\n", 428 | "- 証明すべきサブゴールの数\n", 429 | "- 証明の状態を表す大事な情報\n", 430 | "( この情報は、横線の上下で大きく二つに分かれています。)\n", 431 | " - サブゴールを証明するにあたって前提として利用できる仮説\n", 432 | " - 証明すべきサブゴール\n", 433 | " \n", 434 | " \n" 435 | ] 436 | }, 437 | { 438 | "cell_type": "code", 439 | "execution_count": null, 440 | "metadata": { 441 | "coq_kernel_metadata": { 442 | "auto_roll_back": true 443 | } 444 | }, 445 | "outputs": [], 446 | "source": [] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": null, 451 | "metadata": { 452 | "coq_kernel_metadata": { 453 | "auto_roll_back": true 454 | } 455 | }, 456 | "outputs": [], 457 | "source": [] 458 | }, 459 | { 460 | "cell_type": "markdown", 461 | "metadata": { 462 | "coq_kernel_metadata": { 463 | "auto_roll_back": true 464 | } 465 | }, 466 | "source": [ 467 | "### Coqの反応には、当面の証明で集中すべきサブゴールが含まれています。\n", 468 | "\n", 469 | "Coqが返す反応で一番大事なのは、その時点での「証明の状態」を表す情報です。その状態は、直前に人間が投入した tactic コマンドによって変化します。tactics は、まさに、証明の状態を変化させるために、人間が利用するコマンドです。あるtactics コマンドが、どのように証明の状態を変化させるかについては、次章以降で説明したいと思います。ここでは、それについては触れません。ただ、ここでは、「証明の状態」の情報のうち、「サブゴール」といわれるものだけに注目しましょう。\n", 470 | "\n", 471 | "Coqの反応の中に含まれるサブゴールというのは、「当面は、この問題の証明に集中しようよ」という、Coqから人間へのサジェスションです。Coqから人間への指示と思っても構いません。人間とCoqは、大きな問題を複数のより簡単な問題に分割して、一つづつ分割された問題を解こうとします。こうして分割された問題の一つが、サブゴールです。ですので、ある問題を解くために必要なサブゴールの数は、一つとは限りません。\n", 472 | "\n", 473 | "次の例は、destruct というtactic を実行した結果、二つのサブゴールを持つ証明の状態が生まれたことを示しています。\n", 474 | " \n" 475 | ] 476 | }, 477 | { 478 | "cell_type": "markdown", 479 | "metadata": { 480 | "coq_kernel_metadata": { 481 | "auto_roll_back": true 482 | } 483 | }, 484 | "source": [ 485 | "### Coqでの証明の最終目標は、サブゴールをなくすことです。\n", 486 | "\n", 487 | "先に述べたように、Coqは、元の問題をより簡単な問題(サブゴール)に分解して、それをすべて解こうとします。すべてのサブゴールが解かれたとき、元の問題の証明が終わります。別の言い方をすれば、Coqでの証明の最終的な目標は、証明されていないサブゴールの数をゼロにすることです。\n", 488 | "\n", 489 | "# 次章の目標\n", 490 | "\n", 491 | "次の章は、Coqでの論理式の証明を取り上げます。この章では詳しく触れなかった、あるtactic が証明の状態をどのように変化させるのかを学びます。" 492 | ] 493 | }, 494 | { 495 | "cell_type": "markdown", 496 | "metadata": { 497 | "coq_kernel_metadata": { 498 | "auto_roll_back": true 499 | } 500 | }, 501 | "source": [ 502 | "    [全体目次](./0-Contents.ipynb)  [この章の演習問題へ](./1-logic-answer.ipynb)  [前の章へ](./0-Introduction.ipynb)  [次の章へ](./2-Equality.ipynb)" 503 | ] 504 | } 505 | ], 506 | "metadata": { 507 | "kernelspec": { 508 | "display_name": "Coq", 509 | "language": "coq", 510 | "name": "coq" 511 | }, 512 | "language_info": { 513 | "file_extension": ".v", 514 | "mimetype": "text/x-coq", 515 | "name": "coq", 516 | "version": "8.9.1" 517 | } 518 | }, 519 | "nbformat": 4, 520 | "nbformat_minor": 2 521 | } 522 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Equal-Ex-Work-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# 演習問題 2 作業用ページ\n", 12 | "\n", 13 | "[演習問題 2-1](./Equal-Ex-Work.ipynb#ex21) [演習問題 2-2](./Equal-Ex-Work.ipynb#ex22) [演習問題 2-3](./Equal-Ex-Work.ipynb#ex23) [演習問題 2-4](./Equal-Ex-Work.ipynb#ex24) [演習問題 2-5](./Equal-Ex-Work.ipynb#ex25) [演習問題 2-6](./Equal-Ex-Work.ipynb#ex26) [演習問題 2-7](./Equal-Ex-Work.ipynb#ex27) " 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "coq_kernel_metadata": { 20 | "auto_roll_back": true 21 | } 22 | }, 23 | "source": [ 24 | "\n", 25 | "## 演習問題 2-1\n", 26 | " 次の定理を証明せよ。\n", 27 | "
 Theorem plus_O_n : (forall n : nat , 0+n = n ).
\n", 28 | "\n", 29 | "### ヒント\n", 30 | "- 冒頭の forall を intros で削除する。\n", 31 | "- A -> A の最初のAを intros で仮説に入れる。\n", 32 | "- そうすると、サブゴールが仮説の一つと一致していることがわかるので、assumption または、exact を使う。\n", 33 | "\n", 34 | "### [解答を見る](./Equal-Ex-Answer.ipynb#ex21) " 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": null, 40 | "metadata": { 41 | "coq_kernel_metadata": { 42 | "auto_roll_back": true 43 | } 44 | }, 45 | "outputs": [], 46 | "source": [ 47 | "Theorem plus_O_n : (forall n : nat , 0+n = n ).\n", 48 | "Proof." 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": null, 54 | "metadata": { 55 | "coq_kernel_metadata": { 56 | "auto_roll_back": true 57 | } 58 | }, 59 | "outputs": [], 60 | "source": [] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": null, 65 | "metadata": { 66 | "coq_kernel_metadata": { 67 | "auto_roll_back": true 68 | } 69 | }, 70 | "outputs": [], 71 | "source": [] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": null, 76 | "metadata": { 77 | "coq_kernel_metadata": { 78 | "auto_roll_back": true 79 | } 80 | }, 81 | "outputs": [], 82 | "source": [] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": null, 87 | "metadata": { 88 | "coq_kernel_metadata": { 89 | "auto_roll_back": true 90 | } 91 | }, 92 | "outputs": [], 93 | "source": [] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": null, 98 | "metadata": { 99 | "coq_kernel_metadata": { 100 | "auto_roll_back": true 101 | } 102 | }, 103 | "outputs": [], 104 | "source": [] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": null, 109 | "metadata": { 110 | "coq_kernel_metadata": { 111 | "auto_roll_back": true 112 | } 113 | }, 114 | "outputs": [], 115 | "source": [ 116 | "Admitted. (* 最後にここを Qed. に変える。*)" 117 | ] 118 | }, 119 | { 120 | "cell_type": "markdown", 121 | "metadata": { 122 | "coq_kernel_metadata": { 123 | "auto_roll_back": true 124 | } 125 | }, 126 | "source": [ 127 | "\n", 128 | "## 演習問題 2-2\n", 129 | " 次の定理を証明せよ。\n", 130 | "
Theorem plus_1_n : (forall n : nat , 1+n = S n ).
\n", 131 | "\n", 132 | "### ヒント\n", 133 | "- intros で forall を削除する。\n", 134 | "- simpl. で、サブゴールの計算式を簡単にする。\n", 135 | "- 左項と右項が等しかったら reflexivity を使う。\n", 136 | "\n", 137 | "### [解答を見る](./Equal-Ex-Answer.ipynb#ex22) " 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": null, 143 | "metadata": { 144 | "coq_kernel_metadata": { 145 | "auto_roll_back": true 146 | } 147 | }, 148 | "outputs": [], 149 | "source": [ 150 | "Theorem plus_1_n : (forall n : nat , 1+n = S n ).\n", 151 | "Proof." 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": null, 157 | "metadata": { 158 | "coq_kernel_metadata": { 159 | "auto_roll_back": true 160 | } 161 | }, 162 | "outputs": [], 163 | "source": [] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": null, 168 | "metadata": { 169 | "coq_kernel_metadata": { 170 | "auto_roll_back": true 171 | } 172 | }, 173 | "outputs": [], 174 | "source": [] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": null, 179 | "metadata": { 180 | "coq_kernel_metadata": { 181 | "auto_roll_back": true 182 | } 183 | }, 184 | "outputs": [], 185 | "source": [] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": null, 190 | "metadata": { 191 | "coq_kernel_metadata": { 192 | "auto_roll_back": true 193 | } 194 | }, 195 | "outputs": [], 196 | "source": [] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": null, 201 | "metadata": { 202 | "coq_kernel_metadata": { 203 | "auto_roll_back": true 204 | } 205 | }, 206 | "outputs": [], 207 | "source": [] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": null, 212 | "metadata": { 213 | "coq_kernel_metadata": { 214 | "auto_roll_back": true 215 | } 216 | }, 217 | "outputs": [], 218 | "source": [] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": null, 223 | "metadata": { 224 | "coq_kernel_metadata": { 225 | "auto_roll_back": true 226 | } 227 | }, 228 | "outputs": [], 229 | "source": [] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": null, 234 | "metadata": { 235 | "coq_kernel_metadata": { 236 | "auto_roll_back": true 237 | } 238 | }, 239 | "outputs": [], 240 | "source": [ 241 | "Admitted. (* 最後にここを Qed. に変える。*)" 242 | ] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "metadata": { 247 | "coq_kernel_metadata": { 248 | "auto_roll_back": true 249 | } 250 | }, 251 | "source": [ 252 | "\n", 253 | "## 演習問題 2-3\n", 254 | " 次の定理を証明せよ。\n", 255 | "
Theorem mult_0_n : (forall n : nat , 0 * n = 0 ).
\n", 256 | "\n", 257 | "### ヒント\n", 258 | "- intros で forall を削除する。\n", 259 | "- simpl. で、サブゴールの計算式を簡単にする。\n", 260 | "- 左項と右項が等しかったら reflexivity を使う。\n", 261 | "\n", 262 | "### [解答を見る](./Equal-Ex-Answer.ipynb#ex23) " 263 | ] 264 | }, 265 | { 266 | "cell_type": "markdown", 267 | "metadata": { 268 | "coq_kernel_metadata": { 269 | "auto_roll_back": true 270 | } 271 | }, 272 | "source": [ 273 | "\n", 274 | "## 演習問題 2-4\n", 275 | " 次の定理を証明せよ。\n", 276 | "
Theorem plus_id_nm : (forall n m : nat , n = m -> n+n = m + m ).
\n", 277 | "\n", 278 | "### ヒント\n", 279 | "- intros で forall を消す。\n", 280 | "- サブゴールの前提部分を intros で仮定に移す。\n", 281 | "- サブゴールの左項を、等式Hを使って rewriite で書き換える。\n", 282 | "- サブゴールの左項と右項が等しいので、reflexivity を使う。\n", 283 | "\n", 284 | "### [解答を見る](./Equal-Ex-Answer.ipynb#ex24) " 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": null, 290 | "metadata": { 291 | "coq_kernel_metadata": { 292 | "auto_roll_back": true 293 | } 294 | }, 295 | "outputs": [], 296 | "source": [ 297 | "Theorem plus_id_nm : (forall n m : nat , n = m -> n+n = m + m ).\n", 298 | "Proof." 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": null, 304 | "metadata": { 305 | "coq_kernel_metadata": { 306 | "auto_roll_back": true 307 | } 308 | }, 309 | "outputs": [], 310 | "source": [] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": null, 315 | "metadata": { 316 | "coq_kernel_metadata": { 317 | "auto_roll_back": true 318 | } 319 | }, 320 | "outputs": [], 321 | "source": [] 322 | }, 323 | { 324 | "cell_type": "code", 325 | "execution_count": null, 326 | "metadata": { 327 | "coq_kernel_metadata": { 328 | "auto_roll_back": true 329 | } 330 | }, 331 | "outputs": [], 332 | "source": [] 333 | }, 334 | { 335 | "cell_type": "code", 336 | "execution_count": null, 337 | "metadata": { 338 | "coq_kernel_metadata": { 339 | "auto_roll_back": true 340 | } 341 | }, 342 | "outputs": [], 343 | "source": [] 344 | }, 345 | { 346 | "cell_type": "code", 347 | "execution_count": null, 348 | "metadata": { 349 | "coq_kernel_metadata": { 350 | "auto_roll_back": true 351 | } 352 | }, 353 | "outputs": [], 354 | "source": [] 355 | }, 356 | { 357 | "cell_type": "code", 358 | "execution_count": null, 359 | "metadata": { 360 | "coq_kernel_metadata": { 361 | "auto_roll_back": true 362 | } 363 | }, 364 | "outputs": [], 365 | "source": [ 366 | "Admitted. (* 最後にここを Qed. に変える。*)" 367 | ] 368 | }, 369 | { 370 | "cell_type": "markdown", 371 | "metadata": { 372 | "coq_kernel_metadata": { 373 | "auto_roll_back": true 374 | } 375 | }, 376 | "source": [ 377 | "\n", 378 | "## 演習問題 2-5\n", 379 | " 次の定理を証明せよ。\n", 380 | "
Theorem plus_id : (forall n m o : nat , n = m -> m = o -> n + m = m + o ).
\n", 381 | "\n", 382 | "### ヒント\n", 383 | "- intros で forall を削除 \n", 384 | "- intoros で、前提部分を仮説に移す。\n", 385 | "- 等式 n_eq_m の左辺 を使って、rewriteでサブゴールを書き換える。\n", 386 | "- 等式 m_eq_o の右辺を使って、rewriteでサブゴールのを書き換える。\n", 387 | "- サブゴールの等式の左辺と右辺が等しくなるので reflexivity を使う。\n", 388 | "\n", 389 | "### [解答を見る](./Equal-Ex-Answer.ipynb#ex25) " 390 | ] 391 | }, 392 | { 393 | "cell_type": "code", 394 | "execution_count": null, 395 | "metadata": { 396 | "coq_kernel_metadata": { 397 | "auto_roll_back": true 398 | } 399 | }, 400 | "outputs": [], 401 | "source": [ 402 | "Theorem plus_id : (forall n m o : nat , n = m -> m = o -> n + m = m + o ).\n", 403 | "Proof." 404 | ] 405 | }, 406 | { 407 | "cell_type": "code", 408 | "execution_count": null, 409 | "metadata": { 410 | "coq_kernel_metadata": { 411 | "auto_roll_back": true 412 | } 413 | }, 414 | "outputs": [], 415 | "source": [] 416 | }, 417 | { 418 | "cell_type": "code", 419 | "execution_count": null, 420 | "metadata": { 421 | "coq_kernel_metadata": { 422 | "auto_roll_back": true 423 | } 424 | }, 425 | "outputs": [], 426 | "source": [] 427 | }, 428 | { 429 | "cell_type": "code", 430 | "execution_count": null, 431 | "metadata": { 432 | "coq_kernel_metadata": { 433 | "auto_roll_back": true 434 | } 435 | }, 436 | "outputs": [], 437 | "source": [] 438 | }, 439 | { 440 | "cell_type": "code", 441 | "execution_count": null, 442 | "metadata": { 443 | "coq_kernel_metadata": { 444 | "auto_roll_back": true 445 | } 446 | }, 447 | "outputs": [], 448 | "source": [] 449 | }, 450 | { 451 | "cell_type": "code", 452 | "execution_count": null, 453 | "metadata": { 454 | "coq_kernel_metadata": { 455 | "auto_roll_back": true 456 | } 457 | }, 458 | "outputs": [], 459 | "source": [] 460 | }, 461 | { 462 | "cell_type": "code", 463 | "execution_count": null, 464 | "metadata": { 465 | "coq_kernel_metadata": { 466 | "auto_roll_back": true 467 | } 468 | }, 469 | "outputs": [], 470 | "source": [] 471 | }, 472 | { 473 | "cell_type": "code", 474 | "execution_count": null, 475 | "metadata": { 476 | "coq_kernel_metadata": { 477 | "auto_roll_back": true 478 | } 479 | }, 480 | "outputs": [], 481 | "source": [] 482 | }, 483 | { 484 | "cell_type": "code", 485 | "execution_count": null, 486 | "metadata": { 487 | "coq_kernel_metadata": { 488 | "auto_roll_back": true 489 | } 490 | }, 491 | "outputs": [], 492 | "source": [] 493 | }, 494 | { 495 | "cell_type": "code", 496 | "execution_count": null, 497 | "metadata": { 498 | "coq_kernel_metadata": { 499 | "auto_roll_back": true 500 | } 501 | }, 502 | "outputs": [], 503 | "source": [] 504 | }, 505 | { 506 | "cell_type": "code", 507 | "execution_count": null, 508 | "metadata": { 509 | "coq_kernel_metadata": { 510 | "auto_roll_back": true 511 | } 512 | }, 513 | "outputs": [], 514 | "source": [ 515 | "Admitted. (* 最後にここを Qed. に変える。*)" 516 | ] 517 | }, 518 | { 519 | "cell_type": "markdown", 520 | "metadata": { 521 | "coq_kernel_metadata": { 522 | "auto_roll_back": true 523 | } 524 | }, 525 | "source": [ 526 | "\n", 527 | "## 演習問題 2-6\n", 528 | " 次の定理を証明せよ。\n", 529 | "
Theorem mult_0_plus : (forall n m : nat , ( 0 + n ) \\* m = n \\* m ).
\n", 530 | "\n", 531 | "### ヒント\n", 532 | "- intros で forall を消す。\n", 533 | "- simpl. で、サブゴール中の計算式を簡単なものにする。\n", 534 | "- 左辺と右辺が等しいので、reflexivity を使う。\n", 535 | "\n", 536 | "### [解答を見る](./Equal-Ex-Answer.ipynb#ex26) " 537 | ] 538 | }, 539 | { 540 | "cell_type": "code", 541 | "execution_count": null, 542 | "metadata": { 543 | "coq_kernel_metadata": { 544 | "auto_roll_back": true 545 | } 546 | }, 547 | "outputs": [], 548 | "source": [ 549 | "Theorem mult_0_plus : (forall n m : nat , ( 0 + n ) * m = n * m )." 550 | ] 551 | }, 552 | { 553 | "cell_type": "code", 554 | "execution_count": null, 555 | "metadata": { 556 | "coq_kernel_metadata": { 557 | "auto_roll_back": true 558 | } 559 | }, 560 | "outputs": [], 561 | "source": [] 562 | }, 563 | { 564 | "cell_type": "code", 565 | "execution_count": null, 566 | "metadata": { 567 | "coq_kernel_metadata": { 568 | "auto_roll_back": true 569 | } 570 | }, 571 | "outputs": [], 572 | "source": [] 573 | }, 574 | { 575 | "cell_type": "code", 576 | "execution_count": null, 577 | "metadata": { 578 | "coq_kernel_metadata": { 579 | "auto_roll_back": true 580 | } 581 | }, 582 | "outputs": [], 583 | "source": [] 584 | }, 585 | { 586 | "cell_type": "code", 587 | "execution_count": null, 588 | "metadata": { 589 | "coq_kernel_metadata": { 590 | "auto_roll_back": true 591 | } 592 | }, 593 | "outputs": [], 594 | "source": [] 595 | }, 596 | { 597 | "cell_type": "code", 598 | "execution_count": null, 599 | "metadata": { 600 | "coq_kernel_metadata": { 601 | "auto_roll_back": true 602 | } 603 | }, 604 | "outputs": [], 605 | "source": [] 606 | }, 607 | { 608 | "cell_type": "code", 609 | "execution_count": null, 610 | "metadata": { 611 | "coq_kernel_metadata": { 612 | "auto_roll_back": true 613 | } 614 | }, 615 | "outputs": [], 616 | "source": [] 617 | }, 618 | { 619 | "cell_type": "code", 620 | "execution_count": null, 621 | "metadata": { 622 | "coq_kernel_metadata": { 623 | "auto_roll_back": true 624 | } 625 | }, 626 | "outputs": [], 627 | "source": [] 628 | }, 629 | { 630 | "cell_type": "code", 631 | "execution_count": null, 632 | "metadata": { 633 | "coq_kernel_metadata": { 634 | "auto_roll_back": true 635 | } 636 | }, 637 | "outputs": [], 638 | "source": [ 639 | "Admitted. (* 最後にここを Qed. に変える。*)" 640 | ] 641 | }, 642 | { 643 | "cell_type": "markdown", 644 | "metadata": { 645 | "coq_kernel_metadata": { 646 | "auto_roll_back": true 647 | } 648 | }, 649 | "source": [ 650 | "\n", 651 | "## 演習問題 2-7\n", 652 | " 次の定理を証明せよ。\n", 653 | "
Theorem mult_S_1 : (forall n m : nat, m = S n -> m \\* (1 + n) = m \\* m).
\n", 654 | "\n", 655 | "### ヒント\n", 656 | "- intros で forall を消し、前提を仮説に移す。\n", 657 | "- サブゴールの計算式を simpl で簡単にする。\n", 658 | "- rewriteで、サブゴールを m_eq_Sn を使って書き換える。\n", 659 | "- サブゴールの左辺と右辺は等しい。\n", 660 | "\n", 661 | "### [解答を見る](./Equal-Ex-Answer.ipynb#ex27) " 662 | ] 663 | }, 664 | { 665 | "cell_type": "code", 666 | "execution_count": null, 667 | "metadata": { 668 | "coq_kernel_metadata": { 669 | "auto_roll_back": true 670 | } 671 | }, 672 | "outputs": [], 673 | "source": [ 674 | "Theorem mult_S_1 : (forall n m : nat, m = S n -> m * (1 + n) = m * m).\n", 675 | "Proof." 676 | ] 677 | }, 678 | { 679 | "cell_type": "code", 680 | "execution_count": null, 681 | "metadata": { 682 | "coq_kernel_metadata": { 683 | "auto_roll_back": true 684 | } 685 | }, 686 | "outputs": [], 687 | "source": [] 688 | }, 689 | { 690 | "cell_type": "code", 691 | "execution_count": null, 692 | "metadata": { 693 | "coq_kernel_metadata": { 694 | "auto_roll_back": true 695 | } 696 | }, 697 | "outputs": [], 698 | "source": [] 699 | }, 700 | { 701 | "cell_type": "code", 702 | "execution_count": null, 703 | "metadata": { 704 | "coq_kernel_metadata": { 705 | "auto_roll_back": true 706 | } 707 | }, 708 | "outputs": [], 709 | "source": [] 710 | }, 711 | { 712 | "cell_type": "code", 713 | "execution_count": null, 714 | "metadata": { 715 | "coq_kernel_metadata": { 716 | "auto_roll_back": true 717 | } 718 | }, 719 | "outputs": [], 720 | "source": [] 721 | }, 722 | { 723 | "cell_type": "code", 724 | "execution_count": null, 725 | "metadata": { 726 | "coq_kernel_metadata": { 727 | "auto_roll_back": true 728 | } 729 | }, 730 | "outputs": [], 731 | "source": [] 732 | }, 733 | { 734 | "cell_type": "code", 735 | "execution_count": null, 736 | "metadata": { 737 | "coq_kernel_metadata": { 738 | "auto_roll_back": true 739 | } 740 | }, 741 | "outputs": [], 742 | "source": [] 743 | }, 744 | { 745 | "cell_type": "code", 746 | "execution_count": null, 747 | "metadata": { 748 | "coq_kernel_metadata": { 749 | "auto_roll_back": true 750 | } 751 | }, 752 | "outputs": [], 753 | "source": [] 754 | }, 755 | { 756 | "cell_type": "code", 757 | "execution_count": null, 758 | "metadata": { 759 | "coq_kernel_metadata": { 760 | "auto_roll_back": true 761 | } 762 | }, 763 | "outputs": [], 764 | "source": [ 765 | "Admitted. (* 最後にここを Qed. に変える。*)" 766 | ] 767 | } 768 | ], 769 | "metadata": { 770 | "kernelspec": { 771 | "display_name": "Coq", 772 | "language": "coq", 773 | "name": "coq" 774 | }, 775 | "language_info": { 776 | "file_extension": ".v", 777 | "mimetype": "text/x-coq", 778 | "name": "coq", 779 | "version": "8.9.1" 780 | } 781 | }, 782 | "nbformat": 4, 783 | "nbformat_minor": 2 784 | } 785 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Equal-Ex-Answer-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# 演習問題 2 解答\n", 12 | "\n", 13 | "[演習問題 2-1](./Equal-Ex-Answer.ipynb#ex21) [演習問題 2-2](./Equal-Ex-Answer.ipynb#ex22) [演習問題 2-3](./Equal-Ex-Answer.ipynb#ex23) [演習問題 2-4](./Equal-Ex-Answer.ipynb#ex24) [演習問題 2-5](./Equal-Ex-Answer.ipynb#ex25) [演習問題 2-6](./Equal-Ex-Answer.ipynb#ex26) [演習問題 2-7](./Equal-Ex-Answer.ipynb#ex27) " 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "coq_kernel_metadata": { 20 | "auto_roll_back": true 21 | } 22 | }, 23 | "source": [ 24 | "\n", 25 | "## 演習問題 2-1\n", 26 | " 次の定理を証明せよ。\n", 27 | "
 Theorem plus_O_n : (forall n : nat , 0+n = n ).
\n", 28 | "\n", 29 | "[作業用ページで証明をして見る](./Equal-Ex-Work.ipynb#ex21) / [演習問題に戻る](./Equal-Ex.ipynb#ex21 ) \n", 30 | "\n", 31 | "## 解答\n", 32 | "```\n", 33 | "Theorem plus_O_n : (forall n : nat , 0+n = n ).\n", 34 | "Proof.\n", 35 | " intro n.\n", 36 | " simpl.\n", 37 | " reflexivity.\n", 38 | "Qed. \n", 39 | "```\n", 40 | "\n", 41 | "### 下のCellを実行して確かめよ。" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": null, 47 | "metadata": { 48 | "coq_kernel_metadata": { 49 | "auto_roll_back": true 50 | } 51 | }, 52 | "outputs": [], 53 | "source": [ 54 | "Theorem plus_O_n : (forall n : nat , 0+n = n ).\n", 55 | "Proof.\n", 56 | " intro n.\n", 57 | " simpl.\n", 58 | " reflexivity.\n", 59 | "Qed. " 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": { 65 | "coq_kernel_metadata": { 66 | "auto_roll_back": true 67 | } 68 | }, 69 | "source": [ 70 | "### 次のCell を一つづつ実行して、各tacticsの働きを確認せよ。" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": null, 76 | "metadata": { 77 | "coq_kernel_metadata": { 78 | "auto_roll_back": true 79 | } 80 | }, 81 | "outputs": [], 82 | "source": [ 83 | "Theorem plus_O_n' : (forall n : nat , 0+n = n ).\n", 84 | "Proof." 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": null, 90 | "metadata": { 91 | "coq_kernel_metadata": { 92 | "auto_roll_back": true 93 | } 94 | }, 95 | "outputs": [], 96 | "source": [ 97 | " intro n." 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": null, 103 | "metadata": { 104 | "coq_kernel_metadata": { 105 | "auto_roll_back": true 106 | } 107 | }, 108 | "outputs": [], 109 | "source": [ 110 | " simpl." 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": null, 116 | "metadata": { 117 | "coq_kernel_metadata": { 118 | "auto_roll_back": true 119 | } 120 | }, 121 | "outputs": [], 122 | "source": [ 123 | " reflexivity." 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": null, 129 | "metadata": { 130 | "coq_kernel_metadata": { 131 | "auto_roll_back": true 132 | } 133 | }, 134 | "outputs": [], 135 | "source": [ 136 | "Qed. " 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": { 142 | "coq_kernel_metadata": { 143 | "auto_roll_back": true 144 | } 145 | }, 146 | "source": [ 147 | "\n", 148 | "## 演習問題 2-2\n", 149 | " 次の定理を証明せよ。\n", 150 | "
Theorem plus_1_n : (forall n : nat , 1+n = S n ).
\n", 151 | "\n", 152 | "[作業用ページで証明をして見る](./Equal-Ex-Work.ipynb#ex22) / [演習問題に戻る](./Equal-Ex.ipynb#ex22 ) \n", 153 | "\n", 154 | "## 解答\n", 155 | "```\n", 156 | "Theorem plus_1_n : (forall n : nat , 1+n = S n ).\n", 157 | "Proof.\n", 158 | " intros n.\n", 159 | " simpl.\n", 160 | " reflexivity.\n", 161 | "Qed.\n", 162 | "```\n", 163 | "\n", 164 | "### 下のCellを実行して確かめよ。" 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": null, 170 | "metadata": { 171 | "coq_kernel_metadata": { 172 | "auto_roll_back": true 173 | } 174 | }, 175 | "outputs": [], 176 | "source": [ 177 | "Theorem plus_1_n : (forall n : nat , 1+n = S n ).\n", 178 | "Proof.\n", 179 | " intros n.\n", 180 | " simpl.\n", 181 | " reflexivity.\n", 182 | "Qed." 183 | ] 184 | }, 185 | { 186 | "cell_type": "markdown", 187 | "metadata": { 188 | "coq_kernel_metadata": { 189 | "auto_roll_back": true 190 | } 191 | }, 192 | "source": [ 193 | "### 次のCell を一つづつ実行して、各tacticsの働きを確認せよ。" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": null, 199 | "metadata": { 200 | "coq_kernel_metadata": { 201 | "auto_roll_back": true 202 | } 203 | }, 204 | "outputs": [], 205 | "source": [ 206 | "Theorem plus_1_n' : (forall n : nat , 1+n = S n ).\n", 207 | "Proof." 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": null, 213 | "metadata": { 214 | "coq_kernel_metadata": { 215 | "auto_roll_back": true 216 | } 217 | }, 218 | "outputs": [], 219 | "source": [ 220 | " intros n." 221 | ] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "execution_count": null, 226 | "metadata": { 227 | "coq_kernel_metadata": { 228 | "auto_roll_back": true 229 | } 230 | }, 231 | "outputs": [], 232 | "source": [ 233 | " simpl." 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": null, 239 | "metadata": { 240 | "coq_kernel_metadata": { 241 | "auto_roll_back": true 242 | } 243 | }, 244 | "outputs": [], 245 | "source": [ 246 | " reflexivity." 247 | ] 248 | }, 249 | { 250 | "cell_type": "code", 251 | "execution_count": null, 252 | "metadata": { 253 | "coq_kernel_metadata": { 254 | "auto_roll_back": true 255 | } 256 | }, 257 | "outputs": [], 258 | "source": [ 259 | "Qed." 260 | ] 261 | }, 262 | { 263 | "cell_type": "markdown", 264 | "metadata": { 265 | "coq_kernel_metadata": { 266 | "auto_roll_back": true 267 | } 268 | }, 269 | "source": [ 270 | "\n", 271 | "## 演習問題 2-3\n", 272 | " 次の定理を証明せよ。\n", 273 | "
Theorem mult_0_n : (forall n : nat , 0 * n = 0 ).
\n", 274 | "\n", 275 | "[作業用ページで証明をして見る](./Equal-Ex-Work.ipynb#ex23) / [演習問題に戻る](./Equal-Ex.ipynb#ex23 ) \n", 276 | "\n", 277 | "## 解答\n", 278 | "```\n", 279 | "Theorem mult_0_n : (forall n : nat , 0 * n = 0 ).\n", 280 | "Proof.\n", 281 | " intros n.\n", 282 | " simpl.\n", 283 | " reflexivity.\n", 284 | "Qed.\n", 285 | "```\n", 286 | "\n", 287 | "### 下のCellを実行して確かめよ。" 288 | ] 289 | }, 290 | { 291 | "cell_type": "code", 292 | "execution_count": null, 293 | "metadata": { 294 | "coq_kernel_metadata": { 295 | "auto_roll_back": true 296 | } 297 | }, 298 | "outputs": [], 299 | "source": [ 300 | "Theorem mult_0_n : (forall n : nat , 0 * n = 0 ).\n", 301 | "Proof.\n", 302 | " intros n.\n", 303 | " simpl.\n", 304 | " reflexivity.\n", 305 | "Qed." 306 | ] 307 | }, 308 | { 309 | "cell_type": "markdown", 310 | "metadata": { 311 | "coq_kernel_metadata": { 312 | "auto_roll_back": true 313 | } 314 | }, 315 | "source": [ 316 | "### 次のCell を一つづつ実行して、各tacticsの働きを確認せよ。" 317 | ] 318 | }, 319 | { 320 | "cell_type": "code", 321 | "execution_count": null, 322 | "metadata": { 323 | "coq_kernel_metadata": { 324 | "auto_roll_back": true 325 | } 326 | }, 327 | "outputs": [], 328 | "source": [ 329 | "Theorem mult_0_n' : (forall n : nat , 0 * n = 0 ).\n", 330 | "Proof." 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": null, 336 | "metadata": { 337 | "coq_kernel_metadata": { 338 | "auto_roll_back": true 339 | } 340 | }, 341 | "outputs": [], 342 | "source": [ 343 | " intros n." 344 | ] 345 | }, 346 | { 347 | "cell_type": "code", 348 | "execution_count": null, 349 | "metadata": { 350 | "coq_kernel_metadata": { 351 | "auto_roll_back": true 352 | } 353 | }, 354 | "outputs": [], 355 | "source": [ 356 | " simpl." 357 | ] 358 | }, 359 | { 360 | "cell_type": "code", 361 | "execution_count": null, 362 | "metadata": { 363 | "coq_kernel_metadata": { 364 | "auto_roll_back": true 365 | } 366 | }, 367 | "outputs": [], 368 | "source": [ 369 | " reflexivity." 370 | ] 371 | }, 372 | { 373 | "cell_type": "code", 374 | "execution_count": null, 375 | "metadata": { 376 | "coq_kernel_metadata": { 377 | "auto_roll_back": true 378 | } 379 | }, 380 | "outputs": [], 381 | "source": [ 382 | "Qed." 383 | ] 384 | }, 385 | { 386 | "cell_type": "markdown", 387 | "metadata": { 388 | "coq_kernel_metadata": { 389 | "auto_roll_back": true 390 | } 391 | }, 392 | "source": [ 393 | "\n", 394 | "## 演習問題 2-4\n", 395 | " 次の定理を証明せよ。\n", 396 | "
Theorem plus_id_nm : (forall n m : nat , n = m -> n+n = m + m ).
\n", 397 | "\n", 398 | "[作業用ページで証明をして見る](./Equal-Ex-Work.ipynb#ex21) / [演習問題に戻る](./Equal-Ex.ipynb#ex21 ) \n", 399 | "\n", 400 | "## 解答\n", 401 | "```\n", 402 | "Theorem plus_id_nm : (forall n m : nat , n = m -> n+n = m + m ).\n", 403 | "Proof.\n", 404 | " intros n m.\n", 405 | " intros H.\n", 406 | " rewrite -> H.\n", 407 | " reflexivity.\n", 408 | "Qed.\n", 409 | "```\n", 410 | "\n", 411 | "### 下のCellを実行して確かめよ。" 412 | ] 413 | }, 414 | { 415 | "cell_type": "code", 416 | "execution_count": null, 417 | "metadata": { 418 | "coq_kernel_metadata": { 419 | "auto_roll_back": true 420 | } 421 | }, 422 | "outputs": [], 423 | "source": [ 424 | "Theorem plus_id_nm : (forall n m : nat , n = m -> n+n = m + m ).\n", 425 | "Proof.\n", 426 | " intros n m.\n", 427 | " intros H.\n", 428 | " rewrite -> H.\n", 429 | " reflexivity.\n", 430 | "Qed." 431 | ] 432 | }, 433 | { 434 | "cell_type": "markdown", 435 | "metadata": { 436 | "coq_kernel_metadata": { 437 | "auto_roll_back": true 438 | } 439 | }, 440 | "source": [ 441 | "### 次のCell を一つづつ実行して、各tacticsの働きを確認せよ。" 442 | ] 443 | }, 444 | { 445 | "cell_type": "code", 446 | "execution_count": null, 447 | "metadata": { 448 | "coq_kernel_metadata": { 449 | "auto_roll_back": true 450 | } 451 | }, 452 | "outputs": [], 453 | "source": [ 454 | "Theorem plus_id_nm' : (forall n m : nat , n = m -> n+n = m + m ).\n", 455 | "Proof." 456 | ] 457 | }, 458 | { 459 | "cell_type": "code", 460 | "execution_count": null, 461 | "metadata": { 462 | "coq_kernel_metadata": { 463 | "auto_roll_back": true 464 | } 465 | }, 466 | "outputs": [], 467 | "source": [ 468 | " intros n m." 469 | ] 470 | }, 471 | { 472 | "cell_type": "code", 473 | "execution_count": null, 474 | "metadata": { 475 | "coq_kernel_metadata": { 476 | "auto_roll_back": true 477 | } 478 | }, 479 | "outputs": [], 480 | "source": [ 481 | " intros H." 482 | ] 483 | }, 484 | { 485 | "cell_type": "code", 486 | "execution_count": null, 487 | "metadata": { 488 | "coq_kernel_metadata": { 489 | "auto_roll_back": true 490 | } 491 | }, 492 | "outputs": [], 493 | "source": [ 494 | " rewrite -> H." 495 | ] 496 | }, 497 | { 498 | "cell_type": "code", 499 | "execution_count": null, 500 | "metadata": { 501 | "coq_kernel_metadata": { 502 | "auto_roll_back": true 503 | } 504 | }, 505 | "outputs": [], 506 | "source": [ 507 | " reflexivity." 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": null, 513 | "metadata": { 514 | "coq_kernel_metadata": { 515 | "auto_roll_back": true 516 | } 517 | }, 518 | "outputs": [], 519 | "source": [ 520 | "Qed." 521 | ] 522 | }, 523 | { 524 | "cell_type": "markdown", 525 | "metadata": { 526 | "coq_kernel_metadata": { 527 | "auto_roll_back": true 528 | } 529 | }, 530 | "source": [ 531 | "\n", 532 | "## 演習問題 2-5\n", 533 | " 次の定理を証明せよ。\n", 534 | "
Theorem plus_id : (forall n m o : nat , n = m -> m = o -> n + m = m + o ).
\n", 535 | "\n", 536 | "[作業用ページで証明をして見る](./Equal-Ex-Work.ipynb#ex25) / [演習問題に戻る](./Equal-Ex.ipynb#ex25 ) \n", 537 | "\n", 538 | "## 解答\n", 539 | "```\n", 540 | "Theorem plus_id : (forall n m o : nat , n = m -> m = o -> n + m = m + o ).\n", 541 | "Proof.\n", 542 | " intros n m o.\n", 543 | " intros n_eq_m m_eq_o.\n", 544 | " rewrite -> n_eq_m.\n", 545 | " rewrite <- m_eq_o.\n", 546 | " reflexivity.\n", 547 | "Qed.\n", 548 | "```\n", 549 | "\n", 550 | "### 下のCellを実行して確かめよ。" 551 | ] 552 | }, 553 | { 554 | "cell_type": "code", 555 | "execution_count": null, 556 | "metadata": { 557 | "coq_kernel_metadata": { 558 | "auto_roll_back": true 559 | } 560 | }, 561 | "outputs": [], 562 | "source": [ 563 | "Theorem plus_id : (forall n m o : nat , n = m -> m = o -> n + m = m + o ).\n", 564 | "Proof.\n", 565 | " intros n m o.\n", 566 | " intros n_eq_m m_eq_o.\n", 567 | " rewrite -> n_eq_m.\n", 568 | " rewrite <- m_eq_o.\n", 569 | " reflexivity.\n", 570 | "Qed." 571 | ] 572 | }, 573 | { 574 | "cell_type": "markdown", 575 | "metadata": { 576 | "coq_kernel_metadata": { 577 | "auto_roll_back": true 578 | } 579 | }, 580 | "source": [ 581 | "### 次のCell を一つづつ実行して、各tacticsの働きを確認せよ。" 582 | ] 583 | }, 584 | { 585 | "cell_type": "code", 586 | "execution_count": null, 587 | "metadata": { 588 | "coq_kernel_metadata": { 589 | "auto_roll_back": true 590 | } 591 | }, 592 | "outputs": [], 593 | "source": [ 594 | "Theorem plus_id' : (forall n m o : nat , n = m -> m = o -> n + m = m + o ).\n", 595 | "Proof." 596 | ] 597 | }, 598 | { 599 | "cell_type": "code", 600 | "execution_count": null, 601 | "metadata": { 602 | "coq_kernel_metadata": { 603 | "auto_roll_back": true 604 | } 605 | }, 606 | "outputs": [], 607 | "source": [ 608 | " intros n m o." 609 | ] 610 | }, 611 | { 612 | "cell_type": "code", 613 | "execution_count": null, 614 | "metadata": { 615 | "coq_kernel_metadata": { 616 | "auto_roll_back": true 617 | } 618 | }, 619 | "outputs": [], 620 | "source": [ 621 | " intros n_eq_m m_eq_o." 622 | ] 623 | }, 624 | { 625 | "cell_type": "code", 626 | "execution_count": null, 627 | "metadata": { 628 | "coq_kernel_metadata": { 629 | "auto_roll_back": true 630 | } 631 | }, 632 | "outputs": [], 633 | "source": [ 634 | " rewrite -> n_eq_m." 635 | ] 636 | }, 637 | { 638 | "cell_type": "code", 639 | "execution_count": null, 640 | "metadata": { 641 | "coq_kernel_metadata": { 642 | "auto_roll_back": true 643 | } 644 | }, 645 | "outputs": [], 646 | "source": [ 647 | " rewrite <- m_eq_o." 648 | ] 649 | }, 650 | { 651 | "cell_type": "code", 652 | "execution_count": null, 653 | "metadata": { 654 | "coq_kernel_metadata": { 655 | "auto_roll_back": true 656 | } 657 | }, 658 | "outputs": [], 659 | "source": [ 660 | " reflexivity." 661 | ] 662 | }, 663 | { 664 | "cell_type": "code", 665 | "execution_count": null, 666 | "metadata": { 667 | "coq_kernel_metadata": { 668 | "auto_roll_back": true 669 | } 670 | }, 671 | "outputs": [], 672 | "source": [ 673 | "Qed." 674 | ] 675 | }, 676 | { 677 | "cell_type": "markdown", 678 | "metadata": { 679 | "coq_kernel_metadata": { 680 | "auto_roll_back": true 681 | } 682 | }, 683 | "source": [ 684 | "\n", 685 | "## 演習問題 2-6\n", 686 | " 次の定理を証明せよ。\n", 687 | "
Theorem mult_0_plus : (forall n m : nat , ( 0 + n ) \\* m = n \\* m ).
\n", 688 | "\n", 689 | "[作業用ページで証明をして見る](./Equal-Ex-Work.ipynb#ex26) / [演習問題に戻る](./Equal-Ex.ipynb#ex26 ) \n", 690 | "\n", 691 | "## 解答\n", 692 | "```\n", 693 | "Theorem mult_0_plus : (forall n m : nat , ( 0 + n ) * m = n * m ).\n", 694 | "Proof.\n", 695 | " intros.\n", 696 | " simpl.\n", 697 | " reflexivity.\n", 698 | "Qed.\n", 699 | "```\n", 700 | "\n", 701 | "### 下のCellを実行して確かめよ。" 702 | ] 703 | }, 704 | { 705 | "cell_type": "code", 706 | "execution_count": null, 707 | "metadata": { 708 | "coq_kernel_metadata": { 709 | "auto_roll_back": true 710 | } 711 | }, 712 | "outputs": [], 713 | "source": [ 714 | "Theorem mult_0_plus : (forall n m : nat , ( 0 + n ) * m = n * m ).\n", 715 | "Proof.\n", 716 | " intros.\n", 717 | " simpl.\n", 718 | " reflexivity.\n", 719 | "Qed." 720 | ] 721 | }, 722 | { 723 | "cell_type": "markdown", 724 | "metadata": { 725 | "coq_kernel_metadata": { 726 | "auto_roll_back": true 727 | } 728 | }, 729 | "source": [ 730 | "### 次のCell を一つづつ実行して、各tacticsの働きを確認せよ。" 731 | ] 732 | }, 733 | { 734 | "cell_type": "code", 735 | "execution_count": null, 736 | "metadata": { 737 | "coq_kernel_metadata": { 738 | "auto_roll_back": true 739 | } 740 | }, 741 | "outputs": [], 742 | "source": [ 743 | "Theorem mult_0_plus' : (forall n m : nat , ( 0 + n ) * m = n * m ).\n", 744 | "Proof." 745 | ] 746 | }, 747 | { 748 | "cell_type": "code", 749 | "execution_count": null, 750 | "metadata": { 751 | "coq_kernel_metadata": { 752 | "auto_roll_back": true 753 | } 754 | }, 755 | "outputs": [], 756 | "source": [ 757 | " intros." 758 | ] 759 | }, 760 | { 761 | "cell_type": "code", 762 | "execution_count": null, 763 | "metadata": { 764 | "coq_kernel_metadata": { 765 | "auto_roll_back": true 766 | } 767 | }, 768 | "outputs": [], 769 | "source": [ 770 | " simpl." 771 | ] 772 | }, 773 | { 774 | "cell_type": "code", 775 | "execution_count": null, 776 | "metadata": { 777 | "coq_kernel_metadata": { 778 | "auto_roll_back": true 779 | } 780 | }, 781 | "outputs": [], 782 | "source": [ 783 | " reflexivity." 784 | ] 785 | }, 786 | { 787 | "cell_type": "code", 788 | "execution_count": null, 789 | "metadata": { 790 | "coq_kernel_metadata": { 791 | "auto_roll_back": true 792 | } 793 | }, 794 | "outputs": [], 795 | "source": [ 796 | "Qed." 797 | ] 798 | }, 799 | { 800 | "cell_type": "markdown", 801 | "metadata": { 802 | "coq_kernel_metadata": { 803 | "auto_roll_back": true 804 | } 805 | }, 806 | "source": [ 807 | "\n", 808 | "## 演習問題 2-7\n", 809 | " 次の定理を証明せよ。\n", 810 | "
Theorem mult_S_1 : (forall n m : nat, m = S n -> m \\* (1 + n) = m \\* m).
\n", 811 | "\n", 812 | "[作業用ページで証明をして見る](./Equal-Ex-Work.ipynb#ex27) / [演習問題に戻る](./Equal-Ex.ipynb#ex27 ) \n", 813 | "\n", 814 | "## 解答\n", 815 | "```\n", 816 | "Theorem mult_S_1 : (forall n m : nat, m = S n -> m * (1 + n) = m * m).\n", 817 | "Proof.\n", 818 | " intros n m m_eq_Sn.\n", 819 | " simpl.\n", 820 | " rewrite -> m_eq_Sn.\n", 821 | " reflexivity.\n", 822 | "Qed.\n", 823 | "```\n", 824 | "\n", 825 | "### 下のCellを実行して確かめよ。" 826 | ] 827 | }, 828 | { 829 | "cell_type": "code", 830 | "execution_count": null, 831 | "metadata": { 832 | "coq_kernel_metadata": { 833 | "auto_roll_back": true 834 | } 835 | }, 836 | "outputs": [], 837 | "source": [ 838 | "Theorem mult_S_1 : (forall n m : nat, m = S n -> m * (1 + n) = m * m).\n", 839 | "Proof.\n", 840 | " intros n m m_eq_Sn.\n", 841 | " simpl.\n", 842 | " rewrite -> m_eq_Sn.\n", 843 | " reflexivity.\n", 844 | "Qed." 845 | ] 846 | }, 847 | { 848 | "cell_type": "markdown", 849 | "metadata": { 850 | "coq_kernel_metadata": { 851 | "auto_roll_back": true 852 | } 853 | }, 854 | "source": [ 855 | "### 次のCell を一つづつ実行して、各tacticsの働きを確認せよ。" 856 | ] 857 | }, 858 | { 859 | "cell_type": "code", 860 | "execution_count": null, 861 | "metadata": { 862 | "coq_kernel_metadata": { 863 | "auto_roll_back": true 864 | } 865 | }, 866 | "outputs": [], 867 | "source": [ 868 | "Theorem mult_S_1' : (forall n m : nat, m = S n -> m * (1 + n) = m * m).\n", 869 | "Proof." 870 | ] 871 | }, 872 | { 873 | "cell_type": "code", 874 | "execution_count": null, 875 | "metadata": { 876 | "coq_kernel_metadata": { 877 | "auto_roll_back": true 878 | } 879 | }, 880 | "outputs": [], 881 | "source": [ 882 | " intros n m m_eq_Sn." 883 | ] 884 | }, 885 | { 886 | "cell_type": "code", 887 | "execution_count": null, 888 | "metadata": { 889 | "coq_kernel_metadata": { 890 | "auto_roll_back": true 891 | } 892 | }, 893 | "outputs": [], 894 | "source": [ 895 | " simpl." 896 | ] 897 | }, 898 | { 899 | "cell_type": "code", 900 | "execution_count": null, 901 | "metadata": { 902 | "coq_kernel_metadata": { 903 | "auto_roll_back": true 904 | } 905 | }, 906 | "outputs": [], 907 | "source": [ 908 | " rewrite -> m_eq_Sn.\n", 909 | " " 910 | ] 911 | }, 912 | { 913 | "cell_type": "code", 914 | "execution_count": null, 915 | "metadata": { 916 | "coq_kernel_metadata": { 917 | "auto_roll_back": true 918 | } 919 | }, 920 | "outputs": [], 921 | "source": [ 922 | " reflexivity." 923 | ] 924 | }, 925 | { 926 | "cell_type": "code", 927 | "execution_count": null, 928 | "metadata": { 929 | "coq_kernel_metadata": { 930 | "auto_roll_back": true 931 | } 932 | }, 933 | "outputs": [], 934 | "source": [ 935 | "Qed" 936 | ] 937 | } 938 | ], 939 | "metadata": { 940 | "kernelspec": { 941 | "display_name": "Coq", 942 | "language": "coq", 943 | "name": "coq" 944 | }, 945 | "language_info": { 946 | "file_extension": ".v", 947 | "mimetype": "text/x-coq", 948 | "name": "coq", 949 | "version": "8.9.1" 950 | } 951 | }, 952 | "nbformat": 4, 953 | "nbformat_minor": 2 954 | } 955 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Induction-Ex-Work-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# 演習問題 3 作業用ページ\n", 12 | "\n", 13 | "[演習問題 3-1](./Induction-Ex.ipynb#ex11) [演習問題 3-2](./Induction-Ex.ipynb#ex12) [演習問題 3-3](./Induction-Ex.ipynb#ex13) [演習問題 3-4](./Induction-Ex.ipynb#ex14) [演習問題 3-5](./Induction-Ex.ipynb#ex15) [演習問題 3-6](./Induction-Ex.ipynb#ex16) [演習問題 3-7](./Induction-Ex.ipynb#ex17) [演習問題 3-8](./Induction-Ex.ipynb#ex18) " 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "coq_kernel_metadata": { 20 | "auto_roll_back": true 21 | } 22 | }, 23 | "source": [ 24 | "\n", 25 | "## 演習問題 3-1\n", 26 | " 次の定理を証明せよ。\n", 27 | "
 Theorem plus_n_O : (forall n : nat, n + 0 = n).
\n", 28 | "\n", 29 | "### 下記の証明を完成させよ。\n", 30 | "#### [ヒント: 解答のコメントを読む](./Induction-Ex-Answer.ipynb#hint31) / [解答を見る](./Induction-Ex-Answer.ipynb#ex31) " 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": null, 36 | "metadata": { 37 | "coq_kernel_metadata": { 38 | "auto_roll_back": true 39 | } 40 | }, 41 | "outputs": [], 42 | "source": [ 43 | "Theorem plus_n_O : (forall n : nat, n + 0 = n)." 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": null, 49 | "metadata": { 50 | "coq_kernel_metadata": { 51 | "auto_roll_back": true 52 | } 53 | }, 54 | "outputs": [], 55 | "source": [] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": null, 60 | "metadata": { 61 | "coq_kernel_metadata": { 62 | "auto_roll_back": true 63 | } 64 | }, 65 | "outputs": [], 66 | "source": [] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": null, 71 | "metadata": { 72 | "coq_kernel_metadata": { 73 | "auto_roll_back": true 74 | } 75 | }, 76 | "outputs": [], 77 | "source": [] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": null, 82 | "metadata": { 83 | "coq_kernel_metadata": { 84 | "auto_roll_back": true 85 | } 86 | }, 87 | "outputs": [], 88 | "source": [] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "execution_count": null, 93 | "metadata": { 94 | "coq_kernel_metadata": { 95 | "auto_roll_back": true 96 | } 97 | }, 98 | "outputs": [], 99 | "source": [] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": null, 104 | "metadata": { 105 | "coq_kernel_metadata": { 106 | "auto_roll_back": true 107 | } 108 | }, 109 | "outputs": [], 110 | "source": [] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": null, 115 | "metadata": { 116 | "coq_kernel_metadata": { 117 | "auto_roll_back": true 118 | } 119 | }, 120 | "outputs": [], 121 | "source": [] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": null, 126 | "metadata": { 127 | "coq_kernel_metadata": { 128 | "auto_roll_back": true 129 | } 130 | }, 131 | "outputs": [], 132 | "source": [] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": null, 137 | "metadata": { 138 | "coq_kernel_metadata": { 139 | "auto_roll_back": true 140 | } 141 | }, 142 | "outputs": [], 143 | "source": [ 144 | "Admitted. (* 最後にここを Qed. に変える。*)" 145 | ] 146 | }, 147 | { 148 | "cell_type": "markdown", 149 | "metadata": { 150 | "coq_kernel_metadata": { 151 | "auto_roll_back": true 152 | } 153 | }, 154 | "source": [ 155 | "\n", 156 | "## 演習問題 3-2\n", 157 | " 次の定理を証明せよ。\n", 158 | "
 Theorem minus_diag : (forall n : nat, minus n n = 0).
\n", 159 | "\n", 160 | "### 下記の証明を完成させよ。\n", 161 | "#### [ヒント: 解答のコメントを読む](./Induction-Ex-Answer.ipynb#hint32) / [解答を見る](./Induction-Ex-Answer.ipynb#ex32) " 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": null, 167 | "metadata": { 168 | "coq_kernel_metadata": { 169 | "auto_roll_back": true 170 | } 171 | }, 172 | "outputs": [], 173 | "source": [ 174 | "Theorem minus_diag : (forall n : nat, minus n n = 0)." 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": null, 180 | "metadata": { 181 | "coq_kernel_metadata": { 182 | "auto_roll_back": true 183 | } 184 | }, 185 | "outputs": [], 186 | "source": [] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": null, 191 | "metadata": { 192 | "coq_kernel_metadata": { 193 | "auto_roll_back": true 194 | } 195 | }, 196 | "outputs": [], 197 | "source": [] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": null, 202 | "metadata": { 203 | "coq_kernel_metadata": { 204 | "auto_roll_back": true 205 | } 206 | }, 207 | "outputs": [], 208 | "source": [] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": null, 213 | "metadata": { 214 | "coq_kernel_metadata": { 215 | "auto_roll_back": true 216 | } 217 | }, 218 | "outputs": [], 219 | "source": [] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": null, 224 | "metadata": { 225 | "coq_kernel_metadata": { 226 | "auto_roll_back": true 227 | } 228 | }, 229 | "outputs": [], 230 | "source": [] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "execution_count": null, 235 | "metadata": { 236 | "coq_kernel_metadata": { 237 | "auto_roll_back": true 238 | } 239 | }, 240 | "outputs": [], 241 | "source": [] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "execution_count": null, 246 | "metadata": { 247 | "coq_kernel_metadata": { 248 | "auto_roll_back": true 249 | } 250 | }, 251 | "outputs": [], 252 | "source": [] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "execution_count": null, 257 | "metadata": { 258 | "coq_kernel_metadata": { 259 | "auto_roll_back": true 260 | } 261 | }, 262 | "outputs": [], 263 | "source": [] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": null, 268 | "metadata": { 269 | "coq_kernel_metadata": { 270 | "auto_roll_back": true 271 | } 272 | }, 273 | "outputs": [], 274 | "source": [ 275 | "Admitted. (* 最後にここを Qed. に変える。*)" 276 | ] 277 | }, 278 | { 279 | "cell_type": "markdown", 280 | "metadata": { 281 | "coq_kernel_metadata": { 282 | "auto_roll_back": true 283 | } 284 | }, 285 | "source": [ 286 | "\n", 287 | "## 演習問題 3-3\n", 288 | " 次の定理を証明せよ。\n", 289 | "
 Theorem mult_0_r : (forall n : nat, n * 0 = 0).
\n", 290 | "\n", 291 | "### 下記の証明を完成させよ。\n", 292 | "#### [ヒント: 解答のコメントを読む](./Induction-Ex-Answer.ipynb#hint33) / [解答を見る](./Induction-Ex-Answer.ipynb#ex33) " 293 | ] 294 | }, 295 | { 296 | "cell_type": "code", 297 | "execution_count": null, 298 | "metadata": { 299 | "coq_kernel_metadata": { 300 | "auto_roll_back": true 301 | } 302 | }, 303 | "outputs": [], 304 | "source": [ 305 | "Theorem mult_0_r : (forall n : nat, n * 0 = 0)." 306 | ] 307 | }, 308 | { 309 | "cell_type": "code", 310 | "execution_count": null, 311 | "metadata": { 312 | "coq_kernel_metadata": { 313 | "auto_roll_back": true 314 | } 315 | }, 316 | "outputs": [], 317 | "source": [] 318 | }, 319 | { 320 | "cell_type": "code", 321 | "execution_count": null, 322 | "metadata": { 323 | "coq_kernel_metadata": { 324 | "auto_roll_back": true 325 | } 326 | }, 327 | "outputs": [], 328 | "source": [] 329 | }, 330 | { 331 | "cell_type": "code", 332 | "execution_count": null, 333 | "metadata": { 334 | "coq_kernel_metadata": { 335 | "auto_roll_back": true 336 | } 337 | }, 338 | "outputs": [], 339 | "source": [] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "execution_count": null, 344 | "metadata": { 345 | "coq_kernel_metadata": { 346 | "auto_roll_back": true 347 | } 348 | }, 349 | "outputs": [], 350 | "source": [] 351 | }, 352 | { 353 | "cell_type": "code", 354 | "execution_count": null, 355 | "metadata": { 356 | "coq_kernel_metadata": { 357 | "auto_roll_back": true 358 | } 359 | }, 360 | "outputs": [], 361 | "source": [] 362 | }, 363 | { 364 | "cell_type": "code", 365 | "execution_count": null, 366 | "metadata": { 367 | "coq_kernel_metadata": { 368 | "auto_roll_back": true 369 | } 370 | }, 371 | "outputs": [], 372 | "source": [] 373 | }, 374 | { 375 | "cell_type": "code", 376 | "execution_count": null, 377 | "metadata": { 378 | "coq_kernel_metadata": { 379 | "auto_roll_back": true 380 | } 381 | }, 382 | "outputs": [], 383 | "source": [] 384 | }, 385 | { 386 | "cell_type": "code", 387 | "execution_count": null, 388 | "metadata": { 389 | "coq_kernel_metadata": { 390 | "auto_roll_back": true 391 | } 392 | }, 393 | "outputs": [], 394 | "source": [] 395 | }, 396 | { 397 | "cell_type": "code", 398 | "execution_count": null, 399 | "metadata": { 400 | "coq_kernel_metadata": { 401 | "auto_roll_back": true 402 | } 403 | }, 404 | "outputs": [], 405 | "source": [] 406 | }, 407 | { 408 | "cell_type": "code", 409 | "execution_count": null, 410 | "metadata": { 411 | "coq_kernel_metadata": { 412 | "auto_roll_back": true 413 | } 414 | }, 415 | "outputs": [], 416 | "source": [] 417 | }, 418 | { 419 | "cell_type": "code", 420 | "execution_count": null, 421 | "metadata": { 422 | "coq_kernel_metadata": { 423 | "auto_roll_back": true 424 | } 425 | }, 426 | "outputs": [], 427 | "source": [ 428 | "Admitted. (* 最後にここを Qed. に変える。*)" 429 | ] 430 | }, 431 | { 432 | "cell_type": "markdown", 433 | "metadata": { 434 | "coq_kernel_metadata": { 435 | "auto_roll_back": true 436 | } 437 | }, 438 | "source": [ 439 | "\n", 440 | "## 演習問題 3-4\n", 441 | " 次の定理を証明せよ。\n", 442 | "
 Theorem plus_n_Sm : (forall n m : nat, S (n + m) = n + (S m) ).
\n", 443 | "\n", 444 | "### 下記の証明を完成させよ。\n", 445 | "#### [ヒント: 解答のコメントを読む](./Induction-Ex-Answer.ipynb#hint34) / [解答を見る](./Induction-Ex-Answer.ipynb#ex34) " 446 | ] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": null, 451 | "metadata": { 452 | "coq_kernel_metadata": { 453 | "auto_roll_back": true 454 | } 455 | }, 456 | "outputs": [], 457 | "source": [ 458 | "Theorem plus_n_Sm : (forall n m : nat, S (n + m) = n + (S m) )." 459 | ] 460 | }, 461 | { 462 | "cell_type": "code", 463 | "execution_count": null, 464 | "metadata": { 465 | "coq_kernel_metadata": { 466 | "auto_roll_back": true 467 | } 468 | }, 469 | "outputs": [], 470 | "source": [] 471 | }, 472 | { 473 | "cell_type": "code", 474 | "execution_count": null, 475 | "metadata": { 476 | "coq_kernel_metadata": { 477 | "auto_roll_back": true 478 | } 479 | }, 480 | "outputs": [], 481 | "source": [] 482 | }, 483 | { 484 | "cell_type": "code", 485 | "execution_count": null, 486 | "metadata": { 487 | "coq_kernel_metadata": { 488 | "auto_roll_back": true 489 | } 490 | }, 491 | "outputs": [], 492 | "source": [] 493 | }, 494 | { 495 | "cell_type": "code", 496 | "execution_count": null, 497 | "metadata": { 498 | "coq_kernel_metadata": { 499 | "auto_roll_back": true 500 | } 501 | }, 502 | "outputs": [], 503 | "source": [] 504 | }, 505 | { 506 | "cell_type": "code", 507 | "execution_count": null, 508 | "metadata": { 509 | "coq_kernel_metadata": { 510 | "auto_roll_back": true 511 | } 512 | }, 513 | "outputs": [], 514 | "source": [] 515 | }, 516 | { 517 | "cell_type": "code", 518 | "execution_count": null, 519 | "metadata": { 520 | "coq_kernel_metadata": { 521 | "auto_roll_back": true 522 | } 523 | }, 524 | "outputs": [], 525 | "source": [] 526 | }, 527 | { 528 | "cell_type": "code", 529 | "execution_count": null, 530 | "metadata": { 531 | "coq_kernel_metadata": { 532 | "auto_roll_back": true 533 | } 534 | }, 535 | "outputs": [], 536 | "source": [] 537 | }, 538 | { 539 | "cell_type": "code", 540 | "execution_count": null, 541 | "metadata": { 542 | "coq_kernel_metadata": { 543 | "auto_roll_back": true 544 | } 545 | }, 546 | "outputs": [], 547 | "source": [ 548 | "Admitted. (* 最後にここを Qed. に変える。*)" 549 | ] 550 | }, 551 | { 552 | "cell_type": "markdown", 553 | "metadata": { 554 | "coq_kernel_metadata": { 555 | "auto_roll_back": true 556 | } 557 | }, 558 | "source": [ 559 | "\n", 560 | "## 演習問題 3-5\n", 561 | " 次の定理を証明せよ。\n", 562 | "
 Theorem plus_comm : (forall n m : nat, n + m = m + n ).
\n", 563 | "\n", 564 | "### 下記の証明を完成させよ。\n", 565 | "#### [ヒント: 解答のコメントを読む](./Induction-Ex-Answer.ipynb#hint35) / [解答を見る](./Induction-Ex-Answer.ipynb#ex35) " 566 | ] 567 | }, 568 | { 569 | "cell_type": "code", 570 | "execution_count": null, 571 | "metadata": { 572 | "coq_kernel_metadata": { 573 | "auto_roll_back": true 574 | } 575 | }, 576 | "outputs": [], 577 | "source": [ 578 | "Theorem plus_comm : (forall n m : nat, n + m = m + n )." 579 | ] 580 | }, 581 | { 582 | "cell_type": "code", 583 | "execution_count": null, 584 | "metadata": { 585 | "coq_kernel_metadata": { 586 | "auto_roll_back": true 587 | } 588 | }, 589 | "outputs": [], 590 | "source": [] 591 | }, 592 | { 593 | "cell_type": "code", 594 | "execution_count": null, 595 | "metadata": { 596 | "coq_kernel_metadata": { 597 | "auto_roll_back": true 598 | } 599 | }, 600 | "outputs": [], 601 | "source": [] 602 | }, 603 | { 604 | "cell_type": "code", 605 | "execution_count": null, 606 | "metadata": { 607 | "coq_kernel_metadata": { 608 | "auto_roll_back": true 609 | } 610 | }, 611 | "outputs": [], 612 | "source": [] 613 | }, 614 | { 615 | "cell_type": "code", 616 | "execution_count": null, 617 | "metadata": { 618 | "coq_kernel_metadata": { 619 | "auto_roll_back": true 620 | } 621 | }, 622 | "outputs": [], 623 | "source": [] 624 | }, 625 | { 626 | "cell_type": "code", 627 | "execution_count": null, 628 | "metadata": { 629 | "coq_kernel_metadata": { 630 | "auto_roll_back": true 631 | } 632 | }, 633 | "outputs": [], 634 | "source": [] 635 | }, 636 | { 637 | "cell_type": "code", 638 | "execution_count": null, 639 | "metadata": { 640 | "coq_kernel_metadata": { 641 | "auto_roll_back": true 642 | } 643 | }, 644 | "outputs": [], 645 | "source": [] 646 | }, 647 | { 648 | "cell_type": "code", 649 | "execution_count": null, 650 | "metadata": { 651 | "coq_kernel_metadata": { 652 | "auto_roll_back": true 653 | } 654 | }, 655 | "outputs": [], 656 | "source": [] 657 | }, 658 | { 659 | "cell_type": "code", 660 | "execution_count": null, 661 | "metadata": { 662 | "coq_kernel_metadata": { 663 | "auto_roll_back": true 664 | } 665 | }, 666 | "outputs": [], 667 | "source": [] 668 | }, 669 | { 670 | "cell_type": "code", 671 | "execution_count": null, 672 | "metadata": { 673 | "coq_kernel_metadata": { 674 | "auto_roll_back": true 675 | } 676 | }, 677 | "outputs": [], 678 | "source": [] 679 | }, 680 | { 681 | "cell_type": "code", 682 | "execution_count": null, 683 | "metadata": { 684 | "coq_kernel_metadata": { 685 | "auto_roll_back": true 686 | } 687 | }, 688 | "outputs": [], 689 | "source": [] 690 | }, 691 | { 692 | "cell_type": "code", 693 | "execution_count": null, 694 | "metadata": { 695 | "coq_kernel_metadata": { 696 | "auto_roll_back": true 697 | } 698 | }, 699 | "outputs": [], 700 | "source": [ 701 | "Admitted. (* 最後にここを Qed. に変える。*)" 702 | ] 703 | }, 704 | { 705 | "cell_type": "markdown", 706 | "metadata": { 707 | "coq_kernel_metadata": { 708 | "auto_roll_back": true 709 | } 710 | }, 711 | "source": [ 712 | "\n", 713 | "## 演習問題 3-6\n", 714 | " 次の定理を証明せよ。\n", 715 | "
 Theorem plus_assoc : (forall n m o : nat, n + (m +o) = (n + m) + o ).
\n", 716 | "\n", 717 | "### 下記の証明を完成させよ。\n", 718 | "#### [ヒント: 解答のコメントを読む](./Induction-Ex-Answer.ipynb#hint36) / [解答を見る](./Induction-Ex-Answer.ipynb#ex36) " 719 | ] 720 | }, 721 | { 722 | "cell_type": "code", 723 | "execution_count": null, 724 | "metadata": { 725 | "coq_kernel_metadata": { 726 | "auto_roll_back": true 727 | } 728 | }, 729 | "outputs": [], 730 | "source": [ 731 | "Theorem plus_assoc : (forall n m o : nat, n + (m +o) = (n + m) + o )." 732 | ] 733 | }, 734 | { 735 | "cell_type": "code", 736 | "execution_count": null, 737 | "metadata": { 738 | "coq_kernel_metadata": { 739 | "auto_roll_back": true 740 | } 741 | }, 742 | "outputs": [], 743 | "source": [] 744 | }, 745 | { 746 | "cell_type": "code", 747 | "execution_count": null, 748 | "metadata": { 749 | "coq_kernel_metadata": { 750 | "auto_roll_back": true 751 | } 752 | }, 753 | "outputs": [], 754 | "source": [] 755 | }, 756 | { 757 | "cell_type": "code", 758 | "execution_count": null, 759 | "metadata": { 760 | "coq_kernel_metadata": { 761 | "auto_roll_back": true 762 | } 763 | }, 764 | "outputs": [], 765 | "source": [] 766 | }, 767 | { 768 | "cell_type": "code", 769 | "execution_count": null, 770 | "metadata": { 771 | "coq_kernel_metadata": { 772 | "auto_roll_back": true 773 | } 774 | }, 775 | "outputs": [], 776 | "source": [] 777 | }, 778 | { 779 | "cell_type": "code", 780 | "execution_count": null, 781 | "metadata": { 782 | "coq_kernel_metadata": { 783 | "auto_roll_back": true 784 | } 785 | }, 786 | "outputs": [], 787 | "source": [] 788 | }, 789 | { 790 | "cell_type": "code", 791 | "execution_count": null, 792 | "metadata": { 793 | "coq_kernel_metadata": { 794 | "auto_roll_back": true 795 | } 796 | }, 797 | "outputs": [], 798 | "source": [] 799 | }, 800 | { 801 | "cell_type": "code", 802 | "execution_count": null, 803 | "metadata": { 804 | "coq_kernel_metadata": { 805 | "auto_roll_back": true 806 | } 807 | }, 808 | "outputs": [], 809 | "source": [] 810 | }, 811 | { 812 | "cell_type": "code", 813 | "execution_count": null, 814 | "metadata": { 815 | "coq_kernel_metadata": { 816 | "auto_roll_back": true 817 | } 818 | }, 819 | "outputs": [], 820 | "source": [] 821 | }, 822 | { 823 | "cell_type": "code", 824 | "execution_count": null, 825 | "metadata": { 826 | "coq_kernel_metadata": { 827 | "auto_roll_back": true 828 | } 829 | }, 830 | "outputs": [], 831 | "source": [] 832 | }, 833 | { 834 | "cell_type": "code", 835 | "execution_count": null, 836 | "metadata": { 837 | "coq_kernel_metadata": { 838 | "auto_roll_back": true 839 | } 840 | }, 841 | "outputs": [], 842 | "source": [ 843 | "Admitted. (* 最後にここを Qed. に変える。*)" 844 | ] 845 | }, 846 | { 847 | "cell_type": "markdown", 848 | "metadata": { 849 | "coq_kernel_metadata": { 850 | "auto_roll_back": true 851 | } 852 | }, 853 | "source": [ 854 | "\n", 855 | "## 演習問題 3-7\n", 856 | " 次の定理を証明せよ。\n", 857 | "
 Theorem mul_succ_r : forall n m : nat, n \\* S m = n \\* m + n ).
\n", 858 | "\n", 859 | "### 下記の証明を完成させよ。\n", 860 | "#### [ヒント: 解答のコメントを読む](./Induction-Ex-Answer.ipynb#hint37) / [解答を見る](./Induction-Ex-Answer.ipynb#ex37) " 861 | ] 862 | }, 863 | { 864 | "cell_type": "code", 865 | "execution_count": null, 866 | "metadata": { 867 | "coq_kernel_metadata": { 868 | "auto_roll_back": true 869 | } 870 | }, 871 | "outputs": [], 872 | "source": [ 873 | "Theorem mul_succ_r : forall n m : nat, n * S m = n * m + n )." 874 | ] 875 | }, 876 | { 877 | "cell_type": "code", 878 | "execution_count": null, 879 | "metadata": { 880 | "coq_kernel_metadata": { 881 | "auto_roll_back": true 882 | } 883 | }, 884 | "outputs": [], 885 | "source": [] 886 | }, 887 | { 888 | "cell_type": "code", 889 | "execution_count": null, 890 | "metadata": { 891 | "coq_kernel_metadata": { 892 | "auto_roll_back": true 893 | } 894 | }, 895 | "outputs": [], 896 | "source": [] 897 | }, 898 | { 899 | "cell_type": "code", 900 | "execution_count": null, 901 | "metadata": { 902 | "coq_kernel_metadata": { 903 | "auto_roll_back": true 904 | } 905 | }, 906 | "outputs": [], 907 | "source": [] 908 | }, 909 | { 910 | "cell_type": "code", 911 | "execution_count": null, 912 | "metadata": { 913 | "coq_kernel_metadata": { 914 | "auto_roll_back": true 915 | } 916 | }, 917 | "outputs": [], 918 | "source": [] 919 | }, 920 | { 921 | "cell_type": "code", 922 | "execution_count": null, 923 | "metadata": { 924 | "coq_kernel_metadata": { 925 | "auto_roll_back": true 926 | } 927 | }, 928 | "outputs": [], 929 | "source": [] 930 | }, 931 | { 932 | "cell_type": "code", 933 | "execution_count": null, 934 | "metadata": { 935 | "coq_kernel_metadata": { 936 | "auto_roll_back": true 937 | } 938 | }, 939 | "outputs": [], 940 | "source": [] 941 | }, 942 | { 943 | "cell_type": "code", 944 | "execution_count": null, 945 | "metadata": { 946 | "coq_kernel_metadata": { 947 | "auto_roll_back": true 948 | } 949 | }, 950 | "outputs": [], 951 | "source": [] 952 | }, 953 | { 954 | "cell_type": "code", 955 | "execution_count": null, 956 | "metadata": { 957 | "coq_kernel_metadata": { 958 | "auto_roll_back": true 959 | } 960 | }, 961 | "outputs": [], 962 | "source": [ 963 | "Admitted. (* 最後にここを Qed. に変える。*)" 964 | ] 965 | }, 966 | { 967 | "cell_type": "markdown", 968 | "metadata": { 969 | "coq_kernel_metadata": { 970 | "auto_roll_back": true 971 | } 972 | }, 973 | "source": [ 974 | "\n", 975 | "## 演習問題 3-8\n", 976 | " 次の定理を証明せよ。\n", 977 | "
 Theorem mult_comm : (forall n m : nat, n \\* m = m \\* n ).
\n", 978 | "\n", 979 | "### 下記の証明を完成させよ。\n", 980 | "#### [ヒント: 解答のコメントを読む](./Induction-Ex-Answer.ipynb#hint38) / [解答を見る](./Induction-Ex-Answer.ipynb#ex38) " 981 | ] 982 | }, 983 | { 984 | "cell_type": "code", 985 | "execution_count": null, 986 | "metadata": { 987 | "coq_kernel_metadata": { 988 | "auto_roll_back": true 989 | } 990 | }, 991 | "outputs": [], 992 | "source": [ 993 | "Theorem mult_comm : (forall n m : nat, n * m = m * n )." 994 | ] 995 | }, 996 | { 997 | "cell_type": "code", 998 | "execution_count": null, 999 | "metadata": { 1000 | "coq_kernel_metadata": { 1001 | "auto_roll_back": true 1002 | } 1003 | }, 1004 | "outputs": [], 1005 | "source": [] 1006 | }, 1007 | { 1008 | "cell_type": "code", 1009 | "execution_count": null, 1010 | "metadata": { 1011 | "coq_kernel_metadata": { 1012 | "auto_roll_back": true 1013 | } 1014 | }, 1015 | "outputs": [], 1016 | "source": [] 1017 | }, 1018 | { 1019 | "cell_type": "code", 1020 | "execution_count": null, 1021 | "metadata": { 1022 | "coq_kernel_metadata": { 1023 | "auto_roll_back": true 1024 | } 1025 | }, 1026 | "outputs": [], 1027 | "source": [] 1028 | }, 1029 | { 1030 | "cell_type": "code", 1031 | "execution_count": null, 1032 | "metadata": { 1033 | "coq_kernel_metadata": { 1034 | "auto_roll_back": true 1035 | } 1036 | }, 1037 | "outputs": [], 1038 | "source": [] 1039 | }, 1040 | { 1041 | "cell_type": "code", 1042 | "execution_count": null, 1043 | "metadata": { 1044 | "coq_kernel_metadata": { 1045 | "auto_roll_back": true 1046 | } 1047 | }, 1048 | "outputs": [], 1049 | "source": [] 1050 | }, 1051 | { 1052 | "cell_type": "code", 1053 | "execution_count": null, 1054 | "metadata": { 1055 | "coq_kernel_metadata": { 1056 | "auto_roll_back": true 1057 | } 1058 | }, 1059 | "outputs": [], 1060 | "source": [] 1061 | }, 1062 | { 1063 | "cell_type": "code", 1064 | "execution_count": null, 1065 | "metadata": { 1066 | "coq_kernel_metadata": { 1067 | "auto_roll_back": true 1068 | } 1069 | }, 1070 | "outputs": [], 1071 | "source": [] 1072 | }, 1073 | { 1074 | "cell_type": "code", 1075 | "execution_count": null, 1076 | "metadata": { 1077 | "coq_kernel_metadata": { 1078 | "auto_roll_back": true 1079 | } 1080 | }, 1081 | "outputs": [], 1082 | "source": [ 1083 | "Admitted. (* 最後にここを Qed. に変える。*)" 1084 | ] 1085 | } 1086 | ], 1087 | "metadata": { 1088 | "kernelspec": { 1089 | "display_name": "Coq", 1090 | "language": "coq", 1091 | "name": "coq" 1092 | }, 1093 | "language_info": { 1094 | "file_extension": ".v", 1095 | "mimetype": "text/x-coq", 1096 | "name": "coq", 1097 | "version": "8.9.1" 1098 | } 1099 | }, 1100 | "nbformat": 4, 1101 | "nbformat_minor": 2 1102 | } 1103 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/Logic-Ex-Work-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "coq_kernel_metadata": { 7 | "auto_roll_back": true 8 | } 9 | }, 10 | "source": [ 11 | "# 演習問題 1 作業用ページ\n", 12 | "\n", 13 | "[演習問題 1-1](./Logic-Ex-Work.ipynb#ex11) [演習問題 1-2](./Logic-Ex-Work.ipynb#ex12) [演習問題 1-3](./Logic-Ex-Work-Work.ipynb#ex13) [演習問題 1-4](./Logic-Ex-Work-Work.ipynb#ex14) [演習問題 1-5](./Logic-Ex-Work.ipynb#ex15) [演習問題 1-6](./Logic-Ex-Work.ipynb#ex16) [演習問題 1-7](./Logic-Ex-Work.ipynb#ex17) [演習問題 1-8](./Logic-Ex-Work.ipynb#ex18) [演習問題 1-9](./Logic-Ex-Work.ipynb#ex19) " 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "coq_kernel_metadata": { 20 | "auto_roll_back": true 21 | } 22 | }, 23 | "source": [ 24 | "\n", 25 | "## 演習問題 1-1 \n", 26 | "次の定理を証明せよ。\n", 27 | "
Theorem my_first_proof : (forall A : Prop, A -> A).
\n", 28 | "\n", 29 | "### ヒント\n", 30 | "- 冒頭の forall を intros で削除する。(Rule 1)\n", 31 | "- A -> A の最初のAを intros で仮説に入れる。(Rule 2)\n", 32 | "- そうすると、サブゴールが仮説の一つと一致していることがわかるので、assumption (Rule 3) または、exact (Rule 4) を使う。\n", 33 | "\n", 34 | "### [解答を見る](./Logic-Ex-Answer.ipynb#ex11) " 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": null, 40 | "metadata": { 41 | "coq_kernel_metadata": { 42 | "auto_roll_back": true 43 | } 44 | }, 45 | "outputs": [], 46 | "source": [ 47 | "Theorem my_first_proof : (forall A : Prop, A -> A).\n", 48 | "Proof." 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": null, 54 | "metadata": { 55 | "coq_kernel_metadata": { 56 | "auto_roll_back": true 57 | } 58 | }, 59 | "outputs": [], 60 | "source": [] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": null, 65 | "metadata": { 66 | "coq_kernel_metadata": { 67 | "auto_roll_back": true 68 | } 69 | }, 70 | "outputs": [], 71 | "source": [] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": null, 76 | "metadata": { 77 | "coq_kernel_metadata": { 78 | "auto_roll_back": true 79 | } 80 | }, 81 | "outputs": [], 82 | "source": [] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": null, 87 | "metadata": { 88 | "coq_kernel_metadata": { 89 | "auto_roll_back": true 90 | } 91 | }, 92 | "outputs": [], 93 | "source": [] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": null, 98 | "metadata": { 99 | "coq_kernel_metadata": { 100 | "auto_roll_back": true 101 | } 102 | }, 103 | "outputs": [], 104 | "source": [] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": null, 109 | "metadata": { 110 | "coq_kernel_metadata": { 111 | "auto_roll_back": true 112 | } 113 | }, 114 | "outputs": [], 115 | "source": [ 116 | "Admitted. (* 最後にここを Qed. に変える。*)" 117 | ] 118 | }, 119 | { 120 | "cell_type": "markdown", 121 | "metadata": { 122 | "collapsed": true, 123 | "coq_kernel_metadata": { 124 | "auto_roll_back": true 125 | } 126 | }, 127 | "source": [ 128 | "\n", 129 | "## 演習問題 1-2\n", 130 | "次の定理を証明せよ。\n", 131 | "
Theorem and1 : (forall A B: Prop, A /\\ B -> A).
\n", 132 | "\n", 133 | "### ヒント\n", 134 | "- intros. で forall を削除し、`A /\\ B -> A` の前提部分の`A /\\ B`を仮説に移す。(Rule 1,2)\n", 135 | "- 仮説中の`A /\\ B`を、destruct で分解する。(Rule 6)\n", 136 | "- 仮説の一つがサブゴールに一致している。(Rule 3,4,5)\n", 137 | "\n", 138 | "### [解答を見る](./Logic-Ex-Answer.ipynb#ex12) " 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": null, 144 | "metadata": { 145 | "coq_kernel_metadata": { 146 | "auto_roll_back": true 147 | } 148 | }, 149 | "outputs": [], 150 | "source": [ 151 | "Theorem and1 : (forall A B: Prop, A /\\ B -> A)." 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": null, 157 | "metadata": { 158 | "coq_kernel_metadata": { 159 | "auto_roll_back": true 160 | } 161 | }, 162 | "outputs": [], 163 | "source": [] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": null, 168 | "metadata": { 169 | "coq_kernel_metadata": { 170 | "auto_roll_back": true 171 | } 172 | }, 173 | "outputs": [], 174 | "source": [] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": null, 179 | "metadata": { 180 | "coq_kernel_metadata": { 181 | "auto_roll_back": true 182 | } 183 | }, 184 | "outputs": [], 185 | "source": [] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": null, 190 | "metadata": { 191 | "coq_kernel_metadata": { 192 | "auto_roll_back": true 193 | } 194 | }, 195 | "outputs": [], 196 | "source": [] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": null, 201 | "metadata": { 202 | "coq_kernel_metadata": { 203 | "auto_roll_back": true 204 | } 205 | }, 206 | "outputs": [], 207 | "source": [] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": null, 212 | "metadata": { 213 | "coq_kernel_metadata": { 214 | "auto_roll_back": true 215 | } 216 | }, 217 | "outputs": [], 218 | "source": [] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": null, 223 | "metadata": { 224 | "coq_kernel_metadata": { 225 | "auto_roll_back": true 226 | } 227 | }, 228 | "outputs": [], 229 | "source": [] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": null, 234 | "metadata": { 235 | "coq_kernel_metadata": { 236 | "auto_roll_back": true 237 | } 238 | }, 239 | "outputs": [], 240 | "source": [ 241 | "Admitted. (* 最後にここを Qed. に変える。*)" 242 | ] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "metadata": { 247 | "coq_kernel_metadata": { 248 | "auto_roll_back": true 249 | } 250 | }, 251 | "source": [ 252 | "\n", 253 | "## 演習問題 1-3\n", 254 | "次の定理を証明せよ。\n", 255 | "
Theorem and1 : (forall A B: Prop, A /\\ B -> B).
\n", 256 | "\n", 257 | "### ヒント\n", 258 | "- intros. で forall を削除し、`A /\\ B -> B` の前提部分の`A /\\ B`を仮説に移す。(Rule 1,2)\n", 259 | "- 仮説中の`A /\\ B`を、destruct で分解する。(Rule 6)\n", 260 | "- 仮説の一つがサブゴールに一致している。(Rule 3,4,5)\n", 261 | "\n", 262 | "### [解答を見る](./Logic-Ex-Answer.ipynb#ex13) " 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": null, 268 | "metadata": { 269 | "coq_kernel_metadata": { 270 | "auto_roll_back": true 271 | } 272 | }, 273 | "outputs": [], 274 | "source": [ 275 | " Theorem and1 : (forall A B: Prop, A /\\ B -> B)." 276 | ] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": null, 281 | "metadata": { 282 | "coq_kernel_metadata": { 283 | "auto_roll_back": true 284 | } 285 | }, 286 | "outputs": [], 287 | "source": [] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "execution_count": null, 292 | "metadata": { 293 | "coq_kernel_metadata": { 294 | "auto_roll_back": true 295 | } 296 | }, 297 | "outputs": [], 298 | "source": [] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": null, 303 | "metadata": { 304 | "coq_kernel_metadata": { 305 | "auto_roll_back": true 306 | } 307 | }, 308 | "outputs": [], 309 | "source": [] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": null, 314 | "metadata": { 315 | "coq_kernel_metadata": { 316 | "auto_roll_back": true 317 | } 318 | }, 319 | "outputs": [], 320 | "source": [] 321 | }, 322 | { 323 | "cell_type": "code", 324 | "execution_count": null, 325 | "metadata": { 326 | "coq_kernel_metadata": { 327 | "auto_roll_back": true 328 | } 329 | }, 330 | "outputs": [], 331 | "source": [] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": null, 336 | "metadata": { 337 | "coq_kernel_metadata": { 338 | "auto_roll_back": true 339 | } 340 | }, 341 | "outputs": [], 342 | "source": [] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": null, 347 | "metadata": { 348 | "coq_kernel_metadata": { 349 | "auto_roll_back": true 350 | } 351 | }, 352 | "outputs": [], 353 | "source": [ 354 | "Admitted. (* 最後にここを Qed. に変える。*)" 355 | ] 356 | }, 357 | { 358 | "cell_type": "markdown", 359 | "metadata": { 360 | "coq_kernel_metadata": { 361 | "auto_roll_back": true 362 | } 363 | }, 364 | "source": [ 365 | "\n", 366 | "## 演習問題 1-4\n", 367 | "次の定理を証明せよ。\n", 368 | "
Theorem or1 : (forall A B: Prop, A -> A \\\\/ B).
\n", 369 | "\n", 370 | "### ヒント\n", 371 | "- intros. でforallを消す。(Rule 1)\n", 372 | "- left. でAを仮説に取り込む。(Rule 7)\n", 373 | "- サブゴールと仮説が一致している。(Rule 3,4,5)\n", 374 | "\n", 375 | "### [解答を見る](./Logic-Ex-Answer.ipynb#ex14) " 376 | ] 377 | }, 378 | { 379 | "cell_type": "code", 380 | "execution_count": null, 381 | "metadata": { 382 | "coq_kernel_metadata": { 383 | "auto_roll_back": true 384 | } 385 | }, 386 | "outputs": [], 387 | "source": [ 388 | "Theorem or1 : (forall A B: Prop, A -> A \\/ B)." 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "execution_count": null, 394 | "metadata": { 395 | "coq_kernel_metadata": { 396 | "auto_roll_back": true 397 | } 398 | }, 399 | "outputs": [], 400 | "source": [] 401 | }, 402 | { 403 | "cell_type": "code", 404 | "execution_count": null, 405 | "metadata": { 406 | "coq_kernel_metadata": { 407 | "auto_roll_back": true 408 | } 409 | }, 410 | "outputs": [], 411 | "source": [] 412 | }, 413 | { 414 | "cell_type": "code", 415 | "execution_count": null, 416 | "metadata": { 417 | "coq_kernel_metadata": { 418 | "auto_roll_back": true 419 | } 420 | }, 421 | "outputs": [], 422 | "source": [] 423 | }, 424 | { 425 | "cell_type": "code", 426 | "execution_count": null, 427 | "metadata": { 428 | "coq_kernel_metadata": { 429 | "auto_roll_back": true 430 | } 431 | }, 432 | "outputs": [], 433 | "source": [] 434 | }, 435 | { 436 | "cell_type": "code", 437 | "execution_count": null, 438 | "metadata": { 439 | "coq_kernel_metadata": { 440 | "auto_roll_back": true 441 | } 442 | }, 443 | "outputs": [], 444 | "source": [] 445 | }, 446 | { 447 | "cell_type": "code", 448 | "execution_count": null, 449 | "metadata": { 450 | "coq_kernel_metadata": { 451 | "auto_roll_back": true 452 | } 453 | }, 454 | "outputs": [], 455 | "source": [] 456 | }, 457 | { 458 | "cell_type": "code", 459 | "execution_count": null, 460 | "metadata": { 461 | "coq_kernel_metadata": { 462 | "auto_roll_back": true 463 | } 464 | }, 465 | "outputs": [], 466 | "source": [] 467 | }, 468 | { 469 | "cell_type": "code", 470 | "execution_count": null, 471 | "metadata": { 472 | "coq_kernel_metadata": { 473 | "auto_roll_back": true 474 | } 475 | }, 476 | "outputs": [], 477 | "source": [ 478 | "Admitted. (* 最後にここを Qed. に変える。*)" 479 | ] 480 | }, 481 | { 482 | "cell_type": "markdown", 483 | "metadata": { 484 | "coq_kernel_metadata": { 485 | "auto_roll_back": true 486 | } 487 | }, 488 | "source": [ 489 | "\n", 490 | "## 演習問題 1-5\n", 491 | "次の定理を証明せよ。\n", 492 | "
Theorem or2 : (forall A B: Prop, B -> A \\\\/ B).
\n", 493 | "\n", 494 | "### ヒント\n", 495 | "- intros. でforallを消す。(Rule 1)\n", 496 | "- right. でBを仮説に取り込む。(Rule 7)\n", 497 | "- サブゴールと仮説が一致している。(Rule 3,4,5)\n", 498 | "\n", 499 | "### [解答を見る](./Logic-Ex-Answer.ipynb#ex15) " 500 | ] 501 | }, 502 | { 503 | "cell_type": "code", 504 | "execution_count": null, 505 | "metadata": { 506 | "coq_kernel_metadata": { 507 | "auto_roll_back": true 508 | } 509 | }, 510 | "outputs": [], 511 | "source": [ 512 | "Theorem or2 : (forall A B: Prop, B -> A \\/ B)." 513 | ] 514 | }, 515 | { 516 | "cell_type": "code", 517 | "execution_count": null, 518 | "metadata": { 519 | "coq_kernel_metadata": { 520 | "auto_roll_back": true 521 | } 522 | }, 523 | "outputs": [], 524 | "source": [] 525 | }, 526 | { 527 | "cell_type": "code", 528 | "execution_count": null, 529 | "metadata": { 530 | "coq_kernel_metadata": { 531 | "auto_roll_back": true 532 | } 533 | }, 534 | "outputs": [], 535 | "source": [] 536 | }, 537 | { 538 | "cell_type": "code", 539 | "execution_count": null, 540 | "metadata": { 541 | "coq_kernel_metadata": { 542 | "auto_roll_back": true 543 | } 544 | }, 545 | "outputs": [], 546 | "source": [] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "execution_count": null, 551 | "metadata": { 552 | "coq_kernel_metadata": { 553 | "auto_roll_back": true 554 | } 555 | }, 556 | "outputs": [], 557 | "source": [] 558 | }, 559 | { 560 | "cell_type": "code", 561 | "execution_count": null, 562 | "metadata": { 563 | "coq_kernel_metadata": { 564 | "auto_roll_back": true 565 | } 566 | }, 567 | "outputs": [], 568 | "source": [] 569 | }, 570 | { 571 | "cell_type": "code", 572 | "execution_count": null, 573 | "metadata": { 574 | "coq_kernel_metadata": { 575 | "auto_roll_back": true 576 | } 577 | }, 578 | "outputs": [], 579 | "source": [] 580 | }, 581 | { 582 | "cell_type": "code", 583 | "execution_count": null, 584 | "metadata": { 585 | "coq_kernel_metadata": { 586 | "auto_roll_back": true 587 | } 588 | }, 589 | "outputs": [], 590 | "source": [ 591 | "Admitted. (* 最後にここを Qed. に変える。*)" 592 | ] 593 | }, 594 | { 595 | "cell_type": "markdown", 596 | "metadata": { 597 | "coq_kernel_metadata": { 598 | "auto_roll_back": true 599 | } 600 | }, 601 | "source": [ 602 | "\n", 603 | "## 演習問題 1-6\n", 604 | "次の定理を証明せよ。\n", 605 | "
Theorem modus_ponens : (forall A B: Prop, A -> (A -> B) ->B).
\n", 606 | "\n", 607 | "### ヒント\n", 608 | "- intros. で先頭のforall を削除する。(Rule1)\n", 609 | "- 再び intros で、AとA -> Bを仮説に移す。(Rule 2) \n", 610 | "- 仮説A -> Bを仮説(この場合はA)に適用して、サブゴールをBに変える。applyを使う。(Rule 9)\n", 611 | "- 仮説とサブゴールが一致する。(Rule 3,4,5)\n", 612 | "\n", 613 | "### [解答を見る](./Logic-Ex-Answer.ipynb#ex16) " 614 | ] 615 | }, 616 | { 617 | "cell_type": "code", 618 | "execution_count": null, 619 | "metadata": { 620 | "coq_kernel_metadata": { 621 | "auto_roll_back": true 622 | } 623 | }, 624 | "outputs": [], 625 | "source": [ 626 | "Theorem modus_ponens : (forall A B: Prop, A -> (A -> B) ->B)" 627 | ] 628 | }, 629 | { 630 | "cell_type": "code", 631 | "execution_count": null, 632 | "metadata": { 633 | "coq_kernel_metadata": { 634 | "auto_roll_back": true 635 | } 636 | }, 637 | "outputs": [], 638 | "source": [] 639 | }, 640 | { 641 | "cell_type": "code", 642 | "execution_count": null, 643 | "metadata": { 644 | "coq_kernel_metadata": { 645 | "auto_roll_back": true 646 | } 647 | }, 648 | "outputs": [], 649 | "source": [] 650 | }, 651 | { 652 | "cell_type": "code", 653 | "execution_count": null, 654 | "metadata": { 655 | "coq_kernel_metadata": { 656 | "auto_roll_back": true 657 | } 658 | }, 659 | "outputs": [], 660 | "source": [] 661 | }, 662 | { 663 | "cell_type": "code", 664 | "execution_count": null, 665 | "metadata": { 666 | "coq_kernel_metadata": { 667 | "auto_roll_back": true 668 | } 669 | }, 670 | "outputs": [], 671 | "source": [] 672 | }, 673 | { 674 | "cell_type": "code", 675 | "execution_count": null, 676 | "metadata": { 677 | "coq_kernel_metadata": { 678 | "auto_roll_back": true 679 | } 680 | }, 681 | "outputs": [], 682 | "source": [] 683 | }, 684 | { 685 | "cell_type": "code", 686 | "execution_count": null, 687 | "metadata": { 688 | "coq_kernel_metadata": { 689 | "auto_roll_back": true 690 | } 691 | }, 692 | "outputs": [], 693 | "source": [] 694 | }, 695 | { 696 | "cell_type": "code", 697 | "execution_count": null, 698 | "metadata": { 699 | "coq_kernel_metadata": { 700 | "auto_roll_back": true 701 | } 702 | }, 703 | "outputs": [], 704 | "source": [ 705 | "Admitted. (* 最後にここを Qed. に変える。*)" 706 | ] 707 | }, 708 | { 709 | "cell_type": "markdown", 710 | "metadata": { 711 | "coq_kernel_metadata": { 712 | "auto_roll_back": true 713 | } 714 | }, 715 | "source": [ 716 | "\n", 717 | "## 演習問題 1-7\n", 718 | "次の定理を証明せよ。\n", 719 | "
Theorem modus_ponens2 : (forall A B C: Prop, A -> (A -> B) ->(B ->C) -> C).
\n", 720 | "\n", 721 | "### ヒント\n", 722 | "- intros でforallを削除する。\n", 723 | "- intros で、全ての -> の前提部分を仮説に移す。この時、適当なラベルをつけておくと分かりやすくなる。この例の場合なら、intros Proof_of_A A_implies_B B_implies_C とか。\n", 724 | "- apply B_implies_C で、サブゴールをBに変える。\n", 725 | "- apply A_implies_B で、サブゴールをAに変える。\n", 726 | "- 仮説とサブゴールが一致している。\n", 727 | "\n", 728 | "### [解答を見る](./Logic-Ex-Answer.ipynb#ex17) " 729 | ] 730 | }, 731 | { 732 | "cell_type": "code", 733 | "execution_count": null, 734 | "metadata": { 735 | "coq_kernel_metadata": { 736 | "auto_roll_back": true 737 | } 738 | }, 739 | "outputs": [], 740 | "source": [ 741 | "Theorem modus_ponens2 : (forall A B C: Prop, A -> (A -> B) ->(B ->C) -> C)." 742 | ] 743 | }, 744 | { 745 | "cell_type": "code", 746 | "execution_count": null, 747 | "metadata": { 748 | "coq_kernel_metadata": { 749 | "auto_roll_back": true 750 | } 751 | }, 752 | "outputs": [], 753 | "source": [] 754 | }, 755 | { 756 | "cell_type": "code", 757 | "execution_count": null, 758 | "metadata": { 759 | "coq_kernel_metadata": { 760 | "auto_roll_back": true 761 | } 762 | }, 763 | "outputs": [], 764 | "source": [] 765 | }, 766 | { 767 | "cell_type": "code", 768 | "execution_count": null, 769 | "metadata": { 770 | "coq_kernel_metadata": { 771 | "auto_roll_back": true 772 | } 773 | }, 774 | "outputs": [], 775 | "source": [] 776 | }, 777 | { 778 | "cell_type": "code", 779 | "execution_count": null, 780 | "metadata": { 781 | "coq_kernel_metadata": { 782 | "auto_roll_back": true 783 | } 784 | }, 785 | "outputs": [], 786 | "source": [] 787 | }, 788 | { 789 | "cell_type": "code", 790 | "execution_count": null, 791 | "metadata": { 792 | "coq_kernel_metadata": { 793 | "auto_roll_back": true 794 | } 795 | }, 796 | "outputs": [], 797 | "source": [] 798 | }, 799 | { 800 | "cell_type": "code", 801 | "execution_count": null, 802 | "metadata": { 803 | "coq_kernel_metadata": { 804 | "auto_roll_back": true 805 | } 806 | }, 807 | "outputs": [], 808 | "source": [] 809 | }, 810 | { 811 | "cell_type": "code", 812 | "execution_count": null, 813 | "metadata": { 814 | "coq_kernel_metadata": { 815 | "auto_roll_back": true 816 | } 817 | }, 818 | "outputs": [], 819 | "source": [] 820 | }, 821 | { 822 | "cell_type": "code", 823 | "execution_count": null, 824 | "metadata": { 825 | "coq_kernel_metadata": { 826 | "auto_roll_back": true 827 | } 828 | }, 829 | "outputs": [], 830 | "source": [ 831 | "Admitted. (* 最後にここを Qed. に変える。*)" 832 | ] 833 | }, 834 | { 835 | "cell_type": "markdown", 836 | "metadata": { 837 | "coq_kernel_metadata": { 838 | "auto_roll_back": true 839 | } 840 | }, 841 | "source": [ 842 | "\n", 843 | "## 演習問題 1-8\n", 844 | "次の定理を証明せよ。\n", 845 | "
Theorem and_comm : (forall A B: Prop, A /\\ B -> B /\\ A ).
\n", 846 | "\n", 847 | "### ヒント\n", 848 | "- intros で、forall を削除し、\"A /\\ B\" にH というラベルをつける 。(Rule 1)\n", 849 | "- \"H: A/\\ B\" を destruct で分解し、A, B を仮説に追加する。 (Rule 6)\n", 850 | "- サブゴール \"A\\/ B\" を split で、二つのサブゴールに分割する。 (Rule 8)\n", 851 | "- 一つ目のサブゴールは仮説の一つと同じなので解ける。サブゴールは一つになる。(Rule 2,3,4)\n", 852 | "- 残ったサブゴールも仮説の一つと一緒なので、解ける。(Rule 2,3,4)\n", 853 | "- サブゴールは残っていないので証明終了。\n", 854 | "\n", 855 | "### [解答を見る](./Logic-Ex-Answer.ipynb#ex18) " 856 | ] 857 | }, 858 | { 859 | "cell_type": "code", 860 | "execution_count": null, 861 | "metadata": { 862 | "coq_kernel_metadata": { 863 | "auto_roll_back": true 864 | } 865 | }, 866 | "outputs": [], 867 | "source": [ 868 | "Theorem and_comm : (forall A B: Prop, A /\\ B -> B /\\ A )." 869 | ] 870 | }, 871 | { 872 | "cell_type": "code", 873 | "execution_count": null, 874 | "metadata": { 875 | "coq_kernel_metadata": { 876 | "auto_roll_back": true 877 | } 878 | }, 879 | "outputs": [], 880 | "source": [] 881 | }, 882 | { 883 | "cell_type": "code", 884 | "execution_count": null, 885 | "metadata": { 886 | "coq_kernel_metadata": { 887 | "auto_roll_back": true 888 | } 889 | }, 890 | "outputs": [], 891 | "source": [] 892 | }, 893 | { 894 | "cell_type": "code", 895 | "execution_count": null, 896 | "metadata": { 897 | "coq_kernel_metadata": { 898 | "auto_roll_back": true 899 | } 900 | }, 901 | "outputs": [], 902 | "source": [] 903 | }, 904 | { 905 | "cell_type": "code", 906 | "execution_count": null, 907 | "metadata": { 908 | "coq_kernel_metadata": { 909 | "auto_roll_back": true 910 | } 911 | }, 912 | "outputs": [], 913 | "source": [] 914 | }, 915 | { 916 | "cell_type": "code", 917 | "execution_count": null, 918 | "metadata": { 919 | "coq_kernel_metadata": { 920 | "auto_roll_back": true 921 | } 922 | }, 923 | "outputs": [], 924 | "source": [] 925 | }, 926 | { 927 | "cell_type": "code", 928 | "execution_count": null, 929 | "metadata": { 930 | "coq_kernel_metadata": { 931 | "auto_roll_back": true 932 | } 933 | }, 934 | "outputs": [], 935 | "source": [] 936 | }, 937 | { 938 | "cell_type": "code", 939 | "execution_count": null, 940 | "metadata": { 941 | "coq_kernel_metadata": { 942 | "auto_roll_back": true 943 | } 944 | }, 945 | "outputs": [], 946 | "source": [] 947 | }, 948 | { 949 | "cell_type": "code", 950 | "execution_count": null, 951 | "metadata": { 952 | "coq_kernel_metadata": { 953 | "auto_roll_back": true 954 | } 955 | }, 956 | "outputs": [], 957 | "source": [ 958 | "Admitted. (* 最後にここを Qed. に変える。*)" 959 | ] 960 | }, 961 | { 962 | "cell_type": "markdown", 963 | "metadata": { 964 | "coq_kernel_metadata": { 965 | "auto_roll_back": true 966 | } 967 | }, 968 | "source": [ 969 | "\n", 970 | "## 演習問題 1-9\n", 971 | "次の定理を証明せよ。\n", 972 | "
Theorem or_comm : (forall A B: Prop, A \\\\/ B -> B \\\\/ A ) .
\n", 973 | "\n", 974 | "### ヒント\n", 975 | "- intros で\"A \\/ B\" を仮定に移し、A_or_B というラベルをつける。\n", 976 | "- A\\/B をdestructすると、Aが仮定に残り、サブゴールが二つに分割される。\n", 977 | "- 一つ目のサブゴールから、right でB\\/A の右の項Aをサブゴールに残す。 \n", 978 | "- サブゴールと仮定が一致している。 サブゴールは一つになる。\n", 979 | "- 一つ目のサブゴールから、left でB\\/A の左の項Bをサブゴールに残す。 \n", 980 | "\n", 981 | "### [解答を見る](./Logic-Ex-Answer.ipynb#ex) " 982 | ] 983 | }, 984 | { 985 | "cell_type": "code", 986 | "execution_count": null, 987 | "metadata": { 988 | "coq_kernel_metadata": { 989 | "auto_roll_back": true 990 | } 991 | }, 992 | "outputs": [], 993 | "source": [ 994 | "Theorem or_comm : (forall A B: Prop, A \\/ B -> B \\/ A ) ." 995 | ] 996 | }, 997 | { 998 | "cell_type": "code", 999 | "execution_count": null, 1000 | "metadata": { 1001 | "coq_kernel_metadata": { 1002 | "auto_roll_back": true 1003 | } 1004 | }, 1005 | "outputs": [], 1006 | "source": [] 1007 | }, 1008 | { 1009 | "cell_type": "code", 1010 | "execution_count": null, 1011 | "metadata": { 1012 | "coq_kernel_metadata": { 1013 | "auto_roll_back": true 1014 | } 1015 | }, 1016 | "outputs": [], 1017 | "source": [] 1018 | }, 1019 | { 1020 | "cell_type": "code", 1021 | "execution_count": null, 1022 | "metadata": { 1023 | "coq_kernel_metadata": { 1024 | "auto_roll_back": true 1025 | } 1026 | }, 1027 | "outputs": [], 1028 | "source": [] 1029 | }, 1030 | { 1031 | "cell_type": "code", 1032 | "execution_count": null, 1033 | "metadata": { 1034 | "coq_kernel_metadata": { 1035 | "auto_roll_back": true 1036 | } 1037 | }, 1038 | "outputs": [], 1039 | "source": [] 1040 | }, 1041 | { 1042 | "cell_type": "code", 1043 | "execution_count": null, 1044 | "metadata": { 1045 | "coq_kernel_metadata": { 1046 | "auto_roll_back": true 1047 | } 1048 | }, 1049 | "outputs": [], 1050 | "source": [] 1051 | }, 1052 | { 1053 | "cell_type": "code", 1054 | "execution_count": null, 1055 | "metadata": { 1056 | "coq_kernel_metadata": { 1057 | "auto_roll_back": true 1058 | } 1059 | }, 1060 | "outputs": [], 1061 | "source": [] 1062 | }, 1063 | { 1064 | "cell_type": "code", 1065 | "execution_count": null, 1066 | "metadata": { 1067 | "coq_kernel_metadata": { 1068 | "auto_roll_back": true 1069 | } 1070 | }, 1071 | "outputs": [], 1072 | "source": [] 1073 | }, 1074 | { 1075 | "cell_type": "code", 1076 | "execution_count": null, 1077 | "metadata": { 1078 | "coq_kernel_metadata": { 1079 | "auto_roll_back": true 1080 | } 1081 | }, 1082 | "outputs": [], 1083 | "source": [ 1084 | "Admitted. (* 最後にここを Qed. に変える。*)" 1085 | ] 1086 | } 1087 | ], 1088 | "metadata": { 1089 | "kernelspec": { 1090 | "display_name": "Coq", 1091 | "language": "coq", 1092 | "name": "coq" 1093 | }, 1094 | "language_info": { 1095 | "file_extension": ".v", 1096 | "mimetype": "text/x-coq", 1097 | "name": "coq", 1098 | "version": "8.9.1" 1099 | } 1100 | }, 1101 | "nbformat": 4, 1102 | "nbformat_minor": 2 1103 | } 1104 | --------------------------------------------------------------------------------