diff options
| -rw-r--r-- | AufgabeFFP6.hs | 92 |
1 files changed, 77 insertions, 15 deletions
diff --git a/AufgabeFFP6.hs b/AufgabeFFP6.hs index 2e0a021..b4bb34b 100644 --- a/AufgabeFFP6.hs +++ b/AufgabeFFP6.hs | |||
| @@ -5,39 +5,101 @@ where | |||
| 5 | 5 | ||
| 6 | import Data.Array | 6 | import Data.Array |
| 7 | 7 | ||
| 8 | (+) :: Int -> Int -> Int | 8 | type F = Array Int Int |
| 9 | (+) = (Prelude.+) | 9 | type Op = Int -> Int -> Int |
| 10 | type G = Array Int (Op) | ||
| 11 | type W = Int | ||
| 10 | 12 | ||
| 11 | (-) :: Int -> Int -> Int | 13 | -------------------------------------------------------------------------------- |
| 12 | (-) = (Prelude.-) | ||
| 13 | |||
| 14 | (*) :: Int -> Int -> Int | ||
| 15 | (*) = (Prelude.*) | ||
| 16 | 14 | ||
| 17 | (./.) :: Int -> Int -> Int | 15 | (./.) :: Int -> Int -> Int |
| 18 | (./.) = div | 16 | (./.) = div |
| 19 | 17 | ||
| 20 | myfoldl :: [(a -> b -> a)] -> a -> [b] -> a | 18 | myfoldl :: [(a -> b -> a)] -> a -> [b] -> a |
| 21 | myfoldl _ z [] = z | 19 | myfoldl _ f1 [] = f1 |
| 22 | myfoldl (f:fs) z (x:xs) = myfoldl fs (f z x) xs | 20 | myfoldl (g:gs) f1 (f2:fs) = myfoldl gs (g f1 f2) fs |
| 23 | 21 | ||
| 24 | myfoldl' :: [(a -> a -> a)] -> [a] -> a | 22 | myfoldl' :: [(a -> a -> a)] -> [a] -> a |
| 25 | myfoldl' f (x:xs) = myfoldl f x xs | 23 | myfoldl' g (f:fs) = myfoldl g f fs |
| 26 | 24 | ||
| 27 | eval :: Array Int Int -> Array Int (Int -> Int -> Int) -> Int | 25 | eval :: F -> G -> W |
| 28 | eval a b = myfoldl' (elems b) (elems a) | 26 | eval f g = myfoldl' (elems g) (elems f) |
| 29 | 27 | ||
| 30 | -------------------------------------------------------------------------------- | 28 | -------------------------------------------------------------------------------- |
| 31 | 29 | ||
| 32 | -- yield :: Array Int Int -> Int -> [Array Int (Int -> Int -> Int)] | 30 | yield :: F -> W -> [G] |
| 33 | -- yield = yield_bt | 31 | yield = yield_bt |
| 34 | -- yield = yield_gtf | 32 | -- yield = yield_gtf |
| 35 | 33 | ||
| 36 | -- yield_bt :: Array Int Int -> Int -> [Array Int (Int -> Int -> Int)] | 34 | -------------------------------------------------------------------------------- |
| 35 | |||
| 36 | type Node = ([Int], [Int], W, [Op]) | ||
| 37 | |||
| 38 | goal_yield_bt :: Node -> Bool | ||
| 39 | goal_yield_bt (f, f', w, g) | ||
| 40 | | length g == 0 = False -- no operators | ||
| 41 | | length f' == 0 = eval (listArray (1, length f) f) (listArray (1, length g) g) == w | ||
| 42 | | otherwise = False | ||
| 43 | |||
| 44 | succ_yield_bt :: Node -> [Node] | ||
| 45 | succ_yield_bt (_, [], _, _) = [] | ||
| 46 | succ_yield_bt (f, f', w, g) = [(f_new, f'_new, w, g ++ [g_new]) | g_new <- ops] | ||
| 47 | where | ||
| 48 | f_new = f ++ [head f'] | ||
| 49 | f'_new = tail f' | ||
| 50 | ops = [(+), (-), (*), (./.)] | ||
| 51 | |||
| 52 | data Stack a = EmptyStk | ||
| 53 | | Stk a (Stack a) | ||
| 54 | |||
| 55 | push :: a -> Stack a -> Stack a | ||
| 56 | push x s = Stk x s | ||
| 57 | |||
| 58 | pop :: Stack a -> Stack a | ||
| 59 | pop EmptyStk = error "pop from an empty stack" | ||
| 60 | pop (Stk _ s) = s | ||
| 61 | |||
| 62 | top :: Stack a -> a | ||
| 63 | top EmptyStk = error "top from an empty stack" | ||
| 64 | top (Stk x _) = x | ||
| 65 | |||
| 66 | emptyStack :: Stack a | ||
| 67 | emptyStack = EmptyStk | ||
| 68 | |||
| 69 | stackEmpty :: Stack a -> Bool | ||
| 70 | stackEmpty EmptyStk = True | ||
| 71 | stackEmpty _ = False | ||
| 72 | |||
| 73 | searchDfs :: (node -> [node]) -> (node -> Bool) -> node -> [node] | ||
| 74 | searchDfs succ goal x = search' (push x emptyStack) | ||
| 75 | where | ||
| 76 | search' s | ||
| 77 | | stackEmpty s = [] | ||
| 78 | | goal (top s) = top s : search' (pop s) | ||
| 79 | | otherwise = | ||
| 80 | let x = top s | ||
| 81 | in search' (foldr push (pop s) (succ x)) | ||
| 82 | |||
| 83 | yield_bt :: F -> W -> [G] | ||
| 84 | yield_bt f w = map (\(_, _, _, g) -> listArray (1, length g) g) nodes | ||
| 85 | where | ||
| 86 | f_elem1 = head (elems f) | ||
| 87 | f_tail = tail (elems f) | ||
| 88 | nodes = searchDfs succ_yield_bt goal_yield_bt ([f_elem1], f_tail, w, []) | ||
| 89 | |||
| 90 | -------------------------------------------------------------------------------- | ||
| 91 | |||
| 37 | -- yield_gtf :: Array Int Int -> Int -> [Array Int (Int -> Int -> Int)] | 92 | -- yield_gtf :: Array Int Int -> Int -> [Array Int (Int -> Int -> Int)] |
| 38 | 93 | ||
| 39 | -------------------------------------------------------------------------------- | 94 | -------------------------------------------------------------------------------- |
| 40 | 95 | ||
| 96 | instance Show (Integer -> Integer -> Integer) where | ||
| 97 | show op = case (3 `op` 3) of | ||
| 98 | 6 -> "plus" | ||
| 99 | 0 -> "minus" | ||
| 100 | 9 -> "times" | ||
| 101 | 1 -> "div" | ||
| 102 | _ -> "unknown" | ||
| 41 | 103 | ||
| 42 | instance Show (Int -> Int -> Int) where | 104 | instance Show (Int -> Int -> Int) where |
| 43 | show op = case (3 `op` 3) of | 105 | show op = case (3 `op` 3) of |
