LoginSignup
8
5

More than 5 years have passed since last update.

Coqでもあのニンジャパターンマッチが使えるぜ

Posted at

Coqでペア(2つ組)を束縛するlet式のときにはOCamlと同様に束縛する側にパターンを書くことができる。

Ninja.v
  let (x, y) := (1, 2) in
  ...

しかし、これが3つ組になるとエラーとなる。

Ninja.v
  let (x, y, z) := (1, 2, 3) in
  ...
Error: Destructing let on this type expects 2 variables.

これはCoqのNinjaパターンマッチが2つ組だけしか考慮していないというわけではない。

let (変数名1, ..., 変数名n) := 1 in ...

という式は実は一般的に単一コンストラクタを持つすべてのInductive型で使用できることができ、それは次の内容と等価になる。

match 1 with
| コンストラクタ(変数名1,...,変数名n) => ...
end

これはタプル以外でも使えるという利点がある一方で、入れ子になるパターンでは使えないという不便な点もある。上での3つ組でのエラーはちょうどその場合ではまっているということである(Coqの(1,2,3)は内部では((1,2),3)と扱われる)。

これだと不便だという事で、入れ子になったパターンマッチに対応した構文が用意されている。3つ組でのNinja パターンマッチをしたい場合は次のように書けば良い。

Ninja.v
  let '(x, y, z) := (1, 2, 3) in
  ...

それでは、良いニンジャパターンマッチを!

参考: https://coq.inria.fr/distrib/current/refman/Reference-Manual004.html

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5