PRALine A programming language for primitive recursive arithmetic Ben Braun, Joe Rogers

advertisement
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
Download