PRALine A programming language for primitive recursive arithmetic Ben Braun, Joe Rogers The University of Texas at Austin November 28, 2012 Why primitive recursive arithmetic? • Primitive recursive arithmetic is consistent. • Many functions over natural numbers are primitive recursive: ADD, MULTIPLY, EXPONENT, LESS-THAN, GREATER-THAN, FACTORIAL, PREDECESSOR, MINIMUM, MAXIMUM, ABS, SIGN, EQUALS, MOD, DIVISIBLE, IS-PRIME, … Proof in G. Gentzen, 1936. 'Die Widerspruchfreiheit der reinen Zahlentheorie'. Mathematische Annalen, 112:493–565. Translated as 'The consistency of arithmetic', in (M. E. Szabo 1969). Objective • Develop a language, PRALine, for expressing primitive recursive arithmetic • Develop tools which output proofs for primitive recursive arithmetic queries Example PRALine code Def add as (x 0 x) (x y' (x y add)') end eval (2 3 add) Successor Output (2 (2 (2 (2 0 1 2 3 2) 3) 4) 5) in in in in add add add add Example Def add as (x 0 x) (x y' (x y add)') end eval (2 3 add) Abstract Syntax Tree Implementation Live demo Def LT as (x 0 0) (0 x 1) (x' y' (x y LT)) end Relational notation ⊇ PR • Relational notation can describe functions which are not strictly primitive recursive, such as the Ackermann function: Def Ackermann as (0 n n’) (m’ 0 (m 1 Ackermann)) (m’ n’ (m (m’ n Ackermann) Ackermann)) end Proof that the Ackermann function is not PR: Doetzel, G. “A function to End All Functions.” Algorithm: Recreational Programming 2.4, 16-17, 1991. Conclusions • The PRALine language expresses functions in Relational Notation • We present tools which can verifiably compute a query expressed in PRALine • The code is designed to be extensible Future Work • Check that all functions are strictly primitive recursive • Add lists to the language (where list lengths known at compile time) • Emitting to different languages, especially those that support tail recursion, to allow larger computations