True : λxy.x
False : λxy.y
False : λxy.y
if p then x else y : λpxy.p x y
We are going to use these three abstractions and the reductions rules we talked about before to show how easily we can drive the logical operators in lambda calculus.
Logical AND
There are many ways we can define abstractions for logical operators, let us start with a sample for logical AND. We can define AND operator as follow:
λx.λy.x y x
To show it is correct abstraction, it must comply the truth table of logical AND operator, so if x equals to True and y equals to False we have:
(λx.λy.x y x) True False → True False True → (λxy.x) False True → False
Or when x equals to False and y equals to True:
(λx.λy.x y x) False True → False True False → (λxy.y) True False → False
Or when both x and y equal to True:
λx.λy.x y x
To show it is correct abstraction, it must comply the truth table of logical AND operator, so if x equals to True and y equals to False we have:
(λx.λy.x y x) True False → True False True → (λxy.x) False True → False
Or when x equals to False and y equals to True:
(λx.λy.x y x) False True → False True False → (λxy.y) True False → False
Or when both x and y equal to True:
(λx.λy.x y x) True True → True True False → (λxy.x) True True → True
Or when both x and y equal to False:
Or when both x and y equal to False:
(λx.λy.x y x) False False → False False False → (λxy.y) False False → False
As you see, the abstraction λx.λy.x y x completely fulfills the logical AND operator's truth table. Note that as I told before we can have other abstractions which defines logical AND operator too like:
λx.λy.x y False
It should return False if bot x and y are False or true, let us see:
and should return True when one of the x or y is true and the other is false:
(λx.λy.x (not y) y) False True → False False True → (λxy.y) False True → True
As you see, the abstraction λx.λy.x y x completely fulfills the logical AND operator's truth table. Note that as I told before we can have other abstractions which defines logical AND operator too like:
λx.λy.x y False
Logical OR
Same as logical AND we can define logical OR as follows:
λx.λy.x x y
To proof it obeys logical OR truth table, like what we did for AND operator, we have to show in each case of the table the result of the abstraction is like logical OR truth table. Let us see what happens if we have x equal to True and y equals to False:
(λx.λy.x x y) True False → True True False → (λxy.x) True True → True
Or when x equals to False and y equals to True we have:
(λx.λy.x x y) False True → False False True → (λxy.y) False True → True
Or when both are True:
(λx.λy.x x y) True True → True True True → (λxy.x) True True → True
And finally, when both are False we have:
(λx.λy.x x y) False False → False False False → (λxy.y) False False → False
λx.λy.x true y
Logical NOT
Like we brought fro logical AND and OR operators we can define NOT as bellow, the proof is as easy as before:
λx.x False True
Logical XOR
λx.λy.x (not y) y
λx.λy.x x y
To proof it obeys logical OR truth table, like what we did for AND operator, we have to show in each case of the table the result of the abstraction is like logical OR truth table. Let us see what happens if we have x equal to True and y equals to False:
(λx.λy.x x y) True False → True True False → (λxy.x) True True → True
Or when x equals to False and y equals to True we have:
(λx.λy.x x y) False True → False False True → (λxy.y) False True → True
(λx.λy.x x y) True True → True True True → (λxy.x) True True → True
We can also define logical OR abstraction as follows:
λx.λy.x true y
Like we brought fro logical AND and OR operators we can define NOT as bellow, the proof is as easy as before:
λx.x False True
Logical XOR
Logical XOR may seem a little bit complicated, we can show this abstraction as follows:
It should return False if bot x and y are False or true, let us see:
(λx.λy.x (not y) y) True True → True False True → (λxy.x) False True → False
(λx.λy.x (not y) y) False False → False True False → (λxy.y) True False → False
and should return True when one of the x or y is true and the other is false:
(λx.λy.x (not y) y) False True → False False True → (λxy.y) False True → True
(λx.λy.x (not y) y) True False → True True False → (λxy.x) True True → True