25 June, 2006

[Haskell] Exercise 3.4, 3.5

ex34.hsを作成。~(A && B) = ~A || ~B なので

nAnd :: Bool -> Bool -> Bool
nAnd x y = not (x && y)

nAnd2 :: Bool -> Bool -> Bool
nAnd2 x y = (not x) || (not y)

*Main> nAnd True True
False
*Main> nAnd True False
True
*Main> nAnd False True
True
*Main> nAnd False False
True
*Main> nAnd2 True True
False
*Main> nAnd2 True False
True
*Main> nAnd2 False True
True
*Main> nAnd2 False False
True
*Main>

次に計算過程を手で書く。実は (||) がどういう実装になっているか次第だが、疑似コードで
x || y = if (x) then {return True} else {return y}
だと仮定すると、遅延評価であることを考えると、

nAnd True True = not (True && True) = not True = False
nAnd True False = not (True && False) = not False = True

nAnd2 True True = (not True) || (not True) = False || (not True) = not True = False
nAnd True False = (not True) || (not False) = False || (not False) = not False = True

となるのではなかろうか。

No comments: