% struct s(Color,Nationality,Drink,Shell,Bird)
init(L):-
	L=[s(_,norwegian,_,_,_),
	   s(blue,_,_,_,_),
	   s(_,_,brandy,_,_),
	   s(_,_,_,_,_),
	   s(_,_,_,_,_)],!,
	setcolor(L,[red,green,brown,yellow]),
	rightof(s(green,_,_,_,_),s(brown,_,_,_,_),L),
	setnat(L,[englishman,pole,irishman,fin]),
	chksame(L,s(red,englishman,_,_,_)),
	setdrink(L,[bourbon,beer,gin,scotch]),
	chksame(L,s(green,_,bourbon,_,_)),
	chksame(L,s(_,fin,beer,_,_)),
	setshell(L,[winchester,remington,western,peters,federal]),
	chksame(L,s(yellow,_,_,remington,_)),
	chksame(L,s(_,_,gin,western,_)),
	chksame(L,s(_,irishman,_,peters,_)),
	setbird(L,[bluebills,mallards,redheads,canvasbacks,teal]),
	chksame(L,s(_,pole,_,_,bluebills)),
	chksame(L,s(_,_,_,winchester,mallards)),
	nextto(s(_,_,_,federal,_),s(_,_,_,_,redheads),L),
	nextto(s(_,_,_,remington,_),s(_,_,_,_,canvasbacks),L).

setcolor([],[]).
setcolor([s(C,N,D,S,B)|L],L1):- del(C,L1,L2),setcolor(L,L2).
setcolor([X|L],L1):- setcolor(L,L1).

setnat([],[]).
setnat([s(C,N,D,S,B)|L],L1):- del(N,L1,L2),setnat(L,L2).
setnat([X|L],L1):- setnat(L,L1).

setdrink([],[]).
setdrink([s(C,N,D,S,B)|L],L1):- del(D,L1,L2),setdrink(L,L2).
setdrink([X|L],L1):- setdrink(L,L1).

setshell([],[]).
setshell([s(C,N,D,S,B)|L],L1):- del(S,L1,L2),setshell(L,L2).
setshell([X|L],L1):- setshell(L,L1).

setbird([],[]).
setbird([s(C,N,D,S,B)|L],L1):- del(B,L1,L2),setbird(L,L2).
setbird([X|L],L1):- setbird(L,L1).

chksame([],_):- !,fail.
chksame([H|T],H).
chksame([H|T],X):- chksame(T,X).

nextto(X,Y,[X,Y|T]).
nextto(X,Y,[Y,X|T]).
nextto(X,Y,[Z|T]):- nextto(X,Y,T).

rightof(X,Y,[X,Y|T]).
rightof(X,Y,[Z|T]):- rightof(X,Y,T).

del(X,[X|T],T).
del(X,[Y|T],[Y|L]):-del(X,T,L).
