-- NatNums.russell open <* bool: safetype ~ { t:[] }, num: safetype ~ { pred: num }, equal: func[ [a:num,b:num] -> bool] ~ lambda x:[a:num,b:num] in if x.a?pred => if x.b?pred => equal else <> fi else => if x.b?pred => <> else > fi fi ni , plus: func[ [a:num,b:num] -> num] ~ lambda x:[a:num,b:num] in if x.a?pred => < pred ~ plus> else => x.b fi ni , minus: func[ [a:num,b:num] -> num] ~ lambda x:[a:num,b:num] in if x.b?pred => if x.a?pred => minus else zero<> fi else => x.a fi ni , zero: func[ []->num ] ~ lambda a:[] in <> ni , succ: func[ a:num->num ] ~ lambda a:num in ni , pred: func[ a:num->num ] ~ lambda a:num in if a?pred => a.pred else <> fi ni *> in open ref[num] in open < n:loc~new<> > in assign< lhs~n, rhs~succ(zero<>) > ; assign< lhs~n, rhs~plus< a~valOf n, b~valOf n >> ; assign< lhs~n, rhs~plus< a~valOf n, b~valOf n >> ni ni ni