Curry-Howard-Lambek correspondence
From HaskellWiki
(Difference between revisions)
(more to come) |
|||
| Line 12: | Line 12: | ||
A (non-trivial) Haskell function takes maps a value (of type <hask>a</hask>, say) to another value (of type <hask>b</hask>), therefore, ''given'' a value of type <hask>a</hask> (a proof of <hask>a</hask>), it ''constructs'' a value of type <hask>b</hask> (so the proof its ''transformed'' into a proof of <hask>b</hask>)! So <hask>b</hask> is inhibited if <hask>a</hask> is, and a proof of <hask>a -> b</hask> is established (hence the notation, in case you were wondering). | A (non-trivial) Haskell function takes maps a value (of type <hask>a</hask>, say) to another value (of type <hask>b</hask>), therefore, ''given'' a value of type <hask>a</hask> (a proof of <hask>a</hask>), it ''constructs'' a value of type <hask>b</hask> (so the proof its ''transformed'' into a proof of <hask>b</hask>)! So <hask>b</hask> is inhibited if <hask>a</hask> is, and a proof of <hask>a -> b</hask> is established (hence the notation, in case you were wondering). | ||
<haskell>toInteger :: Boolean -> Integer | <haskell>toInteger :: Boolean -> Integer | ||
| - | + | inZ_2 False = 0 | |
| - | + | inZ_2 True = 1</haskell> | |
says, for example, if <hask>Boolean</hask> is inhibited, so is <hask>Integer</hask> (well, the point here is demonstration, not discovery). | says, for example, if <hask>Boolean</hask> is inhibited, so is <hask>Integer</hask> (well, the point here is demonstration, not discovery). | ||
| + | |||
| + | == Connectives == | ||
| + | Of course, atomic propositions contribute little towards knowledge, and the Haskell type system incorporates the logical connectives <math>\and</math> and <math>\or</math>, though heavily disguised. | ||
| + | Haskell handles <math>\or</math> conjuction in the manner described by Intuitionistic Logic. When a program has type <math>a \or b</math>, the value returned itself indicates its type. | ||
== Theorems for free! == | == Theorems for free! == | ||
Revision as of 04:16, 2 November 2006
Curry-Howard Isomorphism is an isomorphism between types (in programming languages) and propositions (in logic). Interestingly, the isomorphism maps programs (functions in Haskell) to (constructive) proofs (and vice versa).
Contents |
1 The Answer
As is well established by now,
theAnswer :: Integer theAnswer = 42
Integer
42
Integer
2 Inference
A (non-trivial) Haskell function takes maps a value (of typea
b
a
a
b
b
b
a
a -> b
toInteger :: Boolean -> Integer inZ_2 False = 0 inZ_2 True = 1
Boolean
Integer
3 Connectives
Of course, atomic propositions contribute little towards knowledge, and the Haskell type system incorporates the logical connectives
and
, though heavily disguised.
Haskell handles
conjuction in the manner described by Intuitionistic Logic. When a program has type
, the value returned itself indicates its type.
4 Theorems for free!
Things get interesting when polymorphism comes in. The composition operator in Haskell proves a very simple theorem.
(.) :: (a -> b) -> (b -> c) -> (a -> c) (.) f g x = f (g x)
forall a b c. (a -> b) -> (b -> c) -> (a -> c)
a, b
c
a
b
b
c
a
c
