dp([]):-!,fail.
dp(M):-member([],M),!.
dp(M):-member([L],M),(atom(L),-L=N;-N=L),!,r(M,N,L,Q),dp(Q).
dp([[[D|M],[E|R]|C]|Q]):-!,
   dp([[[D|M]]|Q]),dp([[[E|R]]|Q]),dp([C|Q]).
dp(M):-s(M,P,N),r(M,P,N,Q),dp(Q),r(M,N,P,R),dp(R).

r(L,L,_,[[]]):-!.
r(N,_,N,[]):-!.
r([C|M],L,N,Q):-!,
   r(C,L,N,D),(D=[]->Q=[[]];D=[[]]->r(M,L,N,Q);
   r(M,L,N,R),(R=[[]]->Q=[[]];R=[],D=[S]->Q=S;Q=[D|R])).
r(A,_,_,A).

s([M|_],A,B):-!,s(M,A,B).
s(-A,-A,A):-!.
s(A,A,-A).
