let rec member x alist =
match alist with
[] -> false
| y::ys -> if x=y then true else (member x ys);;
let rec threat k m alist =
match alist with
[] -> false
| x::xs -> if (k = x-m) || (k = m-x) then true
else (threat (k+1) m xs);;
let rec queen1 m b n =
match m with
0 -> []
| m ->
if (member m b) || (threat 1 m b) then (queen1 (m-1) b n)
else if (List.length b) = (n-1) then [m::b]@(queen1 (m-1) b n)
else (queen1 n (m::b) n) @ (queen1 (m-1) b n);;
let queen n = queen1 n [] n;;
let n = 12;;
let () = print_int (List.length (queen n));