aboutsummaryrefslogtreecommitdiff
path: root/examples/queens.fusp
blob: 4481376b8541e44e6534cf3bedad4fa05de9e645 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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 = 4;

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 [] []);