37 lines
940 B
Haskell
37 lines
940 B
Haskell
import Prelude hiding (Bool(..), not, (&&), (||), (==))
|
|
|
|
main = mapM_ (putStrLn . unlines . map unwords)
|
|
[ table "not" $ unary not
|
|
, table "and" $ binary (&&)
|
|
, table "or" $ binary (||)
|
|
, table "implies" $ binary (=->)
|
|
, table "equals" $ binary (==)
|
|
]
|
|
|
|
data Trit = False | Maybe | True deriving (Show)
|
|
|
|
False `nand` _ = True
|
|
_ `nand` False = True
|
|
True `nand` True = False
|
|
_ `nand` _ = Maybe
|
|
|
|
not a = nand a a
|
|
|
|
a && b = not $ a `nand` b
|
|
|
|
a || b = not a `nand` not b
|
|
|
|
a =-> b = a `nand` not b
|
|
|
|
a == b = (a && b) || (not a && not b)
|
|
|
|
inputs1 = [True, Maybe, False]
|
|
inputs2 = [(a,b) | a <- inputs1, b <- inputs1]
|
|
|
|
unary f = map (\a -> [a, f a]) inputs1
|
|
binary f = map (\(a,b) -> [a, b, f a b]) inputs2
|
|
|
|
table name xs = map (map pad) . (header :) $ map (map show) xs
|
|
where header = map (:[]) (take ((length $ head xs) - 1) ['A'..]) ++ [name]
|
|
|
|
pad s = s ++ replicate (5 - length s) ' '
|