view exercises/src/Exercise_8.hs @ 20:6d43207984ec

week 8 tutorial
author Markus Kaiser <markus.kaiser@in.tum.de>
date Wed, 12 Dec 2012 20:10:02 +0100
parents 6688bf4a5836
children
line wrap: on
line source

module Exercise_8 where
import Form
import Data.Ratio
import Test.QuickCheck

{---------------------------------------------------------------------}
{- Aufgabe G8.1 -}

data Fraction = Over Integer Integer deriving Show


norm :: Fraction -> Fraction
norm (Over a b) = (a `div` c) `Over` (b `div` c)
  where c = gcd a b * (if b < 0 then -1 else 1)

instance Num Fraction where
    (a1 `Over` b1) + (a2 `Over` b2) = norm $ (a1*b2 + a2*b1) `Over` (b1 * b2)
    (a1 `Over` b1) * (a2 `Over` b2) = norm $ (a1 * a2) `Over` (b1 * b2)
    abs (a `Over` b) = abs a `Over` abs b
    signum (a `Over` b) = (signum a * signum b) `Over` 1
    fromInteger n = n `Over` 1

instance Eq Fraction where
    (a1 `Over` b1) == (a2 `Over` b2) = a1*b2 == a2*b1

instance Fractional Fraction where
    recip (a `Over` b) = (b `Over` a)
    fromRational r = numerator r `Over` denominator r



{---------------------------------------------------------------------}
{- Aufgabe G8.2 -}
-- siehe Exercise_8_Form.hs

--p0 :: Form
--p0 = (Var "a" :&: Var "b") :|: (Not (Var "a") :&: Not (Var "b"))

--p1 :: Form
--p1 = ((Not $ Not $ Var "a") :|: (Not ((Var "b") :->: (Not (Var "c")))))



{---------------------------------------------------------------------}
{- Aufgabe G8.3 -}

v0 = [("pizza", 7), ("cola", 2), ("apfel", 1)]

a0 :: Arith
a0 = Add  (Add  (Mul  (Const 3) (IVar "pizza")) (IVar "cola")) (IVar "apfel")

data Arith = Add Arith Arith | Mul Arith Arith | Const Integer | IVar String deriving Show


evalArith :: [(String,Integer)] -> Arith -> Integer
evalArith val (Add x y) = evalArith val x + evalArith val y
evalArith val (Mul x y) = evalArith val x * evalArith val y
evalArith _ (Const x) = x
evalArith val (IVar s) = the (lookup s val)
    where the (Just x) = x



{---------------------------------------------------------------------}
{- Aufgabe G8.4 -}

mkTable :: Form -> [[String]]
mkTable phi = firstRow : secondRow : map (zipWith align lengths . mkRow) (vals $ vars phi)
  where
    firstRow = vars phi ++ ["|", show phi]
    secondRow = map (map (const '-')) firstRow
    lengths = map length firstRow

    mkRow val = map (stringOfBool . snd) val ++ ["|", stringOfBool $ eval val phi]

    stringOfBool True = "T"
    stringOfBool False = "F"

    align n xs = lpad ++ xs ++ rpad
      where
      (lpad, rpad) = splitAt ((n - length xs) `div` 2) (replicate (n - length xs) ' ')

showTable :: Form -> String
showTable = unlines . map unwords . mkTable

printTable :: Form -> IO ()
printTable = putStrLn . showTable