YES
0 RelTRS
↳1 RelTRStoRelADPProof (⇔, 0 ms)
↳2 RelADPP
↳3 RelADPDepGraphProof (⇔, 0 ms)
↳4 AND
↳5 RelADPP
↳6 RelADPCleverAfsProof (⇒, 105 ms)
↳7 QDP
↳8 MRRProof (⇔, 0 ms)
↳9 QDP
↳10 PisEmptyProof (⇔, 0 ms)
↳11 YES
↳12 RelADPP
↳13 RelADPCleverAfsProof (⇒, 103 ms)
↳14 QDP
↳15 MRRProof (⇔, 0 ms)
↳16 QDP
↳17 DependencyGraphProof (⇔, 0 ms)
↳18 TRUE
↳19 RelADPP
↳20 RelADPReductionPairProof (⇔, 96 ms)
↳21 RelADPP
↳22 DAbsisEmptyProof (⇔, 0 ms)
↳23 YES
↳24 RelADPP
↳25 RelADPReductionPairProof (⇔, 98 ms)
↳26 RelADPP
↳27 DAbsisEmptyProof (⇔, 0 ms)
↳28 YES
↳29 RelADPP
↳30 RelADPReductionPairProof (⇔, 119 ms)
↳31 RelADPP
↳32 DAbsisEmptyProof (⇔, 0 ms)
↳33 YES
↳34 RelADPP
↳35 RelADPReductionPairProof (⇔, 95 ms)
↳36 RelADPP
↳37 DAbsisEmptyProof (⇔, 0 ms)
↳38 YES
eq(0, 0) → true
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
rm(n, nil) → nil
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
ifrm(true, n, cons(m, x)) → rm(n, x)
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
purge(nil) → nil
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, xs) → cons(x, xs)
purge(cons(x, xs)) → purge(consSwap(x, xs))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
We upgrade the RelTRS problem to an equivalent Relative ADP Problem [IJCAR24].
eq(0, 0) → true
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → EQ(x, y)
rm(n, nil) → nil
rm(n, cons(m, x)) → IFRM(eq(n, m), n, cons(m, x))
rm(n, cons(m, x)) → ifrm(EQ(n, m), n, cons(m, x))
ifrm(true, n, cons(m, x)) → RM(n, x)
ifrm(false, n, cons(m, x)) → cons(m, RM(n, x))
purge(nil) → nil
purge(cons(n, x)) → cons(n, PURGE(rm(n, x)))
purge(cons(n, x)) → cons(n, purge(RM(n, x)))
consSwap(x, xs) → cons(x, xs)
purge(cons(x, xs)) → PURGE(CONSSWAP(x, xs))
consSwap(x, cons(y, xs)) → cons(y, CONSSWAP(x, xs))
We use the relative dependency graph processor [IJCAR24].
The approximation of the Relative Dependency Graph contains:
3 SCCs with nodes from P_abs,
3 Lassos,
Result: This relative DT problem is equivalent to 6 subproblems.
eq(s(x), s(y)) → EQ(x, y)
ifrm(true, n, cons(m, x)) → rm(n, x)
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
purge(cons(x, xs)) → purge(consSwap(x, xs))
eq(0, 0) → true
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, nil) → nil
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
Furthermore, We use an argument filter [LPAR04].
Filtering:true =
ifrm_3 = 0, 1
xs =
rm_2 = 0, 1
false =
nil =
s_1 =
eq_2 = 0
0 =
purge_1 =
cons_2 = 0, 1
consSwap_2 = 0
EQ_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.
EQ(x1, x2) = EQ(x1, x2)
s(x1) = s(x1)
rm(x1, x2) = rm
cons(x1, x2) = cons
ifrm(x1, x2, x3) = x3
eq(x1, x2) = eq(x2)
purge(x1) = purge(x1)
xs = xs
consSwap(x1, x2) = x2
nil = nil
true = true
0 = 0
false = false
Recursive path order with status [RPO].
Quasi-Precedence:
EQ2 > [nil, true, 0, false]
s1 > eq1 > [nil, true, 0, false]
purge1 > [rm, cons, xs] > [nil, true, 0, false]
EQ2: [2,1]
s1: multiset
rm: []
cons: []
eq1: multiset
purge1: multiset
xs: multiset
nil: multiset
true: multiset
0: multiset
false: multiset
EQ0(s0(x), s0(y)) → EQ0(x, y)
ifrm(cons) → rm
consSwap(xs0) → cons
eq(s0(x)) → false0
eq(00) → false0
eq(s0(y)) → eq(y)
purge0(cons) → purge0(consSwap(xs0))
purge0(cons) → cons
consSwap(cons) → cons
rm → ifrm(cons)
purge0(nil0) → nil0
ifrm(cons) → cons
eq(00) → true0
rm → nil0
EQ0(s0(x), s0(y)) → EQ0(x, y)
eq(s0(x)) → false0
eq(00) → false0
eq(s0(y)) → eq(y)
purge0(cons) → cons
consSwap(cons) → cons
purge0(nil0) → nil0
ifrm(cons) → cons
eq(00) → true0
rm → nil0
POL(00) = 2
POL(EQ0(x1, x2)) = x1 + x2
POL(cons) = 1
POL(consSwap(x1)) = 1 + x1
POL(eq(x1)) = 2 + 2·x1
POL(false0) = 1
POL(ifrm(x1)) = 2·x1
POL(nil0) = 1
POL(purge0(x1)) = 2 + 2·x1
POL(rm) = 2
POL(s0(x1)) = 1 + x1
POL(true0) = 1
POL(xs0) = 0
ifrm(cons) → rm
consSwap(xs0) → cons
purge0(cons) → purge0(consSwap(xs0))
rm → ifrm(cons)
ifrm(false, n, cons(m, x)) → cons(m, RM(n, x))
ifrm(true, n, cons(m, x)) → RM(n, x)
rm(n, cons(m, x)) → IFRM(eq(n, m), n, cons(m, x))
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(x, xs)) → purge(consSwap(x, xs))
eq(0, 0) → true
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, nil) → nil
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
Furthermore, We use an argument filter [LPAR04].
Filtering:true =
ifrm_3 = 0, 1
xs =
rm_2 = 0
IFRM_3 = 0, 1
false =
nil =
s_1 =
eq_2 = 0, 1
RM_2 = 0
0 =
purge_1 =
cons_2 = 0
consSwap_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.
RM(x1, x2) = RM(x2)
cons(x1, x2) = cons(x2)
IFRM(x1, x2, x3) = x3
eq(x1, x2) = eq
false = false
true = true
0 = 0
s(x1) = x1
purge(x1) = purge(x1)
rm(x1, x2) = x2
ifrm(x1, x2, x3) = x3
nil = nil
xs = xs
consSwap(x1, x2) = consSwap(x2)
Recursive path order with status [RPO].
Quasi-Precedence:
[RM1, cons1, purge1, consSwap1] > [eq, false] > true
[RM1, cons1, purge1, consSwap1] > nil
[RM1, cons1, purge1, consSwap1] > xs
RM1: [1]
cons1: [1]
eq: multiset
false: multiset
true: multiset
0: multiset
purge1: [1]
nil: multiset
xs: multiset
consSwap1: [1]
RM(cons(x)) → IFRM(cons(x))
IFRM(cons(x)) → RM(x)
ifrm(cons(x)) → rm(x)
consSwap(xs0) → cons(xs0)
eq → false0
eq → eq
purge0(cons(xs0)) → purge0(consSwap(xs0))
purge0(cons(x)) → cons(purge0(rm(x)))
consSwap(cons(xs0)) → cons(consSwap(xs0))
rm(cons(x)) → ifrm(cons(x))
purge0(nil0) → nil0
ifrm(cons(x)) → cons(rm(x))
eq → true0
rm(nil0) → nil0
IFRM(cons(x)) → RM(x)
ifrm(cons(x)) → rm(x)
eq → false0
eq → true0
POL(IFRM(x1)) = x1
POL(RM(x1)) = x1
POL(cons(x1)) = 1 + 2·x1
POL(consSwap(x1)) = 1 + 2·x1
POL(eq) = 2
POL(false0) = 1
POL(ifrm(x1)) = x1
POL(nil0) = 0
POL(purge0(x1)) = x1
POL(rm(x1)) = x1
POL(true0) = 0
POL(xs0) = 1
RM(cons(x)) → IFRM(cons(x))
consSwap(xs0) → cons(xs0)
eq → eq
purge0(cons(xs0)) → purge0(consSwap(xs0))
purge0(cons(x)) → cons(purge0(rm(x)))
consSwap(cons(xs0)) → cons(consSwap(xs0))
rm(cons(x)) → ifrm(cons(x))
purge0(nil0) → nil0
ifrm(cons(x)) → cons(rm(x))
rm(nil0) → nil0
purge(cons(n, x)) → cons(n, PURGE(rm(n, x)))
ifrm(true, n, cons(m, x)) → rm(n, x)
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
purge(cons(x, xs)) → PURGE(CONSSWAP(x, xs))
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
eq(0, 0) → true
rm(n, nil) → nil
We use the reduction pair processor [IJCAR24].
The following rules can be oriented strictly (l^# > ann(r))
and therefore we can remove all of its annotations in the right-hand side:
Absolute ADPs:
purge(cons(n, x)) → cons(n, PURGE(rm(n, x)))
ifrm(true, n, cons(m, x)) → rm(n, x)
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
eq(0, 0) → true
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, nil) → nil
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
POL(0) = 1
POL(CONSSWAP(x1, x2)) = 0
POL(EQ(x1, x2)) = 2 + 2·x1·x2
POL(IFRM(x1, x2, x3)) = 2 + x1 + 2·x2
POL(PURGE(x1)) = 2 + 3·x1
POL(RM(x1, x2)) = 2 + 2·x2
POL(cons(x1, x2)) = 3 + 2·x1 + x2
POL(consSwap(x1, x2)) = 3 + 2·x1 + x2
POL(eq(x1, x2)) = 0
POL(false) = 0
POL(ifrm(x1, x2, x3)) = x1 + x3
POL(nil) = 0
POL(purge(x1)) = x1
POL(rm(x1, x2)) = x2
POL(s(x1)) = 3 + 3·x1
POL(true) = 0
POL(xs) = 2
ifrm(true, n, cons(m, x)) → rm(n, x)
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
purge(cons(x, xs)) → PURGE(CONSSWAP(x, xs))
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
eq(0, 0) → true
rm(n, nil) → nil
purge(cons(n, x)) → cons(n, purge(RM(n, x)))
ifrm(true, n, cons(m, x)) → rm(n, x)
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
purge(cons(x, xs)) → PURGE(CONSSWAP(x, xs))
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
eq(0, 0) → true
rm(n, nil) → nil
We use the reduction pair processor [IJCAR24].
The following rules can be oriented strictly (l^# > ann(r))
and therefore we can remove all of its annotations in the right-hand side:
Absolute ADPs:
purge(cons(n, x)) → cons(n, purge(RM(n, x)))
ifrm(true, n, cons(m, x)) → rm(n, x)
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
eq(0, 0) → true
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, nil) → nil
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
POL(0) = 3
POL(CONSSWAP(x1, x2)) = 0
POL(EQ(x1, x2)) = 2·x1·x2
POL(IFRM(x1, x2, x3)) = 2 + 2·x2
POL(PURGE(x1)) = 2 + 3·x1
POL(RM(x1, x2)) = 1
POL(cons(x1, x2)) = 2
POL(consSwap(x1, x2)) = 1 + x2
POL(eq(x1, x2)) = 3
POL(false) = 2
POL(ifrm(x1, x2, x3)) = x1 + 3·x2
POL(nil) = 0
POL(purge(x1)) = 2 + 3·x1
POL(rm(x1, x2)) = 3 + 3·x1
POL(s(x1)) = 3 + 3·x1
POL(true) = 3
POL(xs) = 1
ifrm(true, n, cons(m, x)) → rm(n, x)
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
purge(cons(x, xs)) → PURGE(CONSSWAP(x, xs))
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
eq(0, 0) → true
rm(n, nil) → nil
purge(nil) → nil
ifrm(true, n, cons(m, x)) → rm(n, x)
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
eq(0, 0) → true
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, nil) → nil
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(cons(x, xs)) → PURGE(CONSSWAP(x, xs))
We use the reduction pair processor [IJCAR24].
The following rules can be oriented strictly (l^# > ann(r))
and therefore we can remove all of its annotations in the right-hand side:
Absolute ADPs:
purge(nil) → nil
ifrm(true, n, cons(m, x)) → rm(n, x)
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
eq(0, 0) → true
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, nil) → nil
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
POL(0) = 2
POL(CONSSWAP(x1, x2)) = 0
POL(EQ(x1, x2)) = 2·x1·x2
POL(IFRM(x1, x2, x3)) = 2 + 2·x1 + 2·x2
POL(PURGE(x1)) = 1 + x1
POL(RM(x1, x2)) = 2 + 2·x1
POL(cons(x1, x2)) = 1 + 3·x2
POL(consSwap(x1, x2)) = 1 + 3·x2
POL(eq(x1, x2)) = 0
POL(false) = 0
POL(ifrm(x1, x2, x3)) = 3·x1 + x3
POL(nil) = 0
POL(purge(x1)) = 1 + 3·x1
POL(rm(x1, x2)) = x2
POL(s(x1)) = 1 + 3·x1
POL(true) = 0
POL(xs) = 2
ifrm(true, n, cons(m, x)) → rm(n, x)
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
purge(cons(x, xs)) → PURGE(CONSSWAP(x, xs))
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
eq(0, 0) → true
rm(n, nil) → nil
purge(cons(n, x)) → cons(n, PURGE(rm(n, x)))
ifrm(true, n, cons(m, x)) → rm(n, x)
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
purge(cons(x, xs)) → PURGE(CONSSWAP(x, xs))
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
eq(0, 0) → true
rm(n, nil) → nil
We use the reduction pair processor [IJCAR24].
The following rules can be oriented strictly (l^# > ann(r))
and therefore we can remove all of its annotations in the right-hand side:
Absolute ADPs:
purge(cons(n, x)) → cons(n, PURGE(rm(n, x)))
ifrm(true, n, cons(m, x)) → rm(n, x)
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
eq(0, 0) → true
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, nil) → nil
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
POL(0) = 1
POL(CONSSWAP(x1, x2)) = 0
POL(EQ(x1, x2)) = 2 + 2·x1·x2
POL(IFRM(x1, x2, x3)) = 2 + x1 + 2·x2
POL(PURGE(x1)) = 2 + 3·x1
POL(RM(x1, x2)) = 2 + 2·x2
POL(cons(x1, x2)) = 3 + 2·x1 + x2
POL(consSwap(x1, x2)) = 3 + 2·x1 + x2
POL(eq(x1, x2)) = 0
POL(false) = 0
POL(ifrm(x1, x2, x3)) = x1 + x3
POL(nil) = 0
POL(purge(x1)) = x1
POL(rm(x1, x2)) = x2
POL(s(x1)) = 3 + 3·x1
POL(true) = 0
POL(xs) = 2
ifrm(true, n, cons(m, x)) → rm(n, x)
consSwap(x, xs) → cons(x, xs)
eq(0, s(x)) → false
eq(s(x), 0) → false
eq(s(x), s(y)) → eq(x, y)
purge(cons(n, x)) → cons(n, purge(rm(n, x)))
consSwap(x, cons(y, xs)) → cons(y, consSwap(x, xs))
rm(n, cons(m, x)) → ifrm(eq(n, m), n, cons(m, x))
purge(nil) → nil
purge(cons(x, xs)) → PURGE(CONSSWAP(x, xs))
ifrm(false, n, cons(m, x)) → cons(m, rm(n, x))
eq(0, 0) → true
rm(n, nil) → nil