//Separates values into 'Value[a] | Type[a]'. Res[rec, prim]. //The type system Value[a]. //An untyped value. Type[a]. //A value's type. //Values None[]. Some[a]. Zero[]. Succ[prev]. //Functions One[a]. // Interesting - returns '1' in the encoding of 'a'. Add[a, b]. Sub1[a]. Sub2[a]. Sub_[a, sub, cmp]. Fib[a]. Fib_[a, sub1, sub2]. Fib3[a]. //Types Maybe[a]. Nat[]. //Type signatures One[a: Type[a: Nat[]]]: Type[a: Nat[]] Add[a: Type[a: Nat[]], b: Type[a: Nat[]]]: Type[a: Nat[]] Sub1[a: Type[a: Nat[]]]: Type[a: Maybe[a: Nat[]]] Sub2[a: Type[a: Nat[]]]: Type[a: Maybe[a: Nat[]]] Fib[a: Type[a: Nat[]]]: Type[a: Nat[]] Fib_[ a: Type[a: Nat[]] sub1: Type[a: Maybe[a: Nat[]]] sub2: Type[a: Maybe[a: Nat[]]] ]: Type[a: Nat[]] Fib3[a: Type[a: Nat[]]]: Type[a: Nat[]] //Untyped functions One[a: Value[a: Zero[]]]: Value[a: Succ[prev: Zero[]]] One[a: Value[a: Succ[prev]]]: Value[a: Succ[prev: Zero[]]] Add[a: Value[a: Zero[]], b: Value[a]]: baprevaaprevaprevprevaaaaaaaaaa