lab10: impl
This commit is contained in:
@@ -59,9 +59,9 @@ Why does this work? Here are a couple of tests to consider.
|
|||||||
|
|
||||||
Define the 'nott' and 'orr' operators below without using andd.
|
Define the 'nott' and 'orr' operators below without using andd.
|
||||||
|
|
||||||
> nott = error "TBD"
|
> nott = \b -> b fls tru
|
||||||
|
|
||||||
> orr = error "TBD"
|
> orr = \b -> \c -> b tru c
|
||||||
|
|
||||||
Here are some test cases:
|
Here are some test cases:
|
||||||
|
|
||||||
@@ -134,7 +134,7 @@ Write the definition for 'nil' below. (If you are unsure of what the
|
|||||||
definition should be, try walking through the derivation of
|
definition should be, try walking through the derivation of
|
||||||
"isEmpty (pair 1 2)".
|
"isEmpty (pair 1 2)".
|
||||||
|
|
||||||
> nil = error "TBD"
|
> nil = \x -> tru
|
||||||
|
|
||||||
Now we can create some sample lists. (Note that we are using Haskell numbers
|
Now we can create some sample lists. (Note that we are using Haskell numbers
|
||||||
just for easy of testing, though they are not part of the lambda calculus.)
|
just for easy of testing, though they are not part of the lambda calculus.)
|
||||||
@@ -229,7 +229,9 @@ Alternately, we could define plus with our scc function:
|
|||||||
|
|
||||||
Define multiplication in a similar manner:
|
Define multiplication in a similar manner:
|
||||||
|
|
||||||
> multiply = error "TBD"
|
> multiply = \m -> \n -> m (plus n) zero
|
||||||
|
|
||||||
|
> test3times2 = transChurchNums $ multiply three two
|
||||||
|
|
||||||
|
|
||||||
For ease of use, you may use the following function to convert a Haskell integer
|
For ease of use, you may use the following function to convert a Haskell integer
|
||||||
@@ -253,6 +255,11 @@ Haskell will not accept the above combinator.
|
|||||||
Evaluate this function by hand yourself.
|
Evaluate this function by hand yourself.
|
||||||
After one step, what do you get?
|
After one step, what do you get?
|
||||||
|
|
||||||
|
function: (\x -> x x)
|
||||||
|
argument: (\x -> x x)
|
||||||
|
substitute x with (\x -> x x) in x x = (\x -> x x) (\x -> x x)
|
||||||
|
it evaluates to the same function, basically an infinite loop I think?
|
||||||
|
|
||||||
|
|
||||||
The omega function is not terribly useful, though it is interesting.
|
The omega function is not terribly useful, though it is interesting.
|
||||||
We can cause a lambda calculus program to go into an infinite loop.
|
We can cause a lambda calculus program to go into an infinite loop.
|
||||||
@@ -286,3 +293,25 @@ factorial = fix g
|
|||||||
|
|
||||||
To understand how this works, write out the evaluation steps for `factorial 3`.
|
To understand how this works, write out the evaluation steps for `factorial 3`.
|
||||||
|
|
||||||
|
-> factorial 3 = (fix g) 3
|
||||||
|
-> g (fix g) 3 = test (isZero (prd 3)) one (multiply 3 (g (prd 3)))
|
||||||
|
-> test (isZero (2)) one (multiply 3 (g (2)))
|
||||||
|
takes the false branch until g (1) then takes the true branch because isZero (prd 1) = true
|
||||||
|
|
||||||
|
> main :: IO ()
|
||||||
|
> main = do
|
||||||
|
> print $ testTru ++ " : expected true"
|
||||||
|
> print $ testFls ++ " : expected false"
|
||||||
|
> print $ testAnd1 ++ " : expected true"
|
||||||
|
> print $ testAnd2 ++ " : expected false"
|
||||||
|
> print $ testOps1 ++ " : expected true"
|
||||||
|
> print $ testOps2 ++ " : expected false"
|
||||||
|
> print $ testPairFst ++ " : expected true"
|
||||||
|
> print $ testPairSnd ++ " : expected false"
|
||||||
|
> print $ show testListHead ++ " : expected 0"
|
||||||
|
> print $ show testListHeadTail ++ " : expected 1"
|
||||||
|
> print $ testNotEmpty ++ " : expected false"
|
||||||
|
> print $ testEmpty ++ " : expected true"
|
||||||
|
> print $ show test3plus2 ++ " : expected 5"
|
||||||
|
> print $ show test3times2 ++ " : expected 6"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user