mijn uitwerking
[ap2015.git] / a11 / charlie / skeleton11.icl
diff --git a/a11/charlie/skeleton11.icl b/a11/charlie/skeleton11.icl
new file mode 100644 (file)
index 0000000..d946aa4
--- /dev/null
@@ -0,0 +1,55 @@
+module skeleton11\r
+\r
+import StdEnv\r
+\r
+:: Prog :== [Instr]\r
+\r
+:: Instr = Write Expr\r
+       | Atomic Prog\r
+\r
+:: Expr = Int   Int\r
+        | Plus  Expr Expr\r
+        | Times Expr Expr\r
+        | Read\r
+\r
+eval :: Int Expr -> Int\r
+eval _ (Int x) = x\r
+eval val (Plus l r) = eval val l + eval val r\r
+eval val (Times l r) = eval val l * eval val r\r
+eval val Read = val\r
+\r
+exec :: Int Instr -> Int\r
+exec val (Write exp) = eval val exp\r
+exec val (Atomic p) = hd (stepAll val [p] [])\r
+\r
+step :: Int Prog -> (Int, Prog)\r
+step val [i:is] = (exec val i, is)\r
+\r
+stepAll :: Int [Prog] [Prog] -> [Int]\r
+stepAll val [] [] = [val]\r
+stepAll val [] pps = stepAll val pps []\r
+stepAll val [[]:ps] pps = stepAll val ps pps\r
+stepAll val [p:[]] pps = stepAll val` [] (pps++[p`]) where\r
+       (val`, p`) = step val p\r
+stepAll val [p:ps] pps = stepAll val` [p`:ps] pps ++ stepAll val ps (pps++[p]) where\r
+       (val`, p`) = step val p\r
+\r
+possibleResults :: [Prog] -> [Int]\r
+possibleResults ps = filterResults (stepAll 0 ps [])\r
+\r
+filterResults :: [Int] -> [Int]\r
+filterResults [] = []\r
+filterResults [r:rs] | isMember r rs = filterResults rs\r
+                     | otherwise = [r:filterResults rs]\r
+\r
+prog0 = [ Write (Int 12)\r
+        , Write (Plus Read (Int 1))\r
+        ]\r
+prog1 = [ Write (Times Read (Int 2)) ]\r
+prog2 = [ Atomic prog0 ]\r
+test0 = [ prog0 ]       // result should be [13]\r
+test1 = [ prog0, prog1] // result should be [13, 25, 26] (or any permutation, the order doesn't matter)\r
+test2 = [ prog2, prog1 ]\r
+\r
+Start = possibleResults test2\r
+\r