pbrowne Patrick.Browne at comp.dit.ie
Sat Dec 12 09:08:11 EST 2009

pbrowne wrote:
> 2) What, if anything, prevents the execution of a Haskell term from
> being a proof in equational logic?

I have done some checking to try to answer my own question. The answer
*seems* to be that there *seems* to be three things that prevent Haskell
terms being true equations. Any feedback on these three reason would be
welcome. If they are valid reasons, what is their possible impact?

Pat

--------------------Reason (1)------------------
There are some equations that are not expressible in Haskell. Quoting form:
Is there any way to achieve such a proof in Haskell itself?
> GHC appears to reject equations such has
> mirror (mirror x) = x
> mirror (mirror(Node x y z)) = Node x y z

Eugene Kirpichov Fri, 25 Sep 2009 04:19:32 -0700
It is not possible at the value level, because Haskell does not
support dependent types and thus cannot express the type of the
proposition "forall a . forall x:Tree a, mirror (mirror x) = x", and
therefore a proof term also cannot be constructed.

Another example from [5]. A partial order that is also linear is called
a total order. The class linorder of total orders is specified using the
usual total order axioms. Of course, such axiomatizations are not

--------------------Reason (2)------------------
According to Thompson [1] the equations in Miranda (and I assume
Haskell) are not pure mathematical equations due to *where* and other
reasons. According to Danielsson [2] the fact that they are not always
structurally equations does not prevent functional programmers from
using them as if they were valid equations.  Danielsson show that this
informal  *fast and loose* use of equational axioms and theorems  is
*morally correct*. In particular, it is impossible to transform a
terminating program into a looping one. These results justify the
informal reasoning that functional programmers use.

--------------------Reason (3)------------------
There is no formal specification for the meaning of a Haskell program
(i.e. its meaning is not defined in a logic). At the level of precise
logical specification and logical interoperability this could be a
problem (e.g. semantic web likes logic). This should not be a problem
for programming tasks, after all most languages like Java do not have a
formal semantic definition in logic (ML, Maude[3] and CafeOBJ[4] do).

[1]A Logic for Miranda, Revisited (1994) by Simon Thompson
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.55.149
[2] Fast and Loose Reasoning is Morally Correct - Danielsson, Hughes
http://citeseer.ist.psu.edu/733155.html
[3] http://maude.cs.uiuc.edu/
[4] http://www.ldl.jaist.ac.jp/cafeobj/
[5]Translating Haskell to Isabelle: Torrini, Lueth,Maeder,Mossakowski
http://es.cs.uni-kl.de/TPHOLs-2007/proceedings/B-178.pdf