fgi_mod!{
type List = (
rec Seq.#X.#Y.
(+ Vec + (exists (X1,X2,X3) :NmSet | (X1%X2%X3=X).
exists (Y1,Y2,Y3,Y4):NmSet | (Y1%Y2%Y3%Y4=Y).
x Nm[X1] x Nat x Vec x Ref[Y1](Seq[X2][Y2])) )
)
fn list_l2r_rec: (
Thk[0] foralli (X,X1,X2,X3, Y,Y1,Y2):NmSet | ((X1%X2%X3)=X)and((Y1%Y2%Y3)=Y).
0 (Seq[X1][Y1] Nat) ->
0 (x Nm[X3] x Nat x Ref[Y3](List[X2][Y2])) ->
~~ X; Y ~~
F List[X][Y]
) = {
#seq. #rest. unroll match seq {
vec => { ret roll inj2 (n,lev,vec,rest) }
bin => {
let (n,lev,l,r) = {ret bin}
let (rr, _) = { memo{n,(@2)}{ {force list_l2r_rec} rest {!r} } }
let (_, ll) = { memo{n,(@1)}{ {force list_l2r_rec} (n,lev,rr) {!l} } }
{ ret ll }
}
}
}
fn list_l2r_rmost: (
Thk[0] foralli (X,Y):NmSet.
0 (Seq[X][Y] Nat) ->
~~ X; Y ~~
F List[X][X]
) = {
#seq. #rest. unroll match seq {
vec => { ret roll inj1 vec }
bin => {
let (n,lev,l,r) = {ret bin}
let (rr, _) = { memo{n,(@1)}{ {force list_l2r_rmost} {!r} } }
let (_, ll) = { memo{n,(@2)}{ {force list_l2r_rec} (n,lev,lr) {!l} } }
{ ret ll }
}
}
}
fn list_l2r: (
Thk[0] foralli (X,Y):NmSet.
0 (Seq[X][Y] Nat) ->
~~ X; Y ~~
F List[X][X]
) = { #seq. {force list_l2r_rmost} seq }
fn seq_of_list: (
Thk[0] foralli (X,Y):NmSet.
0 List[X][Y] ->
~~ X;Y ~~
F Seq[X][Y]
) = {
unimplemented
}
}