Alphabet

0:nat
add:[nat × nat] ⟶ nat
rec:[nat → nat → nat × nat × nat] ⟶ nat
s:[nat] ⟶ nat
succ:nat → nat → nat
xap:[nat → nat → nat × nat] ⟶ nat → nat
yap:[nat → nat × nat] ⟶ nat

Variables

F:nat → nat → nat
Y:nat
G:nat → nat → nat
V:nat
W:nat
P:nat
X1:nat
Y1:nat
U1:nat
V1:nat
W1:nat
P1:nat
F2:nat → nat → nat
Y2:nat
G2:nat → nat
V2:nat

Rules

rec(λ%X:nat.λ%Y:nat.yap(xap(F, %X), %Y), Y, 0)⇒Y
rec(λ%Z:nat.λ%U:nat.yap(xap(G, %Z), %U), V, s(W))⇒yap(xap(G, W), rec(λ%V:nat.λ%W:nat.yap(xap(G, %V), %W), V, W))
succ · P · X1⇒s(X1)
add(Y1, U1)⇒rec(λ%F:nat.λ%G:nat.yap(xap(succ, %F), %G), Y1, U1)
add(V1, 0)⇒V1
add(W1, s(P1))⇒s(add(W1, P1))
xap(F2, Y2)⇒F2 · Y2
yap(G2, V2)⇒G2 · V2