-- Lecture 3: Termination -- page 12 mod! BASIC-NAT{ [Zero NzNat < Nat] op 0 : -> Zero op s_ : Nat -> NzNat } mod! NAT+ { pr(BASIC-NAT) op _+_ : Nat Nat -> Nat vars M N : Nat eq N + 0 = N . eq M + s N = s(M + N) . } mod! NAT-COM{ pr(NAT+) vars X Y : Nat eq X + Y = Y + X . } select NAT-COM . start 0 + s 0 . apply 1 at term . apply 1 at term . apply 1 at term . -- The reduction of 0 + s 0 fails (Stack overflow) -- red 0 + s 0 -- page 17 mod! NAT* { pr(NAT+) op _*_ : Nat Nat -> Nat vars M N : Nat eq N * 0 = 0 . eq M * s N = M + (M * N) . } mod! NAT-FACT { pr(NAT*) op fact_ : Nat -> Nat vars M N : Nat eq fact 0 = s 0 . eq fact (s N) = s N * (fact N) . } red in NAT-FACT : fact (s s s 0) .