+-----
+`sysf_bool`, `sysf_true`, `sysf_false`,
+`sysf_nat`, `sysf_zero`, `sysf_iszero`, `sysf_succ`, and `sysf_pred`.
+
+ OCAML ANSWERS:
+
+ type ('a) sysf_bool = 'a -> 'a -> 'a
+ let sysf_true : ('a) sysf_bool = fun y n -> y
+ let sysf_false : ('a) sysf_bool = fun y n -> n
+
+ type ('a) sysf_nat = ('a -> 'a) -> 'a -> 'a
+ let sysf_zero : ('a) sysf_nat = fun s z -> z
+ let sysf_iszero (n : 'a sysf_nat) : 'b sysf_bool = n (fun _ -> sysf_false) sysf_true
+ (* Annoyingly, though, if you just say sysf_iszero sysf_zero, you'll get an answer that isn't fully polymorphic.
+ This is explained in the comments linked below. The way to get a polymorphic result is to say instead
+ `fun next -> sysf_iszero sysf_zero next`. *)
+ let sysf_succ (n : 'a sysf_nat) : 'a sysf_nat = fun s z -> s (n s z)
+ (* Again, to use this you'll want to call `fun next -> sysf_succ sysf_zero next` *)
+ let sysf_pred (n : 'a sysf_nat) : 'a sysf_nat = (* LEFT UNDONE *)
+
+