Files
mercury/tests/benchmarks/queens.m
Fergus Henderson aa8c66345d Fix unique mode errors in the benchmark tests.
Estimated hours taken: 0.25

Fix unique mode errors in the benchmark tests.

tests/benchmarks/{cqueens,crypt,queens,query}.m:
	Change the determinism of main from `multi' to the new `cc_multi'.

tests/benchmarks/{deriv,deriv2}.m:
	Rearrange the code slightly to move the I/O
	out of the condition of an if-then-else.
1996-01-15 16:34:46 +00:00

81 lines
1.2 KiB
Mathematica

% 9-queens program
:- module queens.
:- interface.
:- import_module list, int, io, printlist.
:- pred main1(list(int)).
:- mode main1(out) is nondet.
:- pred main(io__state, io__state).
:- mode main(di, uo) is cc_multi.
:- implementation.
main1(Out) :-
data(Data),
queen(Data, Out).
main -->
( { data(Data), queen(Data, Out) } ->
print_list(Out)
;
io__write_string("No solution\n")
).
:- pred data(list(int)).
:- mode data(out) is det.
:- pred queen(list(int), list(int)).
:- mode queen(in, out) is nondet.
:- pred qperm(list(int), list(int)).
:- mode qperm(in, out) is nondet.
:- pred qdelete(int, list(int), list(int)).
:- mode qdelete(out, in, out) is nondet.
:- pred safe(list(int)).
:- mode safe(in) is semidet.
:- pred nodiag(int, int, list(int)).
:- mode nodiag(in, in, in) is semidet.
data([1,2,3,4,5,6,7,8]).
queen(Data, Out) :-
qperm(Data, Out),
safe(Out).
qperm([], []).
qperm([X|Y], K) :-
qdelete(U, [X|Y], Z),
K = [U|V],
qperm(Z, V).
qdelete(A, [A|L], L).
qdelete(X, [A|Z], [A|R]) :-
qdelete(X, Z, R).
safe([]).
safe([N|L]) :-
nodiag(N, 1, L),
safe(L).
nodiag(_, _, []).
nodiag(B, D, [N|L]) :-
NmB is N - B,
BmN is B - N,
( D = NmB ->
fail
; D = BmN ->
fail
;
true
),
D1 is D + 1,
nodiag(B, D1, L).