CafeOBJ supports reduction of terms. An input term is reduced by applying equations where each equation is regarded as a left-to-right rewrite rule. A term which no equation can be applied to is called a normal form.
The red command reduces a term.
red <term> .
Example:
Let us reduce Term s(s(0)) + s(s(s(0))) in Module NAT+.
First, select Module NAT+.
CafeOBJ> select NAT+ NAT+>
Then, reduce Term s(s(0)) + s(s(s(0))) by the red command:
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+>
In the above, the red command reduced Term s(s(0)) + s(s(s(0))) into its normal form s(s(s(s(s(0))))). Reduction guarantees that the input term is equivalent with the output term in the specification. So, the above example is a proof of 2 + 3 = 5.
To show a trace of reduction, set the trace switch on as follows.
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+> There is another trace mode: the trace whole switch:
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+>
In this mode, only the whole terms in the trace are shown simply.
Original Copyright © Takahiro Seino, all rights reserved.