Kristof Bastiaensen wrote:

> -------------------- start of latin.curry ----------------------------
> -- upto is a nondeterministic function that evaluates to
> -- a number from 1 upto n
> upto 1 = 1
> upto n | n > 1 = n ? upto (n-1)
>
> -- check if the lists r s have no element with the same value at the
> -- same position
> elems_diff r s = and $ zipWith (/=) r s
>
> -- extend takes a list of columns, and extends each column with a
> -- number for the next row.  It checks the number agains the column and
> -- against the previous numbers in the row.
>
> extend :: [[Int]] -> Int -> [[Int]]
> extend cols n = addnum cols [] where
>     addnum [] _ = []
>     addnum (col:cs) prev
>         | x =:= upto n &
>           (x `elem` prev) =:= False &
>           (x `elem` col) =:= False = (x:col) : addnum cs (x:prev)
>         where x free
>
> latin_square n = latin_square_ n
>     where latin_square_ 0 = replicate n []  -- initalize columns to nil
>           latin_square_ m | m > 0 = extend (latin_square_ (m-1)) n
>
> square2str s = unlines $ map format_col s
>     where format_col col = unwords $ map show col
>
> main = mapIO_ (putStrLn . square2str) (findall (\s -> s =:= latin_square 5))
> ------------------------- end latin.curry -----------------------------

I don't see where elems_diff is used after it is defined.