Under consideration for publication in J. Functional Programming 1 A Predicative Analysis of Structural Recursion ANDREAS ABEL ∗ Department of Computer Science, University of Munich, 80538 Munich, Germany (e-mail:
[email protected]) THORSTEN ALTENKIRCH School of Computer Science & Information Technology, University of Nottingham, Nottingham, NG8 1BB, UK (e-mail:
[email protected]) Abstract We introduce a language based upon lambda calculus with products, coproducts and strictly positive inductive types that allows the definition of recursive terms. We present the implementation (foetus) of a syntactical check that ensures that all such terms are structurally recursive, i.e., recursive calls appear only with arguments structurally smaller than the input parameters of terms considered. To ensure the correctness of the termina- tion checker, we show that all structurally recursive terms are normalizing with respect to a given operational semantics. To this end, we define a semantics on all types and a structural ordering on the values in this semantics and prove that all values are accessible with regard to this ordering. Finally, we point out how to do this proof predicatively using set based operators. 1 Introduction In lambda calculi with inductive types the standard means to construct a function over an inductive type is the recursor, which corresponds to induction. This method, however, has several drawbacks, as discussed in (Coquand, 1992). One of them is that programs are hard to understand intuitively. E.g., the \division by 2"-function may be coded with recursors over natural numbers RN and booleans RB as follows: RN : σ (N σ σ) N σ ! ! ! ! ! RB : σ σ B σ !N !N !B N B N B half = λn :R (λx : 0) (λx λf ! :R (f true) (1 + (f false))) n false Alternatively, in the presence of products, it can be implemented involving an aux- iliary function returning a pair.