14 possibleResults :: [Prog] -> [Int]
15 possibleResults x = produce (map (map (\(Write x).eval x)) x) 0
17 produce :: [[Int->Int]] Int -> [Int]
19 | all (isEmpty) x = [i]
20 = flatten [produce (updateAt idx ys x) (y i)\\(idx, [y:ys])<-zip2 [0..] x]
22 eval :: Expr Int -> Int
24 eval (Plus e1 e2) s = eval e1 s + eval e2 s
25 eval (Times e1 e2) s = eval e1 s * eval e2 s
29 prog0 = [Write (Int 12), Write (Plus Read (Int 1))]
30 prog1 = [Write (Times Read (Int 2))]
32 test1 = [prog0, prog1]
35 possibleResults test0,
36 possibleResults test1)