beats( adam, bill).
beats( adam, carlo).
beats( bill, daniel).
beats( carlo, daniel).
category1( S, 2) :- beats( S, _), beats( _, S), !.
category1( S, 3) :- beats( _, S), !.
category1( S, 1) :- beats( S, _), !.
category2( S, 1) :- beats( S, _), \+ beats( _, S).
category2( S, 2) :- beats( S, _), beats( _, S).
category2( S, 3) :- beats( _, S), \+ beats( S, _).
Back to example 5.1
friends( S) :-
S = [p( _, _, _, 1), p( _, _, _, 2), p( _, _, _, 3)],
member( p( bill, _, _, _), S),
member( p( _, _, zurich, _), S),
member( p( michael, doctor, _, RM), S),
member( p( _, _, bern, RB), S), RM < RB,
member( p( daniel, _, basel, RD), S),
member( p( _, officer, _, RBe), S), RD < RBe,
member( p( _, sport_teacher, _, 1), S).
Back to example 5.2
queens( N, Pos) :-
list( 1, N, Columns),
permutation( Columns, Rows),
positions( Columns, Rows, Pos),
test( Pos).
positions( [], [], []).
positions( [ X| Y], [ U| V], [ p( X, U)| W]) :- positions( Y, V, W).
test( []).
test( [ Q| R]) :- test1( Q, R), test( R).
test1( _, []).
test1( Q, [ R| S]) :- not_diagonal( Q, R), test1( Q, S).
not_diagonal( p( C1, R1), p( C2, R2)) :-
X is abs( C1 - C2) - abs( R1 - R2), X \= 0.
list( N, N, [ N]).
list( N, M, [ N| Ns]) :- N < M, N1 is N + 1, list( N1, M, Ns).
permutation( [], []).
permutation( [ X| Y], [ U| V]) :-
delete( U, [ X| Y], W), permutation( W, V).
delete( X, [ X| Y], Y).
delete( U, [ X| Y], [ X| V]) :- delete( U, Y, V).
Back to example 5.3
queens( N, Pos) :-
queens_seq( N, RevPos),
reverse_list(RevPos, Pos).
queens_seq( N, Pos) :-
list( 1, N, Rows),
queens_seq( Rows, [], Pos).
queens_seq( Free, Occupied, Pos) :-
delete( Row, Free, Free1),
test_seq( Row, Occupied),
queens_seq( Free1, [ Row | Occupied], Pos).
queens_seq( [], Occupied, Occupied).
test_seq( D, Ds) :-
test_seq( D, Ds, 1).
test_seq( D, [ D1| Ds], N) :-
not( N is abs( D - D1)),
N1 is N + 1, test_seq( D, Ds, N1).
test_seq( _, [], _).
reverse_list( X, Y) :- reverse_list( X, [], Y).
reverse_list( [ X1| X], Y0, Y) :- reverse_list( X, [ X1| Y0], Y).
reverse_list( [], Y, Y).
Back to example 5.3