/*

GOUDZOEKEN

Tiko Schep en Zora Jurriens 

De dwerg gaat de berg in, hij is op zoek naar goud. Kan jij hem helpen
het te vinden?


Het spel Goudzoeken bestaat uit verschillende componenten, zo is er het
goud wat gevonden kan worden, de dwerg die het goud wil vinden en de
stenen die een obstructie vormen voor de doorgang naar het goud. 

De bedoeling van het spel is dat de dwerg de stenen zo weet te duwen dat
er een doortocht naar het goud onstaat. 

Het spel wordt gespeeld op een vierkant speelbord van zes vakjes bij
zes vakjes. Een steen beslaat een enkel vakje en kan door de dwerg naar
voren worden geduwd. De dwerg zijn bewegingsvrijheid bestaat uit de
mogelijkheid een vakje naar voren of naar links, naar rechts of naar
achteren te lopen.


*/


% 1. De moves van de dwerg, rekening houdend met de mogelijke
% verschuiving van een blok. Duw restricties.  



player:-
	solve_breadthfirst([d,b,l,l,
			    b,l,b,l,
			    l,b,l,l,
			    l,l,g,l ], NieuwBord),
	pp(NieuwBord).

player:-
	write('De dwerg kan niet bij het goud').

move(Oud, Nieuw):-
	boven(d, l, Oud, Nieuw).

move(Oud, Nieuw):-
	onder(d, l, Oud, Nieuw).

move(Oud, Nieuw):-
	linksvan(d, l, Oud, Nieuw).

move(Oud, Nieuw):-
	rechtsvan(d, l, Oud, Nieuw).


move(Oud, Nieuw):-
	linksvanbox(d, b, l, Oud, Nieuw).


move(Oud, Nieuw):-
	rechtsvanbox(d, b, l, Oud, Nieuw).

move(Oud, Nieuw):-
	onderbox(d, b, l, Oud, Nieuw).

move(Oud, Nieuw):-
	bovenbox(d, b, l, Oud, Nieuw).




% Goal: dwerg komt bij het goud.

% Plek van het goud. 

goal(Oud):-
	linksvan(d, g, Oud).


goal(Oud):-
	rechtsvan(d, g, Oud).


goal(Oud):-
	onder(d, g, Oud).


goal(Oud):-
	boven(d, g, Oud).



% Vinden van een pad voor de dwerg. 
% Breadthfirst

solve_breadthfirst(Node, Path) :-
	breadthfirst([[Node]], RevPath),
	reverse(RevPath, Path).


breadthfirst([[Node|Path]|_], [Node|Path]):-
	goal(Node).

breadthfirst([Path|Paths], SolutionPath) :-
	expand_breadthfirst(Path, ExpPaths),
	append(Paths, ExpPaths, NewPaths),
	breadthfirst(NewPaths, SolutionPath).

expand_breadthfirst([Node|Path], ExpPaths):-
	findall([NewNode,Node|Path], move_cyclefree(Path,Node,NewNode), ExpPaths).


move_cyclefree( Path, Node, NewNode):-
	move(Node, NewNode),
	\+ member(NewNode, Path).


% 5. Per zet het bord tekenen.


pp([]):-
	write('de dwerg heeft het goud gevonden').

pp([Node | Path]):-
	Node = [A,B,C,D,
	       E,F,G,H,
	       I,J,K,L,
	       M,N,O,P],
	write('---------'), nl,
	write('|'),write(A'|'B'|'C'|'D), write('|'), nl, write('--+-+-+--'), nl,
	write('|'),write(E'|'F'|'G'|'H), write('|'), nl, write('--+-+-+--'), nl,
	write('|'),write(I'|'J'|'K'|'L), write('|'), nl, write('--+-+-+--'), nl,
	write('|'),write(M'|'N'|'O'|'P), write('|'), nl, write('---------'), nl,
	pp(Path).





% Locatie van de dwerg op het bord.

%-----------------------------------------------

%  X staat links van...

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [X,Y,A,B,
	        C,D,E,F,
	        G,H,I,J,
		K,L,M,N],
       Nieuw = [X,Y,A,B,
	        C,D,E,F,
		G,H,I,J,
		K,L,M,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,X,Y,B,
	        C,D,E,F,
	        G,H,I,J,
	        K,L,M,N],
       Nieuw = [A,Y,X,B,
	        C,D,E,F,
	        G,H,I,J,
	        K,L,M,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,B,X,Y,
	        C,D,E,F,
	        G,H,I,J,
	        K,L,M,N],
       Nieuw = [A,B,Y,X,
	        C,D,E,F,
	        G,H,I,J,
	        K,L,M,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,B,C,D,
	        X,Y,E,F,
	        G,H,I,J,
	        K,L,M,N],
       Nieuw = [A,B,C,D,
	        Y,X,E,F,
	        G,H,I,J,
	        K,L,M,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,D,E,B,
	        C,X,Y,F,
	        G,H,I,J,
	        K,L,M,N],
       Nieuw = [A,D,E,B,
	        C,Y,X,F,
	        G,H,I,J,
	        K,L,M,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,E,F,B,
	        C,D,X,Y,
	        G,H,I,J,
	        K,L,M,N],
       Nieuw = [A,E,F,B,
	        C,D,Y,X,
	        G,H,I,J,
	        K,L,M,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,G,H,B,
	        C,D,E,F,
	        X,Y,I,J,
	        K,L,M,N],
       Nieuw = [A,G,H,B,
	        C,D,E,F,
	        Y,X,I,J,
	        K,L,M,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,G,H,B,
	        C,D,E,F,
	        I,X,Y,J,
	        K,L,M,N],
       Nieuw = [A,G,H,B,
	        C,D,E,F,
	        I,Y,X,J,
	        K,L,M,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,G,H,B,
	        C,D,E,F,
	        I,J,X,Y,
	        K,L,M,N],
       Nieuw = [A,G,H,B,
	        C,D,E,F,
	        I,J,Y,X,
	        K,L,M,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,G,H,B,
	        C,D,E,F,
	        K,L,I,J,
	        X,Y,M,N],
       Nieuw = [A,G,H,B,
	        C,D,E,F,
	        K,L,I,J,
	        Y,X,M,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,G,H,B,
	        C,D,E,F,
	        L,M,I,J,
	        K,X,Y,N],
       Nieuw = [A,G,H,B,
	        C,D,E,F,
	        L,M,I,J,
	        K,X,Y,N].

linksvan(X, Y, Oud, Nieuw):-
	Oud  = [A,G,H,B,
	        C,D,E,F,
	        L,M,I,J,
	        K,N,X,Y],
       Nieuw = [A,G,H,B,
	        C,D,E,F,
	        L,M,I,J,
	        K,N,Y,X].


%-------------------------------------------------------


% Staat rechts van.........

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ Y,X,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [X,Y,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,Y,X,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,X,Y,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,Y,X,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,X,Y,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        Y,X,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        X,Y,G,H,
	        I,J,K,L,
	        M,N,O,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,Y,X,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,X,Y,H,
	        I,J,K,L,
	        M,N,O,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,Y,X,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,X,Y,
	        I,J,K,L,
	        M,N,O,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        Y,X,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        X,Y,K,L,
	        M,N,O,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,Y,X,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,X,Y,L,
	        M,N,O,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,Y,X,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,X,Y,
	        M,N,O,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        Y,X,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        X,Y,O,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,Y,X,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,X,Y,P].

rechtsvan(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,Y,X],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,X,Y].


%--------------------------------------------------------

% X staat onder....

onder(X, Y, Oud, Nieuw):-
       Oud  = [ Y,B,C,D,
	        X,F,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [X,B,C,D,
	        Y,F,G,H,
	        I,J,K,L,
	        M,N,O,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,Y,C,D,
	        E,X,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,X,C,D,
	        E,Y,G,H,
	        I,J,K,L,
	        M,N,O,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,Y,D,
	        E,F,X,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,X,D,
	        E,F,Y,H,
	        I,J,K,L,
	        M,N,O,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,Y,
	        E,F,G,X,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,X,
	        E,F,G,Y,
	        I,J,K,L,
	        M,N,O,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        Y,F,G,H,
	        X,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        X,F,G,H,
	        Y,J,K,L,
	        M,N,O,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,Y,G,H,
	        I,X,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,X,G,H,
	        I,Y,K,L,
	        M,N,O,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,Y,H,
	        I,J,X,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,X,H,
	        I,J,Y,L,
	        M,N,O,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,Y,
	        I,J,K,X,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,X,
	        I,J,K,Y,
	        M,N,O,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        Y,J,K,L,
	        X,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        X,J,K,L,
	        Y,N,O,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,Y,K,L,
	        M,X,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,X,K,L,
	        M,Y,O,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,Y,L,
	        M,N,X,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,X,L,
	        M,N,Y,P].

onder(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,K,Y,
	        M,N,O,X],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,K,X,
	        M,N,O,Y].

%------------------------------------------

% X staat boven....

boven(X, Y, Oud, Nieuw):-
       Oud  = [ X,B,C,D,
	        Y,F,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [Y,B,C,D,
	        X,F,G,H,
	        I,J,K,L,
	        M,N,O,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,X,C,D,
	        E,Y,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,Y,C,D,
	        E,X,G,H,
	        I,J,K,L,
	        M,N,O,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,X,D,
	        E,F,Y,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,Y,D,
	        E,F,X,H,
	        I,J,K,L,
	        M,N,O,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,X,
	        E,F,G,Y,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,Y,
	        E,F,G,X,
	        I,J,K,L,
	        M,N,O,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        X,F,G,H,
	        Y,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        Y,F,G,H,
	        X,J,K,L,
	        M,N,O,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,X,G,H,
	        I,Y,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,Y,G,H,
	        I,X,K,L,
	        M,N,O,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,X,H,
	        I,J,Y,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,Y,H,
	        I,J,X,L,
	        M,N,O,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,X,
	        I,J,K,Y,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,Y,
	        I,J,K,X,
	        M,N,O,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        X,J,K,L,
	        Y,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        Y,J,K,L,
	        X,N,O,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,X,K,L,
	        M,Y,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,Y,K,L,
	        M,X,O,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,X,L,
	        M,N,Y,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,Y,L,
	        M,N,X,P].

boven(X, Y, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,K,X,
	        M,N,O,Y],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,K,Y,
	        M,N,O,X].
%-----------------------------------------------

%-----------------------------------------------
% Het weg duwen van een Blok.

% X staat links van een mogelijkheid tot een blok.


linksvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ X,Y,Z,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [Z,X,Y,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P].


linksvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,X,Y,Z,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,Z,X,Y,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P].

linksvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        X,Y,Z,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        Z,X,Y,H,
	        I,J,K,L,
	        M,N,O,P].

linksvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,X,Y,Z,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,Z,X,Y,
	        I,J,K,L,
	        M,N,O,P].

linksvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        X,Y,Z,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        Z,X,Y,L,
	        M,N,O,P].

linksvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,X,Y,Z,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,Z,X,Y,
	        M,N,O,P].

linksvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        X,Y,Z,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        Z,X,Y,P].

linksvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,X,Y,Z],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,Z,X,Y].


%-------------------------------------------

% X staat rechts van een mogelijkheid tot een blok.

rechtsvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ Z,Y,X,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [Y,X,Z,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P].


rechtsvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,Z,Y,X,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,Y,X,Z,
	        E,F,G,H,
	        I,J,K,L,
	        M,N,O,P].

rechtsvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        Z,Y,X,H,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        Y,X,Z,H,
	        I,J,K,L,
	        M,N,O,P].

rechtsvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,Z,Y,X,
	        I,J,K,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,Y,X,Z,
	        I,J,K,L,
	        M,N,O,P].

rechtsvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        Z,Y,X,L,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        Y,X,Z,L,
	        M,N,O,P].

rechtsvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,Z,Y,X,
	        M,N,O,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,Y,X,Z,
	        M,N,O,P].

rechtsvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        Z,Y,X,P],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        Y,X,Z,P].

rechtsvanbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,Z,Y,X],
       Nieuw = [A,B,C,D,
	        E,F,G,H,
	        I,J,K,L,
	        M,Y,X,Z].

%------------------------------------------------


% X staat boven een mogelijkheid tot een blok.

bovenbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ X,B,C,D,
	        Y,F,G,H,
	        Z,J,K,L,
	        M,N,O,P],
       Nieuw = [Z,B,C,D,
	        X,F,G,H,
	        Y,J,K,L,
	        M,N,O,P].

bovenbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,X,C,D,
	        E,Y,G,H,
	        I,Z,K,L,
	        M,N,O,P],
       Nieuw = [A,Z,C,D,
	        E,X,G,H,
	        I,Y,K,L,
	        M,N,O,P].

bovenbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,X,D,
	        E,F,Y,H,
	        I,J,Z,L,
	        M,N,O,P],
       Nieuw = [A,B,Z,D,
	        E,F,X,H,
	        I,J,Y,L,
	        M,N,O,P].

bovenbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,X,
	        E,F,G,Y,
	        I,J,K,Z,
	        M,N,O,P],
       Nieuw = [A,B,C,Z,
	        E,F,G,X,
	        I,J,K,Y,
	        M,N,O,P].

bovenbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        X,F,G,H,
	        Y,J,K,L,
	        Z,N,O,P],
       Nieuw = [A,B,C,D,
	        Z,F,G,H,
	        X,J,K,L,
	        Y,N,O,P].



bovenbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,X,G,H,
	        I,Y,K,L,
	        M,Z,O,P],
       Nieuw = [A,B,C,D,
	        E,Z,G,H,
	        I,X,K,L,
	        M,Y,O,P].



bovenbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,X,H,
	        I,J,Y,L,
	        M,N,Z,P],
       Nieuw = [A,B,C,D,
	        E,F,Z,H,
	        I,J,X,L,
	        M,N,Y,P].



bovenbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,X,
	        I,J,K,Y,
	        M,N,O,Z],
       Nieuw = [A,B,C,D,
	        E,F,G,Z,
	        I,J,K,X,
	        M,N,O,Y].


%------------------------------------------------


% X staat onder een mogelijkheid tot een blok.

onderbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ Z,B,C,D,
	        Y,F,G,H,
	        X,J,K,L,
	        M,N,O,P],
       Nieuw = [Y,B,C,D,
	        X,F,G,H,
	        Z,J,K,L,
	        M,N,O,P].


onderbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,Z,C,D,
	        E,Y,G,H,
	        I,X,K,L,
	        M,N,O,P],
       Nieuw = [A,Y,C,D,
	        E,X,G,H,
	        I,Z,K,L,
	        M,N,O,P].

onderbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,Z,D,
	        E,F,Y,H,
	        I,J,X,L,
	        M,N,O,P],
       Nieuw = [A,B,Y,D,
	        E,F,X,H,
	        I,J,Z,L,
	        M,N,O,P].

onderbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,Z,
	        E,F,G,Y,
	        I,J,K,X,
	        M,N,O,P],
       Nieuw = [A,B,C,Y,
	        E,F,G,X,
	        I,J,K,Z,
	        M,N,O,P].

onderbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        Z,F,G,H,
	        Y,J,K,L,
	        X,N,O,P],
       Nieuw = [A,B,C,D,
	        Y,F,G,H,
	        X,J,K,L,
	        Z,N,O,P].

onderbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,Z,G,H,
	        I,Y,K,L,
	        M,X,O,P],
       Nieuw = [A,B,C,D,
	        E,Y,G,H,
	        I,X,K,L,
	        M,Z,O,P].

onderbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,Z,H,
	        I,J,Y,L,
	        M,N,X,P],
       Nieuw = [A,B,C,D,
	        E,F,Y,H,
	        I,J,X,L,
	        M,N,Z,P].

onderbox(X, Y, Z, Oud, Nieuw):-
       Oud  = [ A,B,C,D,
	        E,F,G,Z,
	        I,J,K,Y,
	        M,N,O,X],
       Nieuw = [A,B,C,D,
	        E,F,G,Y,
	        I,J,K,X,
	        M,N,O,Z].





%-----------------------------------------------

%-----------------------------------------------


% Goals

% X staat links van het goal..

linksvan(X, Y, Oud):-
	Oud  = [X,Y,_,_,
	        _,_,_,_,
	        _,_,_,_,
	        _,_,_,_].

linksvan(X, Y, Oud):-
	Oud  = [_,X,Y,_,
	        _,_,_,_,
	        _,_,_,_,
	        _,_,_,_].

linksvan(X, Y, Oud):-
	Oud  = [_,_,X,Y,
		_,_,_,_,
		_,_,_,_,
		_,_,_,_].

linksvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        X,Y,_,_,
	        _,_,_,_,
	        _,_,_,_].

linksvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,X,Y,_,
	        _,_,_,_,
	        _,_,_,_].

linksvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,X,Y,
	        _,_,_,_,
	        _,_,_,_].

linksvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,_,_,
	        X,Y,_,_,
	        _,_,_,_].


linksvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,_,_,
	        _,_,_,_,
	        _,X,Y,_].

linksvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,_,_,
	        _,_,_,_,
	        _,_,X,Y].


%-----------------------------------------------


% X staat rechts van...


rechtsvan(X, Y, Oud):-
	Oud  = [Y,X,_,_,
	        _,_,_,_,
	        _,_,_,_,
	        _,_,_,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,Y,X,_,
	        _,_,_,_,
	        _,_,_,_,
	        _,_,_,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,_,Y,X,
	        _,_,_,_,
	        _,_,_,_,
	        _,_,_,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        Y,X,_,_,
	        _,_,_,_,
	        _,_,_,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,Y,X,_,
	        _,_,_,_,
	        _,_,_,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,Y,X,
	        _,_,_,_,
	        _,_,_,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,_,_,
	        Y,X,_,_,
	        _,_,_,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,_,_,
	        _,Y,X,_,
	        _,_,_,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,_,_,
	        _,_,Y,X,
	        _,_,_,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,_,_,
	        _,_,_,_,
	        Y,X,_,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,_,_,
	        _,_,_,_,
	        _,Y,X,_].

rechtsvan(X, Y, Oud):-
	Oud  = [_,_,_,_,
	        _,_,_,_,
	        _,_,_,_,
	        _,_,Y,X].

%---------------------------------------------

% X staat boven het goal...


boven(X, Y, Oud):-
	Oud =  [X,_,_,_,
	        Y,_,_,_,
	        _,_,_,_,
		_,_,_,_].

boven(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        X,_,_,_,
	        Y,_,_,_,
		_,_,_,_].

boven(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,_,_,
	        X,_,_,_,
		Y,_,_,_].

boven(X, Y, Oud):-
	Oud =  [_,X,_,_,
	        _,Y,_,_,
	        _,_,_,_,
		_,_,_,_].

boven(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,X,_,_,
	        _,Y,_,_,
		_,_,_,_].

boven(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,_,_,
	        _,X,_,_,
		_,Y,_,_].

boven(X, Y, Oud):-
	Oud =  [_,_,X,_,
	        _,_,Y,_,
	        _,_,_,_,
		_,_,_,_].

boven(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,X,_,
	        _,_,Y,_,
		_,_,_,_].

boven(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,_,_,
	        _,_,X,_,
		_,_,Y,_].

boven(X, Y, Oud):-
	Oud =  [_,_,_,X,
	        _,_,_,Y,
	        _,_,_,_,
		_,_,_,_].

boven(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,_,X,
	        _,_,_,Y,
		_,_,_,_].
                         
boven(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,_,_,
	        _,_,_,X,
		_,_,_,Y].

%----------------------------------------------


% X staat onder het goal..

onder(X, Y, Oud):-
	Oud =  [Y,_,_,_,
	        X,_,_,_,
	        _,_,_,_,
		_,_,_,_].

onder(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        Y,_,_,_,
	        X,_,_,_,
		_,_,_,_].
onder(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,_,_,
	        Y,_,_,_,
		X,_,_,_].
onder(X, Y, Oud):-
	Oud =  [_,Y,_,_,
	        _,X,_,_,
	        _,_,_,_,
		_,_,_,_].

onder(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,Y,_,_,
	        _,X,_,_,
		_,_,_,_].


onder(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,_,_,
	        _,Y,_,_,
		_,X,_,_].

onder(X, Y, Oud):-
	Oud =  [_,_,Y,_,
	        _,_,X,_,
	        _,_,_,_,
		_,_,_,_].

onder(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,Y,_,
	        _,_,X,_,
		_,_,_,_].

onder(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,_,_,
	        _,_,Y,_,
		_,_,X,_].

onder(X, Y, Oud):-
	Oud =  [_,_,_,Y,
	        _,_,_,X,
	        _,_,_,_,
		_,_,_,_].


onder(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,_,Y,
	        _,_,_,X,
		_,_,_,_].

onder(X, Y, Oud):-
	Oud =  [_,_,_,_,
	        _,_,_,_,
	        _,_,_,Y,
		_,_,_,X].







/*
    Q/R/S/T/U/
	       V/W/X/Y/Z/AA/BB/
	       CC/DD/EE/FF/GG/HH/II/
	       JJ/KK/LL/MM/NN/OO/PP/
	       QQ/RR/SS/TT/UU/VV/WW,
'Q'|'R'|'S'|'T'|'U), nl,
	write(V'|'W'|'X'|'Y'|'Z'|'AA'|'BB),nl,
	write(CC'|'DD'|'EE'|'FF'|'GG'|'HH'|'II),nl,
	write(JJ'|'KK'|'LL'|'MM'|'NN'|'OO'|'PP),nl,
	write(QQ'|'RR'|'SS'|'TT'|'UU'|'VV'|'WW),nl,



move( A/d/l/B, A/l/d/B).

move( A/l/d/B, A/d/l/B).

move( A/d/C/D/E/F/G/
	    H/l/B, 
      A/l/C/D/E/F/G/
	    H/d/B):-
	C \= _/_, D \= _/_, E \= _/_, F \= _/_, G \= _/_ , H \= _/_.

move( A/l/C/D/E/F/G/
	    H/d/B, 
      A/d/C/D/E/F/G/
	    H/l/B):-
	C \= _/_, D \= _/_, E \= _/_, F \= _/_, G \= _/_ , H \= _/_.


move( A/d/b/l/B, A/l/d/b/B).

move( A/l/b/d/B, A/b/d/l/B).

move( A/d/B/C/D/E/F/
      G/b/H/I/J/K/L/
      M/l/N,
      A/l/B/C/D/E/F/
      G/d/H/I/J/K/L/
      M/b/N):-
      B \= _/_, C \= _/_, D \= _/_, E \= _/_, F \= _/_, G \= _/_, H \= _/_,
      I \= _/_, J \= _/_, K \= _/_, L \= _/_, M \= _/_.

move( A/l/B/C/D/E/F/
      G/b/H/I/J/K/L/
      M/d/N,
      A/b/B/C/D/E/F/
      G/d/H/I/J/K/L/ 
      M/l/N):-
      B \= _/_, C \= _/_, D \= _/_, E \= _/_, F \= _/_, G \= _/_, H \= _/_,
      I \= _/_, J \= _/_, K \= _/_, L \= _/_, M \= _/_.

goal( _/d/g/_).


goal( _A/g/d/_B).


goal( _/d/A/B/C/D/E/F/
	g/_):- 
	B \= _/_, C \= _/_, D \= _/_, E \= _/_, F \= _/_, A \= _/_.


goal( _/g/A/B/C/D/E/F/
        d/_):- 
	B \= _/_, C \= _/_, D \= _/_, E \= _/_, F \= _/_, A \= _/_.

   
*/



% NIEUWE











