fun member x [] = false | member x (y::ys) = if x=y then true else (member x ys); (* check for (0,q) and (k, qpos[col=k]) where k=1... http://www.nct9.ne.jp/m_hiroi/func/haskell06.html 0 1 2 --> *------------- 1| . . . . . . 2| . . . -3. . 5 - 3 = 2 3| . . -2. . . 5 - 2 = 3 4| . -1. . . . 5 - 1 = 4 5| Q . . . . . Q position is 5 6| . +1. . . . 5 + 1 = 6 7| . . +2. . . 5 + 2 = 7 8| . . . +3. . 5 + 2 = 8 *------------- *) fun threat k m [] = false | threat k m (x::xs) = if (k = x-m) orelse (k = m-x) then true else (threat (k+1) m xs); fun queen1 0 b n = [] | queen1 m b n = if (member m b) orelse (threat 1 m b) then (queen1 (m-1) b n) else if (length b) = (n-1) then [m::b]@(queen1 (m-1) b n) else (queen1 n (m::b) n) @ (queen1 (m-1) b n); fun queen n = queen1 n [] n; val n = 12; length (queen n);