オペレータは op
を使って宣言する:
op
<op-name> :
<arity> ->
<sort-of-op> {
<operator-attribute> }
<op-name> にはオペレータ名、<arity> にはアリティ (arity) 、<sort-of-op> にはオペレータのソート (sort of operator) を指定する。アリティとは引数に対応する概念であり、ソート名の列である。オペレータのソート※とは返戻値の型に対応する概念である。アリティとオペレータのソートの組をランク (rank) と呼ぶ。オペレータの属性については、後述する。
※ コアリティ (co-arity) と呼ぶこともある。
同じランクを持つ複数のオペレータは ops
を使って一度に宣言できる:
ops
<op-name>
...
<op-name> :
<arity> ->
<sort-of-op> {
<operator-attribute> }
CafeOBJ では、オペレータの引数の位置を自由に指定することができる。例えば、中置演算子の + や、より複雑な演算子を宣言できる。オペレータの位置はオペレータ名の中の _
(下線) で表される。
オペレータの宣言例を以下に示す:
** 定数 (アリティが空列の演算)
ops true false : -> Bool
** 中置演算子の加算
op _+_ : Nat Nat -> Nat
** mix-fix の if 文
op if_then_else_if : Bool Exp Exp -> Exp
** (juxtaposition) の列
op __ : Elt Sequence -> Sequence
オペレータには、以下の属性を指定できる:
assoc
: 結合律comm
: 交換律r-assoc
: 右結合l-assoc
: 左結合idem
: べき等律id:
<op-name> : <op-name> は単位元idr:
<op-name> : <op-name> は単位元 (id
との違いは割愛)prec:
<precedence> : 演算子の結合の強さ (<precedence> の数値が小さいほど強い)strat: (
<e-strategy>)
: E 戦略を用いた簡約順序の指定それぞれの詳しい解説は CafeOBJ マニュアルを参照してほしい。
例えば、自然数の仕様に現れる、+
が結合律と交換律を持つことが証明できたならば、+
は属性指定を使って次のように宣言し直すことができる:
mod! NAT+AC { pr(NAT+) op _+_ : Nat Nat -> Nat { assoc comm } }
これらの属性は演算の意味を簡潔に記述するのに大いに役立つが、よく理解しないで用いると思いもよらぬ結果を招くことがある。初心者は、使用法が確立され、その効用がよく理解されている{assoc comm}などの組み合わせに限定して使うことが望ましい。
Original Copyright © Takahiro Seino, all rights reserved.