schlaegt( adam, beat).
schlaegt( adam, carlo).
schlaegt( beat, daniel).
schlaegt( carlo, daniel).
klasse0( S, 2) :-
schlaegt( S, _),
schlaegt( _, S), !.
klasse0( S, 3) :-
schlaegt( _, S), !.
klasse0( S, 1) :-
schlaegt( S, _), !.
klasse( S, 1) :-
schlaegt( S, _),
not schlaegt( _, S).
klasse( S, 2) :-
schlaegt( S, _),
schlaegt( _, S).
klasse( S, 3) :-
schlaegt( _, S),
not schlaegt( S, _).
Back to example 5.1
freunde( S) :-
S = [p( _, _, _, 1),
p( _, _, _, 2),
p( _, _, _, 3)],
member( p( beat, _, _, _), S),
member( p( _, _, zurich, _), S),
member( p( michael, arzt, _, RM), S),
member( p( _, _, bern, RB), S),
RM < RB,
member( p( daniel, _, basel, RD), S),
member( p( _, beamte, _, RBe), S),
RD < RBe,
member( p( _, sportlehrer, _, 1), S).
Back to example 5.2
damen( N, Pos) :-
list( 1, N, Kolonnen),
permutation( Kolonnen, Reihen),
positionen( Kolonnen, Reihen, Pos),
test( Pos).
positionen( [], [], []).
positionen( [ X| Y], [ U| V],
[ p( X, U)| W]) :-
positionen( Y, V, W).
test( []).
test( [ Q| R]) :-
test1( Q, R),
test( R).
test1( Q, []).
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
damen_seq( N, Pos) :-
list( 1, N, Reihen),
damen_seq( Reihen, [], Pos).
damen_seq( Frei, Besetzt, Pos) :-
delete( Reihe, Frei, Frei1),
test_seq( Reihe, Besetzt),
damen_seq( Frei1, [ Reihe | Besetzt], Pos).
damen_seq( [], Besetzt, Besetzt).
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( _, [], _).
Back to example 5.3