Org-mode でテキストを書きながら Proof General みたいに Coq コード書いて評価! をしたいなぁと思った結果生まれた Org-mode を拡張したような感じのそれです。
特に、証明中のゴールとかをぽんぽんと挿入したいなぁと思っていたので、そんな機能も入っています。
あまり重いコードには使わない方が幸せだと思います(私は試していません)。
ちょっと変なことするとすぐにめんどくさくなるので、何かあったら C-c C-x するのがいいと思うよ。
1/16(fri) に Org mode 用の Coq スクリプトエクスポータの ox-coq.el
を使うようになりました。
作ったの僕なんですけどね、しかもかなりのプロトタイプ。
- ProofGeneral を使えるようにしておく。
- Org-mode も使えるようにしておく。
ox-coq.el
をパスの通る場所に置いて(load "ox-coq.el")
しておく。pg-org.el
をパスの通る場所に置いて(load "pg-org.el")
しておく。auto-mode-alist
とか使ってpg-org-mode
と何かを関連付けておくとよい。
(load "ox-coq")
(load "pg-org")
(add-to-list 'auto-mode-alist '("\\.org$" . pg-org-mode))
org-mode
の派生モードなので、 org-mode
で使える機能は(多分)使えます。
肝はやっぱエクスポートかなー。
pg-org-mode
には現時点で七つの機能があり、それぞれにキーバインドが設定してあります。
各機能は、評価系、挿入系、その他の三つに分類されています。
ProofGeneral と同じ雰囲気で。
C-c C-<return>
- 現在のカーソルがあるソースブロックまでを評価。
C-c C-n
- これまでに評価してきたソースブロックたちの、次の一つを評価。
C-c C-u
- ソースブロックの評価を一つ戻す(実態は、一つ前のソースブロックまでの評価)。
現在、挿入されるものは全て EXAMPLE
ブロックとして挿入(#+BEGIN_EXAMPLE ... #+END_EXAMPLE
で囲われる)されます。
C-c C-;
- 直前の評価結果を挿入。
Compute
やCheck
のあとに使うと便利。 C-c C-i g
- 現在証明中のゴールを一つ挿入。複数のサブゴールがあるときは番号を聞かれます。
C-c C-i c
- 入力されたコマンドを評価し、その結果を挿入。ピリオドは忘れずに。
C-c C-x C-e
- 問答無用で評価中止。気を付けよう。
まだまだ機能が足りていないので、やりたいことを全て列挙するのは難しいのですが、 代表的なものを書いてみます。
今の評価位置の決定方法は非常に雑で、 ソースブロック外のテキストが大幅に変更されたりすると思っていたところとは違うポイントまで 評価されることがあります。
ソースブロックの位置を適切に監視できる方法などが要りそうです。
ProofGeneral のようにハイライト付けるか、 評価済みのソースブロックに印を付けるか、 いずれにせよどこまで評価したかが見てわかるようにしたい。
今は全部 EXAMPLE
ブロックでの挿入なのですが、
これだと挿入後に区別できなくなってしまいます。
ゴールなら #+BEGIN_GOAL ... #+END_GOAL
で括るとかしておきたいですね。
すぐにやれそうだなこれ。
ProofGeneral の unicode-tokens-mode
でショートカットを
disable にした状態と同じことがしたいなぁと思っています。
alpha
って入力したら 𝞪 って表示されるようなアレです。
coq-unicode-tokens.el
を参考にすればよさそう。
Org-mode の機能として、ブロック内で =C-c ‘= すると(指定されていれば)適切なメジャーモードで そのブロック内を編集できるという素敵なものがあります。
pg-org-mode
中でも当然それができるのですが、
これを実行すると現在のフレームが vorg ファイルのバッファとブロックだけを抽出したバッファの二つのみに
なってしまって、ゴールの確認とかがしづらいです。
対話的証明とはなんだったのかという思いが頭を過るので、バッファの分割法などを調整するつもりです。