829a22124fc7b174b75927ec028582cf9d2cbae7
[ap2015.git] / a11 / mart / skeleton11.icl
1 module skeleton11
2
3 import StdEnv
4
5 :: Prog :== [Instr]
6
7 :: Instr = Write Expr
8
9 :: Expr = Int Int
10 | Plus Expr Expr
11 | Times Expr Expr
12 | Read
13
14 possibleResults :: [Prog] -> [Int]
15 possibleResults x = produce (map (map (\(Write x).eval x)) x) 0
16
17 produce :: [[Int->Int]] Int -> [Int]
18 produce x i
19 | all (isEmpty) x = [i]
20 = flatten [produce (updateAt idx ys x) (y i)\\(idx, [y:ys])<-zip2 [0..] x]
21
22 eval :: Expr Int -> Int
23 eval (Int i) s = i
24 eval (Plus e1 e2) s = eval e1 s + eval e2 s
25 eval (Times e1 e2) s = eval e1 s * eval e2 s
26 eval Read s = s
27
28
29 prog0 = [Write (Int 12), Write (Plus Read (Int 1))]
30 prog1 = [Write (Times Read (Int 2))]
31 test0 = [prog0]
32 test1 = [prog0, prog1]
33
34 Start = (
35 possibleResults test0,
36 possibleResults test1)