Difference between revisions of "CurryHowardLambek correspondence"
Uchchwhash (talk  contribs) 
Uchchwhash (talk  contribs) (more to come) 

Line 12:  Line 12:  
A (nontrivial) 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 (nontrivial) 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
CurryHoward 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).
The Answer
As is well established by now,
theAnswer :: Integer
theAnswer = 42
The logical interpretation of the program is that the type Integer
is inhibited (by the value 42
), so the existence of this program proves the proposition Integer
(a type without any value is the "bottom" type, a proposition with no proof).
Inference
A (nontrivial) Haskell function takes maps a value (of type a
, say) to another value (of type b
), therefore, given a value of type a
(a proof of a
), it constructs a value of type b
(so the proof its transformed into a proof of b
)! So b
is inhibited if a
is, and a proof of a > b
is established (hence the notation, in case you were wondering).
toInteger :: Boolean > Integer
inZ_2 False = 0
inZ_2 True = 1
says, for example, if Boolean
is inhibited, so is Integer
(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 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.
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)
The type is, actually, forall a b c. (a > b) > (b > c) > (a > c)
, to be a bit verbose, which says, logically speaking, for all propositions a, b
and c
, if from a
, b
can be proven, and if from b
, c
can be proven, then from a
, c
can be proven (the program says how to go about proving: just compose the given proofs!)