Is the following statement from [1] true?
"Since recursion is the main computational technique, a terminating pure Haskell program counts as an inductive proof of a theorem."
My intuition is that inductive proofs require a base case, assume the hypothesis case for k, prove induction step fork+1. I am not clear on how these steps occur in the execution of a program (function?). Also, what logic is employed in such a proof?
Regards, Patrick Browne
[1] http://ebooks.iospress.com/volumearticle/44257
Thanks for your very helpful answers.
Would it be fair to say that the answer may be morally yes [1], but technically perhaps no [2].
Below are two Haskell programs together with what I consider to be equational proofs (not inductive) that they evaluate to a desired ground term. The first program is not recursive. So does the quote in my original posting include non-recursive programs?
-- Prog 1 non-recursive x,y,z: x = 1 y = x + 2 z = x + y proveZ = z == 4 -- Equational Proof [1]: (z) ---> (x + y) [2]: (x + y) ---> (1 + y) [3]: (1 + y) ---> (1 + (2 + x)) [4]: (1 + (2 + x)) ---> (1 + (2 + 1)) [5]: (1 + (2 + 1)) ---> (1 + 3) [6]: (1 + 3) ---> (4) -- Prog 2 recursive data Vector = Empty | Add Vector Int size Empty = 0 size (Add v d) = 1 + (size v) proveSize = size (Add (Add Empty 1) 2) == 2 -- Equational Proof [1]: (size (Add (Add Empty 1) 2)) ---> (1 + (size (Add Empty 1))) [2]: (1 + (size (Add Empty 1))) ---> (1 + (1 + (size Empty))) [3]: (1 + (1 + (size Empty))) ---> (1 + (1 + 0)) [4]: (1 + (1 + 0)) ---> (1 + 1) [5]: (1 + 1) ---> (2) The motivation for my original question is that I wish to understand the relationship between the evaluation of a Haskell program and the application of equational logic to the same Haskell program. While Haskell produces the correct answer, as would a non-functional language, is the computation a proof in equational logic? I imagine that Haskell cannot do any form of symbolic proof (e.g. id a == a). In summary is my yes/no opinion reasonable?
[1] Fast and Loose Reasoning is Morally Correct: http://www.cs.ox.ac.uk/jeremy.gibbons/publications/fast+loose.pdf
[2] Formulating Haskell: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.40.1399