オペレータは 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.