On Dec 21, 2011, at 8:52 AM, Jesse Schalken wrote:
> I don't have experience with proof assistants, but maybe my answer to this
> thread can be summed up as giving Haskell that kind of capability. ;)
Okay, then suffice it to say that most of what you said *is* implemented in
real languages like Coq and Agda so you should check them out. :-)
Unfortunately there are two hurdles one faces when using these languages:
first, it is often very cumbersome to actually prove all of the invariants you
want to prove to make your code total, and second, there is not yet a nice way
of doing I/O actions and/or interfacing with external libraries written in
other languages.
However, until we have solved the problems that make working entirely in
dependently-typed languages a pain, we will need to stick with languages with
weaker type systems like Haskell, which means that we can't get around _|_
since we cannot encode all of our invariants into the type system.
Incidentally, I would highly recommend learning more about Coq and Agda. There
is a great textbook to start from available here:
http://adam.chlipala.net/cpdt/
It is valuable because it is not Coq-specific but rather is a good general
introduction to, exactly as the title promises, certified programming with
dependent types.
You should also really check out Agda; the main difference between it and Coq
is the language in which proofs are written. To make a long story short, in
Coq proofs are often easier to write because they use a specialized language
for that purpose but this often makes them a bit of a black box, whereas in
Agda the proofs are fully explicit which makes them much more transparent but
also more verbose and often harder to write. Unfortunately the documentation
for Agda tends to be sparse and split over several kinds of documents (such as
theses, papers, etc.) so isn't an obvious guide for me to recommend to you, but
if you look around you should find enough information to get you started. The
home page is
http://wiki.portal.chalmers.se/agda/pmwiki.php
For me part of the most exciting part was reading through the Agda standard
libraries, which you can download from
http://wiki.portal.chalmers.se/agda/pmwiki.php?n=Libraries.StandardLibrary
Just reading through their code is enlightening because it shows you just how
much power is available from dependent types; the standard library also covers
a lot more than Coq's does. Unfortunately it also showcases one of the
limitations of Agda, which is things can often get cryptic and arcane very
quickly, especially since Agda makes you work with "universes" explicitly (Coq
handles them implicitly) which adds another layer of complexity. :-) (FYI,
the universes are a hierarchy such that values are at the bottom, types of
values one rung up, types of types two rungs up, types of types of types three
rungs up, etc. Haskell is limited in only having a three-level hierarchy, with
values, types, and kinds.)
Cheers,
Greg
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe