maennlich(paul).
maennlich(hermann).
maennlich(lars).
maennlich(karl).
maennlich(otto).

weiblich(sarah).
weiblich(inge).
weiblich(ute).
weiblich(rita).

kind(paul,sarah).
kind(paul,lars).

kind(lars,inge).
kind(lars,hermann).

kind(ute,inge).
kind(ute,hermann).

kind(rita,ute).
kind(rita,otto).

tochter(X,Y):- kind(X,Y), weiblich(X).

menschlich(X):- weiblich(X).
menschlich(X):- maennlich(X).

geschwister(X,Y):- kind(X,Z), kind(Y,Z), X\=Y.

cousine(X,Y):- tochter(X,Z), kind(Z,A), kind(B,A), B\=Z, kind(Y,B).

grossvater(X,Y):- kind(Y,A), kind(A,X), maennlich(X).

vorfahr(X,Y):- kind(Y,X).
vorfahr(X,Y):- kind(Y,Z), vorfahr(X,Z).


memberPos(X,[X|_],0).
memberPos(X,[_|T],N):- memberPos(X,T,N2), N is N2+1.



/*
8-Queen Problem
*/
size(10). %or 10 rather...

solve(L):-
	buildList(1,L,_LV),
	size(N),
	allNumbers(N,Nums),
	bsolut(L,Nums).
	
	
buildList(N,[],[]):- size(N1), N1<N,!.
buildList(X,[q(X,Y)|T1],[Y|T2]):- size(N), N >= X, X2 is X+1,buildList(X2,T1,T2).

bsolut([],_).
bsolut([q(X,Y)|Others],Numbers):-
	bsolut(Others,Numbers),
	member(Y,Numbers),
	noattack(q(X,Y),Others).
	
noattack(_,[]).	
noattack(q(X,Y),[q(X1,Y1)|T]):-
	Y1 =\= Y,
	Y-Y1 =\= X1-X,
	Y1-Y =\= X1-X,
	noattack(q(X,Y),T).


allNumbers(N,[N|T]):- N > 1,N2 is N-1, allNumbers(N2,T).
allNumbers(1,[1]).

