OK, this is both a logic puzzle (in the sense that it's about logic) and a CS puzzle, so I'm not sure where it belongs, but here goes.
The Curry-Howard isomorphism says, roughly, that logic is the same as type systems, and that proofs are the same as programs.
The usual form is that !x is a [k]ontinuation taking an x, x&y is a pair, x|y is a disjunction (a variable which is Either an x or a y), and x -> y is a function from x to y. P == Q (two formulas are equivalent) is the same as saying (P -> Q) & (Q -> P).
So for instance, a&b -> a is the type of λ(a,b) . a (also known as fst); a -> (b -> a) is the type of const, a -> a|b is the type of L (or Left), a -> (b -> (a&b)) is the type of curry id, and so on.
As a slightly trickier example, we can write out DeMorgan's laws (in some sort of hacked-up lambda calculus notation):
!(a|b) -> !a & !b is
λk . (λx . k (L x), λx . k (R x))
= λk . (k∘L, k∘R)
and the reverse, !a & !b -> !(a|b), is
λ(ka,kb) . either ka kb
= uncurry either
Similarly !a|!b -> !(a&b) is
either (λk . λ(x,y) . k x) (λk . λ(x,y) . k y)
= either (∘fst) (∘snd)
So what, then, is a program which proves
!(a & b) -> !a | !b
?
