; Small integer arithmetics with
; domain and range = (0..99) and
; operations P (predecessor),
; S (successor), and Z (is zero).
; No overflow checking.

(setq numbers
  '( 0  1  2  3  4  5  6  7  8  9
    10 11 12 13 14 15 16 17 18 19
    20 21 22 23 24 25 26 27 28 29
    30 31 32 33 34 35 36 37 38 39
    40 41 42 43 44 45 46 47 48 49
    50 51 52 53 54 55 56 57 58 59
    60 61 62 63 64 65 66 67 68 69
    70 71 72 73 74 75 76 77 78 79
    80 81 82 83 84 85 86 87 88 89
    90 91 92 93 94 95 96 97 98 99))

(setq defnums
  (macro
    (lambda ()
      (cons 'prog
            (loop next ((ns numbers))
              (cond ((null ns) nil)
                    (else @((setq ,(car ns) ',(car ns)) 
                            ,@(next (cdr ns))))))))))

(defnums)

(setq S
  (lambda (n)
    (cadr (memb n numbers))))

(setq P
  (lambda (n)
    (loop p ((ns numbers))
      (cond ((eq n (cadr ns))
              (car ns))
            (else
              (p (cdr ns)))))))

(setq Z
  (lambda (n)
    (eq n 0)))
