CafeOBJ において簡約 (reduction) とは、宣言された等式を左辺から右辺への書き換え規則とみなし、与えられた項を書き換え規則を使って次々に書き換え (規則をどんな順序で適用するのかは任意) 、できるだけ簡単な表現にすることである。どの書き換え規則を使っても、これ以上書き換えできない項を標準形 (normal form) と呼ぶ。簡約とは、等式を一方向にだけ使う、等式推論 (equational reasoning) である。
コマンド red は項 <term> を簡約する:
red <term> .
簡約の例:
自然数の仕様で宣言したモジュール NAT+ を使って、項 s(s(0)) + s(s(s(0))) を簡約する。
最初に、モジュール NAT+ を選択する。
CafeOBJ> select NAT+ NAT+>
red コマンドを使って項 s(s(0)) + s(s(s(0))) を簡約する。
NAT+> red s(s(0)) + s(s(s(0))) . -- reduce in NAT+ : s(s(0)) + s(s(s(0))) s(s(s(s(s(0))))) : Nat (0.000 sec for parse, 3 rewrites(0.010 sec), 5 matches) NAT+>
red コマンドは s(s(0)) + s(s(s(0))) の簡単な表現である s(s(s(s(s(0))))) (つまり、2 + 3 = 5) を返す。
簡約過程を表示するには trace スイッチを on にする。こうすると、red コマンドは、簡約過程を表示する:
NAT+> set trace on
NAT+> red s(s(0)) + s(s(s(0))) .
-- reduce in NAT+ : s(s(0)) + s(s(s(0)))
1>[1] rule: eq s(N:Nat) + M:Nat = s(N + M)
{ N:Nat |-> s(0), M:Nat |-> s(s(s(0))) }
1<[1] s(s(0)) + s(s(s(0))) --> s(s(0) + s(s(s(0))))
1>[2] rule: eq s(N:Nat) + M:Nat = s(N + M)
{ N:Nat |-> 0, M:Nat |-> s(s(s(0))) }
1<[2] s(0) + s(s(s(0))) --> s(0 + s(s(s(0))))
1>[3] rule: eq 0 + M:Nat = M
{ M:Nat |-> s(s(s(0))) }
1<[3] 0 + s(s(s(0))) --> s(s(s(0)))
s(s(s(s(s(0))))) : Nat
(0.000 sec for parse, 3 rewrites(0.020 sec), 5 matches)
NAT+> より簡潔な別の表示スタイルも用意されている。これを使用するには trace whole スイッチを on にする:
NAT+> set trace whole on NAT+> red s(s(0)) + s(s(s(0))) . -- reduce in NAT+ : s(s(0)) + s(s(s(0))) [1]: s(s(0)) + s(s(s(0))) ---> s(s(0) + s(s(s(0)))) [2]: s(s(0) + s(s(s(0)))) ---> s(s(0 + s(s(s(0))))) [3]: s(s(0 + s(s(s(0))))) ---> s(s(s(s(s(0))))) s(s(s(s(s(0))))) : Nat (0.000 sec for parse, 3 rewrites(0.020 sec), 5 matches) NAT+>
こちらのスタイルでは、項全体が変化する過程のみが表示される。
Original Copyright © Takahiro Seino, all rights reserved.