%%%%%  RAPPRESENTAZIONE DEL MONDO:

%%%%%%%%%%%%%%%%%%%%%%%% LEGGI GENERALI:

%%%% mattonelle= incroci riga, colonna:

matt(m(X,Y)) :- riga(X), colonna(Y).
a(nord,m(X,Y),m(X1,Y)) :- matt(m(X,Y)), matt(m(X1,Y)), X1 is X+1.
a(sud,m(X,Y),m(X1,Y)) :-  matt(m(X,Y)), matt(m(X1,Y)),X1 is X-1.
a(est,m(X,Y),m(X,Y1)) :- matt(m(X,Y)), matt(m(X,Y1)), Y1 is Y+1.
a(ovest,m(X,Y),m(X,Y1)) :-  matt(m(X,Y)), matt(m(X,Y1)), Y1 is Y-1.

%%%%%%  archi: da una mattonella all'adiacente se non occupata

arc(M1,M2) :- 
    member(Dir,[nord,sud,est,ovest]),
    a(Dir,M1,M2),
    libera(M2). 


%%%  riga e colonna sono conoscenze
%%%  libera(X):  nessun mobile su X 

riga(I) :- member(I,[1,2,3,4]).
colonna(I) :- member(I,[1,2,3,4,5]).

%%%%%%%%%  NB, e' usato come test ground; 
%%%%%%%%%   In questo caso si usi il cut per evitare
%%%%%%%%%%  ripetizioni 

libera(m(I,J)) :- 
       member(I,[1,4]),!;
       member(J,[1,2,5]),!;
       I=2, J=4, !;
       I=3, J=2, !.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  MOTORE

% path con taglio cicli usando diffPath:

path(X,Y,P) :- diffPath(X,Y,P-[]).

%diffPath(1,3,[1,2,3|S]-S) :- arc(2,3), diffPath(1,2,[1,2,3]-[3|S])

diffPath(X,X,[X|R]-R).
diffPath(X,Y,P-S) :- 
     arc(A,Y),
     not(member(A,S)),	     %NB: not con A, S ground
     diffPath(X,A,P-[Y|S]).  %NOTARE la ricorsione di coda

%%%%%%%%%%%%%%%%%%%%

