Help:=proc():print(`C(n),Rev1(S),Pref1(S,a)`): print(`N(v),P(v)`): end: Rev1:=proc(S) local i,n: n:=nops(S): [seq(S[n-i+1],i=1..n)]: end: #Pref1(S,a): Given a list of lists S, prefixes a to each of them Pref1:=proc(S,a) local i:[ seq( [a,op(S[i])], i=1..nops(S))]:end: C:=proc(n::nonnegint) local S,S1: option remember: if n=0 then return [[]]: fi: S:=C(n-1): S1:=Rev1(S): [op(Pref1(S,0)),op(Pref1(S1,1))]: end: #N(v): next-in-line in C(n) N:=proc(v) local n,v1,v1n: n:=nops(v): if n=0 then RETURN(FAIL): fi: if n=1 then if v[1]=0 then RETURN([1]): else RETURN(FAIL): fi: fi: v1:=[op(2..n,v)]: if v[1]=0 then v1n:=N([op(2..n,v)]): if v1n=FAIL then RETURN([1,op(v1)]): else RETURN([0,op(v1n)]): fi: elif v[1]=1 then v1n:=P([op(2..n,v)]): if v1n=FAIL then RETURN(FAIL): else RETURN([1,op(v1n)]): fi: else ERROR(`entries must be 0 or 1`): fi: end: #P(v): next-in-line in C(n) P:=proc(v) local n,v1,v1p: n:=nops(v): if n=0 then RETURN(FAIL): fi: if n=1 then if v[1]=1 then RETURN([0]): else RETURN(FAIL): fi: fi: v1:=[op(2..n,v)]: if v[1]=0 then v1p:=P([op(2..n,v)]): if v1p=FAIL then RETURN(FAIL): else RETURN([0,op(v1p)]): fi: elif v[1]=1 then v1p:=N([op(2..n,v)]): if v1p=FAIL then RETURN([0,op(v1)]): else RETURN([1,op(v1p)]): fi: else ERROR(`entries must be 0 or 1`): fi: end: N1:=proc(v) local k,n: n:=nops(v): k:=convert(v,`+`): if k mod 2 =0 then RETURN([op(1..n-1,v),1-v[n]]): else if k=1 and v=[1,0$(n-1)] then RETURN(FAIL): fi: end: