YES
0 RelTRS
↳1 RelTRStoRelADPProof (⇔, 0 ms)
↳2 RelADPP
↳3 RelADPDepGraphProof (⇔, 0 ms)
↳4 AND
↳5 RelADPP
↳6 RelADPCleverAfsProof (⇒, 106 ms)
↳7 QDP
↳8 MRRProof (⇔, 1 ms)
↳9 QDP
↳10 MRRProof (⇔, 0 ms)
↳11 QDP
↳12 MRRProof (⇔, 3 ms)
↳13 QDP
↳14 MRRProof (⇔, 0 ms)
↳15 QDP
↳16 QDPOrderProof (⇔, 0 ms)
↳17 QDP
↳18 PisEmptyProof (⇔, 0 ms)
↳19 YES
↳20 RelADPP
↳21 RelADPCleverAfsProof (⇒, 95 ms)
↳22 QDP
↳23 MRRProof (⇔, 5 ms)
↳24 QDP
↳25 MRRProof (⇔, 0 ms)
↳26 QDP
↳27 PisEmptyProof (⇔, 0 ms)
↳28 YES
↳29 RelADPP
↳30 RelADPCleverAfsProof (⇒, 101 ms)
↳31 QDP
↳32 MRRProof (⇔, 1 ms)
↳33 QDP
↳34 PisEmptyProof (⇔, 0 ms)
↳35 YES
↳36 RelADPP
↳37 RelADPCleverAfsProof (⇒, 99 ms)
↳38 QDP
↳39 MRRProof (⇔, 1 ms)
↳40 QDP
↳41 MRRProof (⇔, 0 ms)
↳42 QDP
↳43 MRRProof (⇔, 3 ms)
↳44 QDP
↳45 MRRProof (⇔, 0 ms)
↳46 QDP
↳47 QDPOrderProof (⇔, 0 ms)
↳48 QDP
↳49 PisEmptyProof (⇔, 0 ms)
↳50 YES
+(0, y) → y
+(s(x), y) → s(+(x, y))
sum1(nil) → 0
sum1(cons(x, y)) → +(x, sum1(y))
sum2(nil, z) → z
sum2(cons(x, y), z) → sum2(y, +(x, z))
tests(0) → true
tests(s(x)) → and(test(rands(rand(0), nil)), x)
test(done(y)) → eq(f(y), g(y))
eq(x, x) → true
rands(0, y) → done(y)
rands(s(x), y) → rands(x, ::(rand(0), y))
rand(x) → rand(s(x))
rand(x) → x
We upgrade the RelTRS problem to an equivalent Relative ADP Problem [IJCAR24].
+(0, y) → y
+(s(x), y) → s(+1(x, y))
sum1(nil) → 0
sum1(cons(x, y)) → +1(x, sum1(y))
sum1(cons(x, y)) → +(x, SUM1(y))
sum2(nil, z) → z
sum2(cons(x, y), z) → SUM2(y, +(x, z))
sum2(cons(x, y), z) → sum2(y, +1(x, z))
tests(0) → true
tests(s(x)) → and(TEST(rands(rand(0), nil)), x)
tests(s(x)) → and(test(RANDS(rand(0), nil)), x)
tests(s(x)) → and(test(rands(RAND(0), nil)), x)
test(done(y)) → EQ(f(y), g(y))
eq(x, x) → true
rands(0, y) → done(y)
rands(s(x), y) → RANDS(x, ::(rand(0), y))
rands(s(x), y) → rands(x, ::(RAND(0), y))
rand(x) → RAND(s(x))
rand(x) → x
We use the relative dependency graph processor [IJCAR24].
The approximation of the Relative Dependency Graph contains:
4 SCCs with nodes from P_abs,
0 Lassos,
Result: This relative DT problem is equivalent to 4 subproblems.
sum1(cons(x, y)) → +(x, sum1(y))
sum2(nil, z) → z
tests(s(x)) → and(test(rands(rand(0), nil)), x)
rands(0, y) → done(y)
rands(s(x), y) → rands(x, ::(rand(0), y))
test(done(y)) → eq(f(y), g(y))
sum1(nil) → 0
tests(0) → true
sum2(cons(x, y), z) → sum2(y, +(x, z))
+(s(x), y) → s(+1(x, y))
+(0, y) → y
eq(x, x) → true
rand(x) → rand(s(x))
rand(x) → x
Furthermore, We use an argument filter [LPAR04].
Filtering:rands_2 = 1
true =
done_1 = 0
sum1_1 =
and_2 = 1
rand_1 =
g_1 =
nil =
s_1 =
eq_2 = 1
+_2 =
::_2 = 0, 1
tests_1 = 0
f_1 = 0
0 =
+^1_2 = 1
cons_2 =
test_1 = 0
sum2_2 =
Found this filtering by looking at the following order that orders at least one DP strictly:Combined order from the following AFS and order.
+1(x1, x2) = +1(x1)
s(x1) = s(x1)
rands(x1, x2) = x1
0 = 0
done(x1) = done
::(x1, x2) = ::
rand(x1) = rand(x1)
sum1(x1) = x1
nil = nil
tests(x1) = tests
true = true
sum2(x1, x2) = sum2(x1, x2)
cons(x1, x2) = cons(x1, x2)
+(x1, x2) = +(x1, x2)
eq(x1, x2) = x1
and(x1, x2) = x1
test(x1) = test
f(x1) = f
g(x1) = g(x1)
Recursive path order with status [RPO].
Quasi-Precedence:
+^11 > true
[0, nil] > done > true
:: > true
[tests, test, f] > rand1 > true
sum22 > [cons2, +2] > s1 > true
g1 > true
+^11: multiset
s1: multiset
0: multiset
done: []
::: multiset
rand1: multiset
nil: multiset
tests: multiset
true: multiset
sum22: [1,2]
cons2: [2,1]
+2: [2,1]
test: multiset
f: multiset
g1: multiset
+1(s0(x)) → +1(x)
rands(00) → done
rands(s0(x)) → rands(x)
sum10(nil0) → 00
tests → true0
sum20(cons0(x, y), z) → sum20(y, +0(x, z))
rand0(x) → rand0(s0(x))
eq(x) → true0
sum10(cons0(x, y)) → +0(x, sum10(y))
sum20(nil0, z) → z
tests → and(test)
+0(s0(x), y) → s0(+0(x, y))
test → eq(f)
+0(00, y) → y
rand0(x) → x
tests → true0
sum20(cons0(x, y), z) → sum20(y, +0(x, z))
sum10(cons0(x, y)) → +0(x, sum10(y))
sum20(nil0, z) → z
tests → and(test)
rand0(x) → x
POL(+0(x1, x2)) = x1 + x2
POL(+1(x1)) = x1
POL(00) = 0
POL(and(x1)) = x1
POL(cons0(x1, x2)) = 1 + x1 + x2
POL(done) = 0
POL(eq(x1)) = 2·x1
POL(f) = 0
POL(nil0) = 0
POL(rand0(x1)) = 2 + x1
POL(rands(x1)) = x1
POL(s0(x1)) = x1
POL(sum10(x1)) = x1
POL(sum20(x1, x2)) = 2 + 2·x1 + x2
POL(test) = 0
POL(tests) = 2
POL(true0) = 0
+1(s0(x)) → +1(x)
rands(00) → done
rands(s0(x)) → rands(x)
sum10(nil0) → 00
rand0(x) → rand0(s0(x))
eq(x) → true0
+0(s0(x), y) → s0(+0(x, y))
test → eq(f)
+0(00, y) → y
rands(00) → done
test → eq(f)
+0(00, y) → y
POL(+0(x1, x2)) = 2·x1 + x2
POL(+1(x1)) = x1
POL(00) = 2
POL(done) = 0
POL(eq(x1)) = x1
POL(f) = 0
POL(nil0) = 1
POL(rand0(x1)) = x1
POL(rands(x1)) = 2·x1
POL(s0(x1)) = x1
POL(sum10(x1)) = 2·x1
POL(test) = 2
POL(true0) = 0
+1(s0(x)) → +1(x)
rands(s0(x)) → rands(x)
sum10(nil0) → 00
rand0(x) → rand0(s0(x))
eq(x) → true0
+0(s0(x), y) → s0(+0(x, y))
eq(x) → true0
POL(+0(x1, x2)) = x1 + x2
POL(+1(x1)) = x1
POL(00) = 0
POL(eq(x1)) = 2 + x1
POL(nil0) = 0
POL(rand0(x1)) = x1
POL(rands(x1)) = x1
POL(s0(x1)) = x1
POL(sum10(x1)) = 2·x1
POL(true0) = 1
+1(s0(x)) → +1(x)
rands(s0(x)) → rands(x)
sum10(nil0) → 00
rand0(x) → rand0(s0(x))
+0(s0(x), y) → s0(+0(x, y))
sum10(nil0) → 00
POL(+0(x1, x2)) = x1 + x2
POL(+1(x1)) = 2·x1
POL(00) = 0
POL(nil0) = 0
POL(rand0(x1)) = x1
POL(rands(x1)) = x1
POL(s0(x1)) = x1
POL(sum10(x1)) = 1 + x1
+1(s0(x)) → +1(x)
rands(s0(x)) → rands(x)
rand0(x) → rand0(s0(x))
+0(s0(x), y) → s0(+0(x, y))
The following pairs can be oriented strictly and are deleted.
The remaining pairs can at least be oriented weakly.
+1(s0(x)) → +1(x)
rands1 > [s01, rand0]
+02 > [s01, rand0]
s01: multiset
rands1: multiset
rand0: multiset
+02: [2,1]
rands(s0(x)) → rands(x)
rand0(x) → rand0(s0(x))
+0(s0(x), y) → s0(+0(x, y))
rands(s0(x)) → rands(x)
rand0(x) → rand0(s0(x))
+0(s0(x), y) → s0(+0(x, y))
rands(0, y) → done(y)
rands(s(x), y) → rands(x, ::(rand(0), y))
sum1(nil) → 0
tests(0) → true
sum2(cons(x, y), z) → sum2(y, +(x, z))
eq(x, x) → true
sum2(cons(x, y), z) → SUM2(y, +(x, z))
sum1(cons(x, y)) → +(x, sum1(y))
sum2(nil, z) → z
tests(s(x)) → and(test(rands(rand(0), nil)), x)
+(s(x), y) → s(+(x, y))
test(done(y)) → eq(f(y), g(y))
+(0, y) → y
rand(x) → rand(s(x))
rand(x) → x
Furthermore, We use an argument filter [LPAR04].
Filtering:rands_2 =
true =
done_1 = 0
sum1_1 = 0
and_2 = 1
rand_1 =
g_1 = 0
nil =
s_1 =
eq_2 = 1
+_2 = 0
::_2 = 0, 1
tests_1 = 0
f_1 = 0
0 =
cons_2 = 0
SUM2_2 =
test_1 = 0
sum2_2 = 0
Found this filtering by looking at the following order that orders at least one DP strictly:Combined order from the following AFS and order.
SUM2(x1, x2) = SUM2(x1, x2)
cons(x1, x2) = cons(x2)
+(x1, x2) = x2
rands(x1, x2) = rands(x1, x2)
0 = 0
done(x1) = done
s(x1) = x1
::(x1, x2) = ::
rand(x1) = rand(x1)
sum1(x1) = sum1
nil = nil
tests(x1) = tests
true = true
sum2(x1, x2) = x2
eq(x1, x2) = x1
and(x1, x2) = x1
test(x1) = test
f(x1) = f
g(x1) = g
Recursive path order with status [RPO].
Quasi-Precedence:
cons1 > SUM22 > [::, true]
rands2 > [done, tests, test, f] > [::, true]
[0, sum1] > [done, tests, test, f] > [::, true]
rand1 > [::, true]
nil > [::, true]
g > [::, true]
SUM22: [1,2]
cons1: multiset
rands2: multiset
0: multiset
done: multiset
::: multiset
rand1: multiset
sum1: []
nil: multiset
tests: multiset
true: multiset
test: multiset
f: multiset
g: multiset
SUM20(cons(y), z) → SUM20(y, +(z))
rands0(00, y) → done
rands0(s0(x), y) → rands0(x, ::)
sum1 → 00
tests → true0
sum2(z) → sum2(+(z))
rand0(x) → rand0(s0(x))
eq(x) → true0
sum1 → +(sum1)
sum2(z) → z
tests → and(test)
+(y) → s0(+(y))
test → eq(f)
+(y) → y
rand0(x) → x
tests → true0
sum2(z) → z
tests → and(test)
rand0(x) → x
POL(+(x1)) = x1
POL(00) = 0
POL(::) = 0
POL(SUM20(x1, x2)) = x1 + x2
POL(and(x1)) = x1
POL(cons(x1)) = x1
POL(done) = 0
POL(eq(x1)) = 2·x1
POL(f) = 0
POL(rand0(x1)) = 2 + x1
POL(rands0(x1, x2)) = 2·x1 + x2
POL(s0(x1)) = x1
POL(sum1) = 0
POL(sum2(x1)) = 2 + x1
POL(test) = 0
POL(tests) = 2
POL(true0) = 0
SUM20(cons(y), z) → SUM20(y, +(z))
rands0(00, y) → done
rands0(s0(x), y) → rands0(x, ::)
sum1 → 00
sum2(z) → sum2(+(z))
rand0(x) → rand0(s0(x))
eq(x) → true0
sum1 → +(sum1)
+(y) → s0(+(y))
test → eq(f)
+(y) → y
SUM20(cons(y), z) → SUM20(y, +(z))
rands0(00, y) → done
sum1 → 00
POL(+(x1)) = x1
POL(00) = 0
POL(::) = 0
POL(SUM20(x1, x2)) = x1 + x2
POL(cons(x1)) = 1 + x1
POL(done) = 0
POL(eq(x1)) = 2 + x1
POL(f) = 0
POL(rand0(x1)) = x1
POL(rands0(x1, x2)) = 1 + x1 + x2
POL(s0(x1)) = x1
POL(sum1) = 2
POL(sum2(x1)) = x1
POL(test) = 2
POL(true0) = 2
rands0(s0(x), y) → rands0(x, ::)
sum2(z) → sum2(+(z))
rand0(x) → rand0(s0(x))
eq(x) → true0
sum1 → +(sum1)
+(y) → s0(+(y))
test → eq(f)
+(y) → y
rands(0, y) → done(y)
rands(s(x), y) → rands(x, ::(rand(0), y))
sum1(nil) → 0
tests(0) → true
sum2(cons(x, y), z) → sum2(y, +(x, z))
eq(x, x) → true
sum1(cons(x, y)) → +(x, sum1(y))
sum1(cons(x, y)) → +(x, SUM1(y))
sum2(nil, z) → z
tests(s(x)) → and(test(rands(rand(0), nil)), x)
+(s(x), y) → s(+(x, y))
test(done(y)) → eq(f(y), g(y))
+(0, y) → y
rand(x) → rand(s(x))
rand(x) → x
Furthermore, We use an argument filter [LPAR04].
Filtering:rands_2 =
true =
done_1 =
sum1_1 =
SUM1_1 =
and_2 = 1
rand_1 =
g_1 =
nil =
s_1 =
eq_2 = 0
+_2 =
::_2 = 0
tests_1 = 0
f_1 =
0 =
cons_2 =
test_1 =
sum2_2 =
Found this filtering by looking at the following order that orders at least one DP strictly:Combined order from the following AFS and order.
SUM1(x1) = SUM1(x1)
cons(x1, x2) = cons(x1, x2)
rands(x1, x2) = rands(x1, x2)
0 = 0
done(x1) = x1
s(x1) = x1
::(x1, x2) = x2
rand(x1) = x1
sum1(x1) = x1
nil = nil
tests(x1) = tests
true = true
sum2(x1, x2) = sum2(x1, x2)
+(x1, x2) = +(x1, x2)
eq(x1, x2) = x2
and(x1, x2) = and(x1)
test(x1) = x1
f(x1) = f(x1)
g(x1) = x1
Recursive path order with status [RPO].
Quasi-Precedence:
SUM11 > true
tests > rands2 > 0 > true
tests > nil > 0 > true
tests > and1 > true
sum22 > [cons2, +2] > true
f1 > true
SUM11: [1]
cons2: multiset
rands2: [2,1]
0: multiset
nil: multiset
tests: []
true: multiset
sum22: [1,2]
+2: multiset
and1: [1]
f1: multiset
SUM10(cons0(x, y)) → SUM10(y)
rands0(00, y) → done0(y)
rands0(s0(x), y) → rands0(x, ::(y))
sum10(nil0) → 00
tests → true0
sum20(cons0(x, y), z) → sum20(y, +0(x, z))
rand0(x) → rand0(s0(x))
eq(x) → true0
sum10(cons0(x, y)) → +0(x, sum10(y))
sum20(nil0, z) → z
tests → and(test0(rands0(rand0(00), nil0)))
+0(s0(x), y) → s0(+0(x, y))
test0(done0(y)) → eq(g0(y))
+0(00, y) → y
rand0(x) → x
SUM10(cons0(x, y)) → SUM10(y)
sum20(cons0(x, y), z) → sum20(y, +0(x, z))
sum10(cons0(x, y)) → +0(x, sum10(y))
sum20(nil0, z) → z
POL(+0(x1, x2)) = x1 + x2
POL(00) = 0
POL(::(x1)) = x1
POL(SUM10(x1)) = x1
POL(and(x1)) = x1
POL(cons0(x1, x2)) = 1 + x1 + 2·x2
POL(done0(x1)) = 2·x1
POL(eq(x1)) = 2·x1
POL(g0(x1)) = x1
POL(nil0) = 0
POL(rand0(x1)) = x1
POL(rands0(x1, x2)) = x1 + 2·x2
POL(s0(x1)) = x1
POL(sum10(x1)) = x1
POL(sum20(x1, x2)) = 2 + 2·x1 + x2
POL(test0(x1)) = x1
POL(tests) = 0
POL(true0) = 0
rands0(00, y) → done0(y)
rands0(s0(x), y) → rands0(x, ::(y))
sum10(nil0) → 00
tests → true0
rand0(x) → rand0(s0(x))
eq(x) → true0
tests → and(test0(rands0(rand0(00), nil0)))
+0(s0(x), y) → s0(+0(x, y))
test0(done0(y)) → eq(g0(y))
+0(00, y) → y
rand0(x) → x
rands(0, y) → done(y)
rands(s(x), y) → RANDS(x, ::(rand(0), y))
rands(s(x), y) → rands(x, ::(rand(0), y))
sum1(nil) → 0
tests(0) → true
sum2(cons(x, y), z) → sum2(y, +(x, z))
eq(x, x) → true
sum1(cons(x, y)) → +(x, sum1(y))
sum2(nil, z) → z
tests(s(x)) → and(test(rands(rand(0), nil)), x)
+(s(x), y) → s(+(x, y))
test(done(y)) → eq(f(y), g(y))
+(0, y) → y
rand(x) → rand(s(x))
rand(x) → x
Furthermore, We use an argument filter [LPAR04].
Filtering:rands_2 =
true =
done_1 =
sum1_1 =
and_2 = 1
RANDS_2 = 1
rand_1 =
g_1 = 0
nil =
s_1 =
eq_2 = 0
+_2 =
::_2 = 0
tests_1 =
f_1 =
0 =
cons_2 =
test_1 = 0
sum2_2 =
Found this filtering by looking at the following order that orders at least one DP strictly:Combined order from the following AFS and order.
RANDS(x1, x2) = RANDS(x1)
s(x1) = s(x1)
::(x1, x2) = x2
rand(x1) = rand(x1)
0 = 0
rands(x1, x2) = rands(x1, x2)
done(x1) = x1
sum1(x1) = x1
nil = nil
tests(x1) = tests(x1)
true = true
sum2(x1, x2) = sum2(x1, x2)
cons(x1, x2) = cons(x1, x2)
+(x1, x2) = +(x1, x2)
eq(x1, x2) = x2
and(x1, x2) = x1
test(x1) = test
f(x1) = f(x1)
g(x1) = g
Recursive path order with status [RPO].
Quasi-Precedence:
rand1 > true
nil > 0 > true
tests1 > rands2 > true
tests1 > [test, g] > true
[sum22, cons2] > +2 > s1 > RANDS1 > true
f1 > true
RANDS1: multiset
s1: multiset
rand1: multiset
0: multiset
rands2: [1,2]
nil: multiset
tests1: multiset
true: multiset
sum22: [1,2]
cons2: multiset
+2: multiset
test: multiset
f1: multiset
g: multiset
RANDS(s0(x)) → RANDS(x)
rands0(00, y) → done0(y)
rands0(s0(x), y) → rands0(x, ::(y))
sum10(nil0) → 00
tests0(00) → true0
sum20(cons0(x, y), z) → sum20(y, +0(x, z))
rand0(x) → rand0(s0(x))
eq(x) → true0
sum10(cons0(x, y)) → +0(x, sum10(y))
sum20(nil0, z) → z
tests0(s0(x)) → and(test)
+0(s0(x), y) → s0(+0(x, y))
test → eq(g)
+0(00, y) → y
rand0(x) → x
tests0(00) → true0
sum20(cons0(x, y), z) → sum20(y, +0(x, z))
sum10(cons0(x, y)) → +0(x, sum10(y))
sum20(nil0, z) → z
tests0(s0(x)) → and(test)
rand0(x) → x
POL(+0(x1, x2)) = x1 + x2
POL(00) = 0
POL(::(x1)) = x1
POL(RANDS(x1)) = x1
POL(and(x1)) = x1
POL(cons0(x1, x2)) = 1 + x1 + x2
POL(done0(x1)) = x1
POL(eq(x1)) = 2·x1
POL(g) = 0
POL(nil0) = 0
POL(rand0(x1)) = 2 + x1
POL(rands0(x1, x2)) = x1 + 2·x2
POL(s0(x1)) = x1
POL(sum10(x1)) = x1
POL(sum20(x1, x2)) = 1 + 2·x1 + x2
POL(test) = 0
POL(tests0(x1)) = 2 + x1
POL(true0) = 0
RANDS(s0(x)) → RANDS(x)
rands0(00, y) → done0(y)
rands0(s0(x), y) → rands0(x, ::(y))
sum10(nil0) → 00
rand0(x) → rand0(s0(x))
eq(x) → true0
+0(s0(x), y) → s0(+0(x, y))
test → eq(g)
+0(00, y) → y
rands0(00, y) → done0(y)
test → eq(g)
+0(00, y) → y
POL(+0(x1, x2)) = 1 + x1 + x2
POL(00) = 2
POL(::(x1)) = x1
POL(RANDS(x1)) = x1
POL(done0(x1)) = x1
POL(eq(x1)) = x1
POL(g) = 0
POL(nil0) = 1
POL(rand0(x1)) = x1
POL(rands0(x1, x2)) = 2·x1 + 2·x2
POL(s0(x1)) = x1
POL(sum10(x1)) = 2·x1
POL(test) = 2
POL(true0) = 0
RANDS(s0(x)) → RANDS(x)
rands0(s0(x), y) → rands0(x, ::(y))
sum10(nil0) → 00
rand0(x) → rand0(s0(x))
eq(x) → true0
+0(s0(x), y) → s0(+0(x, y))
eq(x) → true0
POL(+0(x1, x2)) = x1 + x2
POL(00) = 0
POL(::(x1)) = x1
POL(RANDS(x1)) = x1
POL(eq(x1)) = 2 + x1
POL(nil0) = 0
POL(rand0(x1)) = x1
POL(rands0(x1, x2)) = x1 + 2·x2
POL(s0(x1)) = x1
POL(sum10(x1)) = x1
POL(true0) = 1
RANDS(s0(x)) → RANDS(x)
rands0(s0(x), y) → rands0(x, ::(y))
sum10(nil0) → 00
rand0(x) → rand0(s0(x))
+0(s0(x), y) → s0(+0(x, y))
sum10(nil0) → 00
POL(+0(x1, x2)) = x1 + x2
POL(00) = 0
POL(::(x1)) = x1
POL(RANDS(x1)) = x1
POL(nil0) = 1
POL(rand0(x1)) = x1
POL(rands0(x1, x2)) = 2·x1 + 2·x2
POL(s0(x1)) = x1
POL(sum10(x1)) = x1
RANDS(s0(x)) → RANDS(x)
rands0(s0(x), y) → rands0(x, ::(y))
rand0(x) → rand0(s0(x))
+0(s0(x), y) → s0(+0(x, y))
The following pairs can be oriented strictly and are deleted.
The remaining pairs can at least be oriented weakly.
RANDS(s0(x)) → RANDS(x)
POL( rands0(x1, x2) ) = 2x1 + 2 |
POL( s0(x1) ) = x1 + 1 |
POL( ::(x1) ) = 0 |
POL( rand0(x1) ) = max{0, -2} |
POL( +0(x1, x2) ) = x1 + 2 |
POL( RANDS(x1) ) = 2x1 |
rands0(s0(x), y) → rands0(x, ::(y))
rand0(x) → rand0(s0(x))
+0(s0(x), y) → s0(+0(x, y))
rands0(s0(x), y) → rands0(x, ::(y))
rand0(x) → rand0(s0(x))
+0(s0(x), y) → s0(+0(x, y))