2008/12/31 <ra...@msn.com>

>  Dear all,
>
> Happy New Year!
>
> I am learning the Induction Proof over Haskell, I saw some proofs for the
> equivalence of two functions will have a case called 'bottom' but some of
> them do no have.  What kind of situation we should also include the bottom
> case to the proof? How about the functions do not have the 'bottom' input
> such as:
>
> foo [] = []
> foo (x:xs) = x : (foo xs)
>

Okay, I'm not sure what you mean by bottom.  You could either mean the base
case, or you could mean bottom -- non-terminating inputs -- as in domain
theory.

Let's say you wanted to see if foo is equivalent to id.

id x = x

We can do it without considering nontermination, by induction on the
structure of the argument:

  First, the *base case*: empty lists.
    foo [] = []
    id [] = []
  Just by looking at the definitions of each.

 Now the inductive case.  Assume that foo xs = id xs, and show that foo
(x:xs) = id (x:xs), for all x (but a fixed xs).

 foo (x:xs) = x : foo xs
  foo xs = id xs  by our  the induction hypothesis, so
  foo (x:xs) = x : id xs = x : xs
 And then just by the definition of id:
  id (x:xs) = x : xs

And we're done.

Now, maybe you meant bottom as in nontermination.  In this case, we have to
prove that they do the same thing when given _|_ also.  This requires a
deeper understanding of the semantics of the language, but can be done
here.

First, by simple definition, id _|_ = _|_.  Now let's consider foo _|_.  The
Haskell semantics say that pattern matching on _|_ yields _|_, so foo _|_ =
_|_. So they are equivalent on _|_ also.  Thus foo and id are exactly the
same function.

See http://en.wikibooks.org/wiki/Haskell/Denotational_semantics for more
about _|_.

Happy mathhacking,
Luke
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to