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