(* Homemade boolean type *) datatype boolean = True | False; fun andB(True, True) = True | andB(p, q) = False; fun orB(False, False) = False | orB(p, q) = True; fun notB(True) = False | notB(False) = True; andB(orB(True, False), notB(andB(False, True))); fun isEven(0) = true | isEven(1) = false | isEven(n) = isEven(n-2); fun isEven(0) = true | isEven(n) = not(isEven(n-1)); fun isEven(n) = n mod 2 = 0; (* Ex 3.3.4, turnToInts *) fun turnToInts([]) = [] | turnToInts(true::rest) = 1::turnToInts(rest) | turnToInts(false::rest) = 0::turnToInts(rest); (* turnToBools *) fun turnToBools([]) = [] | turnToBools(0::rest) = false::turnToBools(rest) | turnToBools(x::rest) = true::turnToBools(rest); datatype bird = Robin | Sparrow | Crow | Cardinal | Eagle | Mockingbird | Penguin | Flamingo ; fun containsRobin([]) = false | containsRobin(Robin::rest) = true | containsRobin(x::rest) = containsRobin(rest);