aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorCamil Staps2016-09-25 14:32:22 +0200
committerCamil Staps2016-09-25 14:32:22 +0200
commite68199d88f3561d10f576b328265fa0a122d87a3 (patch)
tree7ef031aaad802c654db849c06ad76152e6f09bb3 /examples
parentAdded code: add, eq, ge, gt, le, lt, ne (diff)
Added acker and queens examples
Diffstat (limited to 'examples')
-rw-r--r--examples/acker.fusp8
-rw-r--r--examples/queens.fusp32
2 files changed, 40 insertions, 0 deletions
diff --git a/examples/acker.fusp b/examples/acker.fusp
new file mode 100644
index 0000000..6e774f0
--- /dev/null
+++ b/examples/acker.fusp
@@ -0,0 +1,8 @@
+sub a b = code sub a b;
+add a b = code add a b;
+
+acker 0 j = add j 1;
+acker i 0 = acker (sub 1 i) 1;
+acker i j = acker (sub 1 i) (acker i (sub 1 j));
+
+main = acker 3 7;
diff --git a/examples/queens.fusp b/examples/queens.fusp
new file mode 100644
index 0000000..e509e81
--- /dev/null
+++ b/examples/queens.fusp
@@ -0,0 +1,32 @@
+add a b = code add a b;
+sub a b = code sub a b;
+gt a b = code gt a b;
+eq a b = code eq a b;
+
+size = 6;
+
+if 0 _ b = b;
+if 1 a _ = a;
+if _ _ _ = not_a_boolean;
+
+// queens :: Int [Int] [[Int]] -> [[Int]]
+queens r b bs = if (gt r size) [b:bs] (try size r b bs);
+
+// try :: Int Int [Int] [[Int]] -> [[Int]]
+try 0 r b bs = bs;
+try c r b bs = try (sub 1 c) r b (if (save c 1 b) (queens (add r 1) [c:b] bs) bs);
+
+// save ::Int Int [Int] -> {0,1}
+save c rd [] = 1;
+save c rd [c_:cs] = if (save_ c c_ rd) 0 (save c (add rd 1) cs);
+
+save_ c c_ rd = gt (add (add (eq c c_) (eq (sub c c_) rd)) (eq (sub c_ c) rd)) 0;
+
+length [] = 0;
+length [x:xs] = add (length xs) 1;
+
+hd [x:xs] = x;
+
+apptup (f,g) x = (f x, g x);
+
+main = apptup (length, hd) (queens 1 [] []);