仕事でPlay2を少し調べた。割と簡単そうかなと思う。nodejsなみに扱いやすそうかもしらん。
少しはscalaもやるかな。

今日のCoq

Imp_J.vに入る。四則演算も満足に出来ないミニ言語のくせに、証明がいきなり長い。それに応じてTacticも大量に出て来た。それぞれが何やってんのかすらよく分からない。

  • tryタクティカル
  • ;タクティカル
  • Tactic Notation
  • clear H: 仮定Hをコンテキストから消去します。
  • subst x: コンテキストから仮定 x = e または e = x を発見し、 xをコンテキストおよび現在のゴールのすべての場所でeに置き換え、 この仮定を消去します。
  • subst: x = e および e = x の形のすべての仮定を置換します。
  • rename... into...: 証明コンテキストの仮定の名前を変更します。 例えば、コンテキストがxという名前の変数を含んでいるとき、 rename x into y は、すべてのxの出現をyに変えます。
  • assumption: ゴールにちょうどマッチする仮定Hをコンテキストから探そうとします。 発見されたときは apply H と同様に振る舞います。
  • contradiction: Falseと同値の仮定Hをコンテキストから探そうとします。 発見されたときはゴールを解きます。
  • constructor: 現在のゴールを解くのに使えるコンストラクタcを (現在の環境のInductiveによる定義から)探そうとします。 発見されたときは apply c と同様に振る舞います。

そして究極の omega。FF5か。

関係を記述するbevalR問題で苦闘。定義が間違ってんのか証明が下手糞なのか区別がつかない。
というところで、omegaタクティクを思い出す。

Theorem beval_iff_bevalR : forall (be : bexp) (b : bool),
  (be || b) <-> beval be = b.
Proof.
  intros. omega.

で、ドン

Toplevel input, characters 15-20:
Error: Omega: Can't solve a goal with equality on bool

あー定義まちがってるようだわ。おかしーな。