Zdroj
/* Problém N dam: umístěte N šachových dam
na desku NxN tak, že se vzájemně neohrožují.
Vracejte postupně všechny možnosti.
*/
% damy(+N, -Výsledek)
%diagonala(+Pozice nove damy, +Pozice predchozich dam).
%uspjeje pokud se damy neohrozuji diagonalne
diagonala(P, Ps) :-diagonala(P, 1, Ps).
%diagonala(+Pozice nove damy, +Offset,+Pozice zbyvajicich dam).
diagonala(_,_,[]).
diagonala(P, O, [X|Xs]) :-
P+O =\= X, P-O =\= X,
O1 is O+1, diagonala(P, O1, Xs).
damy(N, V) :- numlist(1, N, Pole), damy([], Pole, V).
%damy(+Zatim umistene damy, +Nepouzite sloupce, -Vysledek)
damy(P, [], P).
damy(Zatim, Nepouzito, Vysledek) :-
select(Poz, Nepouzito, Nep1), diagonala(Poz, Zatim),
damy([Poz|Zatim], Nep1, Vysledek).
%zobraz(+Radky)
zobraz([]).
zobraz([H|T]) :- napis(H), zobraz(T).
%napis(+Pozice)
napis(1) :- put_char('X'), nl.
napis(N) :- N > 1, put_char('.'), N1 is N-1, napis(N1).
Dotazy
?- damy(3, V).
false.
?- damy(4, V).
V = [3, 1, 4, 2] ;
V = [2, 4, 1, 3] ;
false.
?- damy(4, V), zobraz(V).
..X
X
...X
.X
V = [3, 1, 4, 2] ;
.X
...X
X
..X
V = [2, 4, 1, 3] ;
false.
?- damy(7, V), zobraz(V).
.....X
...X
.X
......X
....X
..X
X
V = [6, 4, 2, 7, 5, 3, 1] ;
....X
.X
.....X
..X
......X
...X
X
V = [5, 2, 6, 3, 7, 4, 1] ;
% ...
?- V=[1|_], damy(10, V), zobraz(V).
X
.......X
.....X
........X
..X
.........X
...X
......X
....X
.X
V = [1, 8, 6, 9, 3, 10, 4, 7, 5|...] ;
% ...
?- prevod(cislo(2,3), X).
X = 11.111 ;
false.
?- prevod(cislo(2,30), X).
X = 11.11111111111111 .
?- test(cislo(2,0), cislo(1,1)).
false.
?- prevod(cislo(2,0),X).
X = 11 ;
false.
?- X is 11*1.1.
X = 12.100000000000001.