[Haskell-cafe] Deciding equality of functions.
wren ng thornton
wren at freegeek.org
Sun Apr 10 05:22:42 CEST 2011
On 4/9/11 1:26 PM, Grigory Sarnitskiy wrote:
> I guess that deciding whether two functions are equal in most cases is algorithmically impossible. However maybe there exists quite a large domain of decidable cases? If so, how can I employ that in Haskell?
>
> It is a common situation when one has two implementations of the same function, one being straightforward but slow, and the other being fast but complex. It would be nice to be able to check if these two versions are equal to catch bugs in the more complex implementation.
This common situation is often actually one of the harder ones to prove,
I say coming from proving a few of them in Coq. The thing is that a lot
of the common optimizations (e.g., TCO) completely wreck the inductive
structure of the function which, in turn, makes it difficult to say
interesting things about them.[1]
The easy path forward for this situation is to demonstrate the
correctness of the slow/obvious implementation and then use a
combination of lazy SmallCheck, QuickCheck, and HUnit in order to show
that the fast implementation produces equal outputs for all small
inputs, randomly chosen inputs, and select manually chosen inputs.
Or, if you happen to be working with a nice well-behaved type, then you
can use circuit SAT, SMT, and other domain solvers, or Martin Escardo's
excellent work on compact spaces.
[1] Though if something as simple as TCO is so hard to prove
equivalences with, maybe that says something about our current crop of
proof assistants and theorem provers.
--
Live well,
~wren
More information about the Haskell-Cafe
mailing list