[WIP]TODO多めのまま公開します。別に書いてた下書きが消えたので。定理証明のコンテストシステムを作って、今日の夕方に第1回のコンテストを開催していた。2019年8月18日これです。定理証明コンテストとは,定理証明支援系を用いて与えられた定理に対して証明を与えるコンテストです。現在コンテストサイトに実装されている支援系はCoqです。Coqで解く問題の見た目はこんなかんじです。*)Qed.これはn×(m+1)とn+(n×m)が任意の自然数n,mについて等しいことを示せというものです。HEREの部分にCoqの言葉で証明を与えます。この問題を通そう環境準備Coqのインストールをしたのち,Coqをインタラクティブに使うツールを用意します。ツールにはEmacs+ProofGeneralが最も標準的です。WindowsではCoqIDEを使う方法もあります。現在バグだらけで使い物になりません。その方法をおすすめすることはできません。Emacs+Spacemacs+ProofGeneral導入記事は後で書くことにします。TODOここでは他の選択肢として,macでvscode+vscoqを用いる方法を説明します。最新のvscodeでは正常に動作しません。2年前ぐらいのvscodeをダウンロードして利用しましょう。2018vscodeでvscoq拡張をインストールします。して*.vファイルを開くと,次の証明画面が出ます。TODO定義というわけでこの命題を示しましょう。m.定理の証明にはまず定義を観察することが大事です。ドキュメントに定義があります。Coq上でも定義を見ることができます。nat.natという集合は,次の2つのコンストラクタから生み出されるものである。コンストラクタ"O"は無引数でnatである。コンストラクタ"S"はnatを引数に取ることでnatである。O)なんかがnatで有ることがわかります。これが我々の良く知る自然数であるところの0や2に対応しています。O)のエイリアスです。nat_scope.と再帰的に定義されています。matchは関数型言語ではおなじみのパターンマッチです。その先の項を返します。O)と読むことに注意してください。演算子のほうが関数適用っぽいものより優先度が弱いです。O)))))という感じです。Coqは便利で,具体的な例の計算ならやってくれます。実際に証明を行っています。coqでは定理の証明を次の形で書きます。証明tacticの列Qed.Proof.のあとに続くのは証明のtacticというものです。証明の状態を変化させます。証明するべきものである「ゴール」の列です。ゴールとは次の形で表されます。「仮定の列から結論を導く」ことを要求するものがゴールです。命題が結論となったゴールが1つだけ状態から始まります。証明を完遂したことになります。この状態を表しています。reflexivity.Qed.例交えてやる。初めに示した命題の証明を行いたいと思います。この程度の命題であれば自動で解いてくれる強いtaciticがあります。自動証明tacticはゴールに対してtacticを適用するかを定義することで作られています。ringというtacticを用いれば自動で行ってくれます。omegaといったtacticがあります。証明してくれる命題の範囲がそれほど広くないです。その証明を自分でもできるときに限って使うのが良いです。僕が示せなかった証明を振り返る長くなってきたので後編へ移ります。Coqの勉強法はこれが一番有名らしいです。2019年8月21日また京大の五十嵐先生の講義テキストも便利です。証明コンテストTopProverは出れば出るだけ得するレートの付き方をするらしいです。参加して証明力を高めましょう。京都はクソ湿度が高くて気力が出ないです。そんなズボラな状態でもコマンドは叩けるようにようにしておきたいものです。-CF'ただ,zshの設定で空コマンドでEnterするとlsになっている。v='vim'必須s='less'LESSに環境変数をつけていない人はつけましょう。catとして使えます。add'gaよりもaで良いのではと考えてこうなっている。--show-toplevel'git管理されているトップレベルに戻る。+%Y%m%d'$(d)の形で使う。+%Y%m%dT%H%M%S'とともに,ファイルの名前付けに使うと便利。m='make'Makefileはめちゃくちゃ便利。-2'最近はtmuxを使わなくなってしまった。exec'の3点セットで使う。京都市バスの地図を見た時,考えることがあると思います。サイコロを振ってすごろくをすると楽しいのではないかと。いうわけで,京都市バスの1日乗車券を用いて,リアルすごろくを行いました。(去年の夏)ルール目的地バス停を決定する。遠くに行くとめんどくさいので,桂川より内側,JR東海道本線より内側だけにした。参加者はバス停に向かう。遠くのバス停に歩いても良い。6面ダイスを2こ振る。ダイスを降る前に時刻表を確認してはならない。最初に来たバスに乗って出た目の数だけ停留所を進む。目的地バス停に降り立つとポイントを獲得。通過する場合でも途中で降りることができる。17:00になるまで,新しい目的地を決定しこれを繰り返す。参加者の一人のnonylene氏の詳細な記事はこれです。丁寧なまとめなので雰囲気はこっちを読むと面白いです。utgw氏の4人が百万遍に集まった。作ったアプリケーションでランダムにバス停を決定する。最初のバス停は「木辻南町」になった。全員が同じバス停に向かい,サイコロを降った。このためだけに便利なアプリを作った。上から順番に現在地点のバス停を入力する。(GPSから自動入力可能)どの乗り場から乗るかを入力する。サイコロを降るボタンを押す。最初にやってきたバスに乗る。乗ってきたバスを入力する。降りた場所を入力する。(GPSから自動入力可能)これによって全員の行動が逐次slackに送られてきます。僕は最初のサイコロで3を出し,最初にやってきた102系統で「烏丸今出川」まで乗った。続いて11を出し,203系統で「円町」まで直行。「木辻南町」へのバスの乗り場が異なる最高のバス停に到着した。どのバスに乗るかを決めることができないこのルールにおいて,バスの乗り場は決められても乗りたいバスに乗ることは困難となる。93系統は3本/時であり,4系統以上あるバス停から93系統に乗れる可能性は低い。今回は「円町」に到着したので,どのバスに乗っても「木辻南町」に向かう西行き乗り場に向かった。バス停に着いて,必要となる3以上の9の目が出たのでバスに乗って1番乗りでゴールした。やってきたはいいが,木辻南町には何の目的もないので,次の目的地を設定する。次の目的地は「新間ノ町二条」だ地獄の四条大宮東行乗り場サイコロを振ってたどり着いたは「四条大宮」だ。ここは大きいターミナルであり,多くのバスが発着する。このルールの上では,かなりの難敵となり襲いかかってくる。http://www.arukumachi-kyoto.jp/info/wp-content/uploads/2015/09/shijoomiya-20150906.pdf東行1番乗り場は8つの異なる行き先を持つバスが発着する。京都駅へ向かうバス,5駅先の四条河原町から南北に,7駅先の祇園から南北にとバスが分かれる。7より大きい数をダイスで降ってしまうと,行き先は全く選べないだろう。東行1番乗り場で出した目は11.やってきたバスは207系統。目的地と反対方向である。バスから降りて即ダッシュ参加者の人々は同じバスからそれぞれ別の停留所で降りて目的地にダッシュしたらしい。同じバスから異なるバス停で順々に降りて直ちにダッシュした人々が同じバス停へ向かう。ダッシュはutgw氏の勝利だったらしい。この時まだ僕は207系統に乗っていた。ランチタイム目的地は御室仁和寺になった。五条坂からめちゃくちゃ遠い。御室仁和寺に行くバスがあったが,これはJRバスなので1日乗車券で乗れない。眼の前でJRバスが通り過ぎていく。サイコロを振って辿り着く先が「今出川大宮」だった。ここで予め設定していたイベントが発火した。是空というラーメン屋で一緒に食べた。ラーメンを食べた後,何回かバスに乗ってあがいていたが,tron氏に圧倒的に負けた。tron氏のバス停写真。仁和寺に来たが,特に用事はないので次の目的地へ向かう。休憩フェイズ気持ちがわかってきて,こういう系統がたくさんあるバス停を見ると絶望するようになる。2回ぐらい目的地が更新されて休憩になった。近くの神社仏閣に行くことになった。梅津大社や,西院春日神社に人々は向かったらしい。僕は特に観光スポットでもない寺社を眺めることになった。終了17:00になったので,最後の目的地を百万遍として終了になった。僕は百万遍からかなり離れていたので,最後の目的地へのサイコロ移動はギブアップした。17:29にutgw氏が最初にゴール。合計2回の目的地到達。17:39にtron氏がゴール。合計2回の目的地到達。17:48にnonylene氏がゴール。合計2回の目的地到達。僕は3回目的地到達したので一応優勝らしい。これで一日乗車券を酷使する会は終了となった。行動タイムラインがすごいことになる。これはnonylene氏のタイムライン。行ったことがない場所に乗ったことがないバスで飛ばされるので良い。日頃運動しないので,見ない町を歩くのが楽しいし健康。600円ですごい旅行した気持ちになる。機会があったらまたやっても良い。ドメイン特化のアプリケーションの使いやすさは最高なので。16回乗ったので3680を600円で乗ったことになり,およそ6倍の得。コマンドで治る書きかけのコマンドを保持するCtrl-Qでバッファをスタックする。新しいプロンプトを出すと復帰する。前回のコマンドの一部を書き換える^hoge^hugaで前回のコマンドの一部を置換して実行できる。fugaをすると,例えば~/hoge-dir/dirから~/fuga-dir/dirに移動する。標準エラーもパイプする|&でパイプすれば良い。2>&1は「2の指す先(stderr)を1の指す先(stdout)にする」と読む。1>&3だとstderrとstdoutがスワップします。履歴検索Ctrl-Rでコマンド履歴をインクリメンタルサーチする。ようにコマンドの始め部分を入力する。悲しいが,SSLを無効化するしかない...wgetのSSL無効化というかこれは証明書の無視ですね。Scriptを実行するアプリを作成すると良い知見Spacemacsをmacにインストールすると,Applicationsにシンボリックリンクを作れ,という指示が出る。~/Applications/Emacs.appこれはSpotlightに読み込まれない。Scriptを実行するアプリケーションを作る。$@そして,作ったアプリケーションをApplicationsに保存する。Differentついでに,IconがAutomatorだとキモいので置き換える。「情報を見る」のウインドウのアイコンはCommand+C/Vでコピペできる。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。