comparison 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
comparison
equal deleted inserted replaced
19:6688bf4a5836 20:6d43207984ec
4 import Test.QuickCheck 4 import Test.QuickCheck
5 5
6 {---------------------------------------------------------------------} 6 {---------------------------------------------------------------------}
7 {- Aufgabe G8.1 -} 7 {- Aufgabe G8.1 -}
8 8
9 f0 :: Fraction 9 data Fraction = Over Integer Integer deriving Show
10 f0 = Over 1 2
11
12 f1 :: Fraction
13 f1 = Over 7 5
14 10
15 11
16 norm :: Fraction -> Fraction 12 norm :: Fraction -> Fraction
17 norm = undefined 13 norm (Over a b) = (a `div` c) `Over` (b `div` c)
14 where c = gcd a b * (if b < 0 then -1 else 1)
15
16 instance Num Fraction where
17 (a1 `Over` b1) + (a2 `Over` b2) = norm $ (a1*b2 + a2*b1) `Over` (b1 * b2)
18 (a1 `Over` b1) * (a2 `Over` b2) = norm $ (a1 * a2) `Over` (b1 * b2)
19 abs (a `Over` b) = abs a `Over` abs b
20 signum (a `Over` b) = (signum a * signum b) `Over` 1
21 fromInteger n = n `Over` 1
22
23 instance Eq Fraction where
24 (a1 `Over` b1) == (a2 `Over` b2) = a1*b2 == a2*b1
25
26 instance Fractional Fraction where
27 recip (a `Over` b) = (b `Over` a)
28 fromRational r = numerator r `Over` denominator r
18 29
19 30
20 31
21 {---------------------------------------------------------------------} 32 {---------------------------------------------------------------------}
22 {- Aufgabe G8.2 -} 33 {- Aufgabe G8.2 -}
23 -- siehe Exercise_8_Form.hs 34 -- siehe Exercise_8_Form.hs
24 35
25 p0 :: Form 36 --p0 :: Form
26 p0 = (Var "a" :&: Var "b") :|: (Not (Var "a") :&: Not (Var "b")) 37 --p0 = (Var "a" :&: Var "b") :|: (Not (Var "a") :&: Not (Var "b"))
27 38
28 p1 :: Form 39 --p1 :: Form
29 p1 = ((Not $ Not $ Var "a") :|: (Not ((Var "b") :->: (Not (Var "c"))))) 40 --p1 = ((Not $ Not $ Var "a") :|: (Not ((Var "b") :->: (Not (Var "c")))))
30 41
31 42
32 43
33 {---------------------------------------------------------------------} 44 {---------------------------------------------------------------------}
34 {- Aufgabe G8.3 -} 45 {- Aufgabe G8.3 -}
40 51
41 data Arith = Add Arith Arith | Mul Arith Arith | Const Integer | IVar String deriving Show 52 data Arith = Add Arith Arith | Mul Arith Arith | Const Integer | IVar String deriving Show
42 53
43 54
44 evalArith :: [(String,Integer)] -> Arith -> Integer 55 evalArith :: [(String,Integer)] -> Arith -> Integer
45 evalArith = undefined 56 evalArith val (Add x y) = evalArith val x + evalArith val y
57 evalArith val (Mul x y) = evalArith val x * evalArith val y
58 evalArith _ (Const x) = x
59 evalArith val (IVar s) = the (lookup s val)
60 where the (Just x) = x
46 61
47 62
48 63
49 {---------------------------------------------------------------------} 64 {---------------------------------------------------------------------}
50 {- Aufgabe G8.4 -} 65 {- Aufgabe G8.4 -}
51 66
52 mkTable :: Form -> [[String]] 67 mkTable :: Form -> [[String]]
53 mkTable = undefined 68 mkTable phi = firstRow : secondRow : map (zipWith align lengths . mkRow) (vals $ vars phi)
69 where
70 firstRow = vars phi ++ ["|", show phi]
71 secondRow = map (map (const '-')) firstRow
72 lengths = map length firstRow
54 73
74 mkRow val = map (stringOfBool . snd) val ++ ["|", stringOfBool $ eval val phi]
75
76 stringOfBool True = "T"
77 stringOfBool False = "F"
78
79 align n xs = lpad ++ xs ++ rpad
80 where
81 (lpad, rpad) = splitAt ((n - length xs) `div` 2) (replicate (n - length xs) ' ')
55 82
56 showTable :: Form -> String 83 showTable :: Form -> String
57 showTable = unlines . map unwords . mkTable 84 showTable = unlines . map unwords . mkTable
58 85
59
60 printTable :: Form -> IO () 86 printTable :: Form -> IO ()
61 printTable = putStrLn . showTable 87 printTable = putStrLn . showTable