/*
init(R):- generateRing(R), move(R).

generateRing(cons(cs,Qs)):- generateRing2(Qs).

generateRing2(cons(nc,Qs)):- generateRing2(Qs).
generateRing2(cons(nc,nil)).

move(R):- atleast2cs(R).   % stop if R is non-safe state

move(R):-transition(R,NewR),move(NewR).


n_c(nil).
n_c(cons(nc,L)):-n_c(L).

last(cons(cs,nil)).
last(cons(_,L)):-last(L).

transition(L,R):-transition1(L,R).
transition(L,R):-transition2(L,R).

transition1(cons(nc,L),cons(cs,R)):- n_c(R), last(L).

transition2(cons(cs,cons(nc,L)), cons(nc,cons(cs,L))):- n_c(L).
transition2(cons(nc,L), cons(nc,R)):- transition2(L,R).

atleast2cs(cons(cs,L)):- onecs(L).
atleast2cs(cons(nc,L)):- atleast2cs(L).

onecs(cons(cs,_)).
onecs(cons(nc,L)):- onecs(L).


*/

/*

init(R):- cFirst(R), mv(R).

cFirst(cons(cs,Qs)):-  nOnly(Qs).

nOnly(cons(nc,Qs)):- nOnly(Qs).
nOnly(nil).

mv(R):-  
	mmv(R),
	tr(R,NewR), 
	onecs(NewR),
	mv(NewR).

tr(cons(cs,cons(nc,Lp)),cons(nc,cons(cs,Lp))).

tr(cons(nc,Lp),cons(nc,Rp)):-  tr(Lp,Rp).
tr(nil,nil).

mmv(R) :- mmv(Rp), tr(Rp,R).
mmv(R) :- cFirst(R).

mtr(cons(nc,L)) :- mtr(L).
mtr(R) :- mmv(R).


mv(R):- mmv(R),
	atleast2cs(R).   % success if R is non-safe state

atleast2cs(cons(cs,L)):- atleast1cs(L).
atleast2cs(cons(nc,L)):- atleast2cs(L).

atleast1cs(cons(cs,_)).
atleast1cs(cons(nc,L)):- atleast1cs(L).

onecs(cons(cs,L)):-
	nOnly(L).
onecs(cons(nc,L)):-
	onecs(L).

*/
/*
init(R):- cFirst(R), mv(R).

cFirst(cons(cs,Qs)):-  nOnly(Qs).

nOnly(cons(nc,Qs)):- nOnly(Qs).
nOnly(cons(nc,nil)).

mv(R):- mmv(R), tr(R,NewR), mv(NewR).

tr(cons(cs,cons(nc,Lp)),cons(nc,cons(cs,Lp))):- 
	mtr(cons(cs,cons(nc,Lp))),
	nOnly(Lp).

tr(cons(nc,Lp),cons(nc,Rp)):- mtr(cons(nc,Lp)), tr(Lp,Rp).
tr(nil,nil).




mmv(R) :- mmv(Rp), tr(Rp,R).
mmv(R) :- cFirst(R).

mtr(cons(nc,L)) :- mtr(L).
mtr(R) :- mmv(R).

mv(R):- mmv(R), atleast2cs(R).   % success if R is non-safe state

atleast2cs(cons(cs,L)):- atleast1cs(L).
atleast2cs(cons(nc,L)):- atleast2cs(L).

atleast1cs(cons(cs,_)).
atleast1cs(cons(nc,L)):- atleast1cs(L).
*/


/*
mv(R):- mmv(R), tr(R,NewR), mv(NewR).

tr(L,R):- mtr(L), L=[cs,nc|Lp], R=[nc,cs|Lp].    
tr(L,R):- mtr(L), L=[nc|Lp], R=[nc|Rp], tr(Lp,Rp).
tr([],[]).

mmv(R) :- mmv(Rp), tr(Rp,R).
mmv(R) :- cFirst(R).

mtr(R) :- R=[nc|L], mtr(L).
mtr(R) :- mmv(R).

mv(R):- atleast2cs(R).   % success if R is non-safe state

atleast2cs([cs|L]):- atleast1cs(L).
atleast2cs([nc|L]):- atleast2cs(L).

atleast1cs([cs|_]).
atleast1cs([nc|L]):- atleast1cs(L).


*/


init(R):- cFirst(R), mv(R).

cFirst(cons(cs,Qs)):-  nOnly(Qs).

nOnly(cons(nc,Qs)):- nOnly(Qs).
nOnly(cons(nc,nil)).

mv(R):- mmv(R), tr(R,NewR), mv(NewR).

tr(cons(cs,cons(nc,Lp)),cons(nc,cons(cs,Lp))):- 
	mtr(cons(cs,cons(nc,Lp)),cons(nc,cons(cs,Lp))).
tr(cons(nc,Lp),cons(nc,Rp)):- mtr(cons(nc,Lp),cons(nc,Rp)), tr(Lp,Rp).
tr(nil,nil).


mmv(R) :- mmv(Rp), tr(Rp,R) .
mmv(R) :- cFirst(R).

mtr(cons(nc,L),cons(nc,L)) :- mtr(L,L).
mtr(L,R) :- mv(L), mv(R).

mv(R):- mmv(R), atleast2cs(R).   % success if R is non-safe state

atleast2cs(cons(cs,L)):- atleast1cs(L).
atleast2cs(cons(nc,L)):- atleast2cs(L).

atleast1cs(cons(cs,_)).
atleast1cs(cons(nc,L)):- atleast1cs(L).




