Alphabet

nil:list
app:[list × list] ⟶ list
cons:[nat × list] ⟶ list
shuffle:[list] ⟶ list
hshuffle:[list] ⟶ list
reverse:[list] ⟶ list
hrepeat:[nat × list → list × list] ⟶ list
0:nat
s:[nat] ⟶ nat
uhalf:[nat] ⟶ nat
tail:[list] ⟶ list
head:[list] ⟶ nat

Variables

n:nat
x:list
y:list
l:list
F:list → list

Rules

app(nil, l)⇒l
app(cons(n, l), y)⇒cons(n, app(l, y))
reverse(nil)⇒nil
reverse(cons(n, l))⇒app(reverse(l), cons(n, nil))
shuffle(nil)⇒nil
shuffle(cons(n, l))⇒cons(n, shuffle(reverse(l)))
uhalf(0)⇒0
uhalf(s(0))⇒s(0)
uhalf(s(s(n)))⇒s(uhalf(n))
hrepeat(0, F, l)⇒l
hrepeat(s(n), F, l)⇒hrepeat(uhalf(n), F, F · l)
tail(cons(n, l))⇒l
head(cons(n, l))⇒n
hshuffle(l)⇒hrepeat(head(l), λz:list.shuffle(z), tail(l))