push_button2(N,State,NextState):- R is N // 5, C is N mod 5, nth0(C,[3,7,14,28,24],XorM), nth0(C,[1,2,4,8,16],XorU), XorM1 is XorM<<(5*R), (R>0 -> XorU1 is XorU<<(5*(R-1));XorU1 is 0), (R<4 -> XorD1 is XorU<<(5*(R+1));XorD1 is 0), NextState is State xor (XorU1 \/ XorM1 \/ XorD1).
b_search(_,Down,Up,_):-Up<Down,fail. b_search(List,Down,Up,No):- Down=<Up, M is (Down+Up)//2, nth0(M,List,X), (X<No->Down1 is M+1,b_search(List,Down1,Up,No);true), (X>No->Up1 is M-1,b_search(List,Down,Up1,No);true), true. push_one(NowList,OldList,NextState,OldSize,NowSize):- select(State,NowList,_), between(0,24,N), push_button2(N,State,NextState), not(b_search(OldList,0,OldSize,NextState)), not(b_search(NowList,0,NowSize,NextState)), true.
next_search(P,OldList,Now):- length(Now,NowSize), length(OldList,OldSize), NowSize1 is NowSize-1, OldSize1 is OldSize-1, write([P,NowSize]), P<4, findall(State,(push_one(Now,OldList,State,OldSize1,NowSize1)),Next), sort(Next,Next1), write('ok'),nl, P1 is P+1, next_search(P1,Now,Next1).