!(pragma! compile full)
;!(memoize fibonacci)

(= (equals $X $X) True)
(= (fibonacci  0 0) True)
(= (fibonacci  1 1) True)
(= (fibonacci  $N1 $N4)
  (and
     (> $N1 1)
     (equals  $N2 (-  $N1 1))
     (equals  $N3 (-  $N1 2))
     (fibonacci  $N2 $N5)
     (fibonacci  $N3 $N6)
     (equals  $N4 (+ $N5 $N6))
     True))

!(match &self (fibonacci 10 $W) $W)

!(assertEqual (fibonacci 1 $W) True)
;!(assertEqual (fibonacci 10 55) True)
;!(assertEqual (fibonacci 10 54) False)