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).