/export/starexec/sandbox2/solver/bin/starexec_run_FirstOrder /export/starexec/sandbox2/benchmark/theBenchmark.xml /export/starexec/sandbox2/output/output_files -------------------------------------------------------------------------------- YES We consider the system theBenchmark. We are asked to determine termination of the following first-order TRS. !6220!6220 : [o * o] --> o U11 : [o * o] --> o U12 : [o] --> o U21 : [o * o * o] --> o U22 : [o * o] --> o U23 : [o] --> o U31 : [o * o] --> o U32 : [o] --> o U41 : [o * o * o] --> o U42 : [o * o] --> o U43 : [o] --> o U51 : [o * o * o] --> o U52 : [o * o] --> o U53 : [o] --> o U61 : [o * o] --> o U62 : [o] --> o U71 : [o * o] --> o U72 : [o] --> o a : [] --> o active : [o] --> o and : [o * o] --> o e : [] --> o i : [] --> o isList : [o] --> o isNeList : [o] --> o isNePal : [o] --> o isPal : [o] --> o isPalListKind : [o] --> o isQid : [o] --> o mark : [o] --> o nil : [] --> o o : [] --> o ok : [o] --> o proper : [o] --> o top : [o] --> o tt : [] --> o u : [] --> o active(!6220!6220(!6220!6220(X, Y), Z)) => mark(!6220!6220(X, !6220!6220(Y, Z))) active(!6220!6220(X, nil)) => mark(X) active(!6220!6220(nil, X)) => mark(X) active(U11(tt, X)) => mark(U12(isNeList(X))) active(U12(tt)) => mark(tt) active(U21(tt, X, Y)) => mark(U22(isList(X), Y)) active(U22(tt, X)) => mark(U23(isList(X))) active(U23(tt)) => mark(tt) active(U31(tt, X)) => mark(U32(isQid(X))) active(U32(tt)) => mark(tt) active(U41(tt, X, Y)) => mark(U42(isList(X), Y)) active(U42(tt, X)) => mark(U43(isNeList(X))) active(U43(tt)) => mark(tt) active(U51(tt, X, Y)) => mark(U52(isNeList(X), Y)) active(U52(tt, X)) => mark(U53(isList(X))) active(U53(tt)) => mark(tt) active(U61(tt, X)) => mark(U62(isQid(X))) active(U62(tt)) => mark(tt) active(U71(tt, X)) => mark(U72(isNePal(X))) active(U72(tt)) => mark(tt) active(and(tt, X)) => mark(X) active(isList(X)) => mark(U11(isPalListKind(X), X)) active(isList(nil)) => mark(tt) active(isList(!6220!6220(X, Y))) => mark(U21(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNeList(X)) => mark(U31(isPalListKind(X), X)) active(isNeList(!6220!6220(X, Y))) => mark(U41(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNeList(!6220!6220(X, Y))) => mark(U51(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNePal(X)) => mark(U61(isPalListKind(X), X)) active(isNePal(!6220!6220(X, !6220!6220(Y, X)))) => mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) active(isPal(X)) => mark(U71(isPalListKind(X), X)) active(isPal(nil)) => mark(tt) active(isPalListKind(a)) => mark(tt) active(isPalListKind(e)) => mark(tt) active(isPalListKind(i)) => mark(tt) active(isPalListKind(nil)) => mark(tt) active(isPalListKind(o)) => mark(tt) active(isPalListKind(u)) => mark(tt) active(isPalListKind(!6220!6220(X, Y))) => mark(and(isPalListKind(X), isPalListKind(Y))) active(isQid(a)) => mark(tt) active(isQid(e)) => mark(tt) active(isQid(i)) => mark(tt) active(isQid(o)) => mark(tt) active(isQid(u)) => mark(tt) active(!6220!6220(X, Y)) => !6220!6220(active(X), Y) active(!6220!6220(X, Y)) => !6220!6220(X, active(Y)) active(U11(X, Y)) => U11(active(X), Y) active(U12(X)) => U12(active(X)) active(U21(X, Y, Z)) => U21(active(X), Y, Z) active(U22(X, Y)) => U22(active(X), Y) active(U23(X)) => U23(active(X)) active(U31(X, Y)) => U31(active(X), Y) active(U32(X)) => U32(active(X)) active(U41(X, Y, Z)) => U41(active(X), Y, Z) active(U42(X, Y)) => U42(active(X), Y) active(U43(X)) => U43(active(X)) active(U51(X, Y, Z)) => U51(active(X), Y, Z) active(U52(X, Y)) => U52(active(X), Y) active(U53(X)) => U53(active(X)) active(U61(X, Y)) => U61(active(X), Y) active(U62(X)) => U62(active(X)) active(U71(X, Y)) => U71(active(X), Y) active(U72(X)) => U72(active(X)) active(and(X, Y)) => and(active(X), Y) !6220!6220(mark(X), Y) => mark(!6220!6220(X, Y)) !6220!6220(X, mark(Y)) => mark(!6220!6220(X, Y)) U11(mark(X), Y) => mark(U11(X, Y)) U12(mark(X)) => mark(U12(X)) U21(mark(X), Y, Z) => mark(U21(X, Y, Z)) U22(mark(X), Y) => mark(U22(X, Y)) U23(mark(X)) => mark(U23(X)) U31(mark(X), Y) => mark(U31(X, Y)) U32(mark(X)) => mark(U32(X)) U41(mark(X), Y, Z) => mark(U41(X, Y, Z)) U42(mark(X), Y) => mark(U42(X, Y)) U43(mark(X)) => mark(U43(X)) U51(mark(X), Y, Z) => mark(U51(X, Y, Z)) U52(mark(X), Y) => mark(U52(X, Y)) U53(mark(X)) => mark(U53(X)) U61(mark(X), Y) => mark(U61(X, Y)) U62(mark(X)) => mark(U62(X)) U71(mark(X), Y) => mark(U71(X, Y)) U72(mark(X)) => mark(U72(X)) and(mark(X), Y) => mark(and(X, Y)) proper(!6220!6220(X, Y)) => !6220!6220(proper(X), proper(Y)) proper(nil) => ok(nil) proper(U11(X, Y)) => U11(proper(X), proper(Y)) proper(tt) => ok(tt) proper(U12(X)) => U12(proper(X)) proper(isNeList(X)) => isNeList(proper(X)) proper(U21(X, Y, Z)) => U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) => U22(proper(X), proper(Y)) proper(isList(X)) => isList(proper(X)) proper(U23(X)) => U23(proper(X)) proper(U31(X, Y)) => U31(proper(X), proper(Y)) proper(U32(X)) => U32(proper(X)) proper(isQid(X)) => isQid(proper(X)) proper(U41(X, Y, Z)) => U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) => U42(proper(X), proper(Y)) proper(U43(X)) => U43(proper(X)) proper(U51(X, Y, Z)) => U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) => U52(proper(X), proper(Y)) proper(U53(X)) => U53(proper(X)) proper(U61(X, Y)) => U61(proper(X), proper(Y)) proper(U62(X)) => U62(proper(X)) proper(U71(X, Y)) => U71(proper(X), proper(Y)) proper(U72(X)) => U72(proper(X)) proper(isNePal(X)) => isNePal(proper(X)) proper(and(X, Y)) => and(proper(X), proper(Y)) proper(isPalListKind(X)) => isPalListKind(proper(X)) proper(isPal(X)) => isPal(proper(X)) proper(a) => ok(a) proper(e) => ok(e) proper(i) => ok(i) proper(o) => ok(o) proper(u) => ok(u) !6220!6220(ok(X), ok(Y)) => ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) => ok(U11(X, Y)) U12(ok(X)) => ok(U12(X)) isNeList(ok(X)) => ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) => ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) => ok(U22(X, Y)) isList(ok(X)) => ok(isList(X)) U23(ok(X)) => ok(U23(X)) U31(ok(X), ok(Y)) => ok(U31(X, Y)) U32(ok(X)) => ok(U32(X)) isQid(ok(X)) => ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) => ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) => ok(U42(X, Y)) U43(ok(X)) => ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) => ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) => ok(U52(X, Y)) U53(ok(X)) => ok(U53(X)) U61(ok(X), ok(Y)) => ok(U61(X, Y)) U62(ok(X)) => ok(U62(X)) U71(ok(X), ok(Y)) => ok(U71(X, Y)) U72(ok(X)) => ok(U72(X)) isNePal(ok(X)) => ok(isNePal(X)) and(ok(X), ok(Y)) => ok(and(X, Y)) isPalListKind(ok(X)) => ok(isPalListKind(X)) isPal(ok(X)) => ok(isPal(X)) top(mark(X)) => top(proper(X)) top(ok(X)) => top(active(X)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(!6220!6220(X, Y), Z)) >? mark(!6220!6220(X, !6220!6220(Y, Z))) active(!6220!6220(X, nil)) >? mark(X) active(!6220!6220(nil, X)) >? mark(X) active(U11(tt, X)) >? mark(U12(isNeList(X))) active(U12(tt)) >? mark(tt) active(U21(tt, X, Y)) >? mark(U22(isList(X), Y)) active(U22(tt, X)) >? mark(U23(isList(X))) active(U23(tt)) >? mark(tt) active(U31(tt, X)) >? mark(U32(isQid(X))) active(U32(tt)) >? mark(tt) active(U41(tt, X, Y)) >? mark(U42(isList(X), Y)) active(U42(tt, X)) >? mark(U43(isNeList(X))) active(U43(tt)) >? mark(tt) active(U51(tt, X, Y)) >? mark(U52(isNeList(X), Y)) active(U52(tt, X)) >? mark(U53(isList(X))) active(U53(tt)) >? mark(tt) active(U61(tt, X)) >? mark(U62(isQid(X))) active(U62(tt)) >? mark(tt) active(U71(tt, X)) >? mark(U72(isNePal(X))) active(U72(tt)) >? mark(tt) active(and(tt, X)) >? mark(X) active(isList(X)) >? mark(U11(isPalListKind(X), X)) active(isList(nil)) >? mark(tt) active(isList(!6220!6220(X, Y))) >? mark(U21(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNeList(X)) >? mark(U31(isPalListKind(X), X)) active(isNeList(!6220!6220(X, Y))) >? mark(U41(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNeList(!6220!6220(X, Y))) >? mark(U51(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNePal(X)) >? mark(U61(isPalListKind(X), X)) active(isNePal(!6220!6220(X, !6220!6220(Y, X)))) >? mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) active(isPal(X)) >? mark(U71(isPalListKind(X), X)) active(isPal(nil)) >? mark(tt) active(isPalListKind(a)) >? mark(tt) active(isPalListKind(e)) >? mark(tt) active(isPalListKind(i)) >? mark(tt) active(isPalListKind(nil)) >? mark(tt) active(isPalListKind(o)) >? mark(tt) active(isPalListKind(u)) >? mark(tt) active(isPalListKind(!6220!6220(X, Y))) >? mark(and(isPalListKind(X), isPalListKind(Y))) active(isQid(a)) >? mark(tt) active(isQid(e)) >? mark(tt) active(isQid(i)) >? mark(tt) active(isQid(o)) >? mark(tt) active(isQid(u)) >? mark(tt) active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(mark(X), Y) >? mark(!6220!6220(X, Y)) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U11(mark(X), Y) >? mark(U11(X, Y)) U12(mark(X)) >? mark(U12(X)) U21(mark(X), Y, Z) >? mark(U21(X, Y, Z)) U22(mark(X), Y) >? mark(U22(X, Y)) U23(mark(X)) >? mark(U23(X)) U31(mark(X), Y) >? mark(U31(X, Y)) U32(mark(X)) >? mark(U32(X)) U41(mark(X), Y, Z) >? mark(U41(X, Y, Z)) U42(mark(X), Y) >? mark(U42(X, Y)) U43(mark(X)) >? mark(U43(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U52(mark(X), Y) >? mark(U52(X, Y)) U53(mark(X)) >? mark(U53(X)) U61(mark(X), Y) >? mark(U61(X, Y)) U62(mark(X)) >? mark(U62(X)) U71(mark(X), Y) >? mark(U71(X, Y)) U72(mark(X)) >? mark(U72(X)) and(mark(X), Y) >? mark(and(X, Y)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(nil) >? ok(nil) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(tt) >? ok(tt) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(e) >? ok(e) proper(i) >? ok(i) proper(o) >? ok(o) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(mark(X)) >? top(proper(X)) top(ok(X)) >? top(active(X)) about to try horpo We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[U41(x_1, x_2, x_3)]] = U41(x_3, x_2, x_1) [[U51(x_1, x_2, x_3)]] = U51(x_2, x_1, x_3) [[active(x_1)]] = x_1 [[ok(x_1)]] = x_1 [[proper(x_1)]] = x_1 We choose Lex = {!6220!6220, U41, U51} and Mul = {U11, U12, U21, U22, U23, U31, U32, U42, U43, U52, U53, U61, U62, U71, U72, a, and, e, i, isList, isNeList, isNePal, isPal, isPalListKind, isQid, mark, nil, o, top, tt, u}, and the following precedence: a > !6220!6220 > U51 > U52 > isPal > U71 > nil > U41 > u > e = i = o = tt > U21 > U22 > U42 > isList > U11 > and > isNeList > isNePal > U61 > U31 > U12 = U23 = U32 = U43 = U53 = U62 = U72 = isPalListKind = isQid = mark = top Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: !6220!6220(!6220!6220(X, Y), Z) >= mark(!6220!6220(X, !6220!6220(Y, Z))) !6220!6220(X, nil) > mark(X) !6220!6220(nil, X) > mark(X) U11(tt, X) >= mark(U12(isNeList(X))) U12(tt) >= mark(tt) U21(tt, X, Y) > mark(U22(isList(X), Y)) U22(tt, X) >= mark(U23(isList(X))) U23(tt) >= mark(tt) U31(tt, X) >= mark(U32(isQid(X))) U32(tt) >= mark(tt) U41(tt, X, Y) > mark(U42(isList(X), Y)) U42(tt, X) > mark(U43(isNeList(X))) U43(tt) >= mark(tt) U51(tt, X, Y) > mark(U52(isNeList(X), Y)) U52(tt, X) >= mark(U53(isList(X))) U53(tt) >= mark(tt) U61(tt, X) >= mark(U62(isQid(X))) U62(tt) >= mark(tt) U71(tt, X) >= mark(U72(isNePal(X))) U72(tt) >= mark(tt) and(tt, X) > mark(X) isList(X) > mark(U11(isPalListKind(X), X)) isList(nil) >= mark(tt) isList(!6220!6220(X, Y)) >= mark(U21(and(isPalListKind(X), isPalListKind(Y)), X, Y)) isNeList(X) >= mark(U31(isPalListKind(X), X)) isNeList(!6220!6220(X, Y)) > mark(U41(and(isPalListKind(X), isPalListKind(Y)), X, Y)) isNeList(!6220!6220(X, Y)) >= mark(U51(and(isPalListKind(X), isPalListKind(Y)), X, Y)) isNePal(X) >= mark(U61(isPalListKind(X), X)) isNePal(!6220!6220(X, !6220!6220(Y, X))) >= mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) isPal(X) >= mark(U71(isPalListKind(X), X)) isPal(nil) > mark(tt) isPalListKind(a) >= mark(tt) isPalListKind(e) >= mark(tt) isPalListKind(i) >= mark(tt) isPalListKind(nil) > mark(tt) isPalListKind(o) >= mark(tt) isPalListKind(u) > mark(tt) isPalListKind(!6220!6220(X, Y)) >= mark(and(isPalListKind(X), isPalListKind(Y))) isQid(a) >= mark(tt) isQid(e) >= mark(tt) isQid(i) >= mark(tt) isQid(o) >= mark(tt) isQid(u) >= mark(tt) !6220!6220(X, Y) >= !6220!6220(X, Y) !6220!6220(X, Y) >= !6220!6220(X, Y) U11(X, Y) >= U11(X, Y) U12(X) >= U12(X) U21(X, Y, Z) >= U21(X, Y, Z) U22(X, Y) >= U22(X, Y) U23(X) >= U23(X) U31(X, Y) >= U31(X, Y) U32(X) >= U32(X) U41(X, Y, Z) >= U41(X, Y, Z) U42(X, Y) >= U42(X, Y) U43(X) >= U43(X) U51(X, Y, Z) >= U51(X, Y, Z) U52(X, Y) >= U52(X, Y) U53(X) >= U53(X) U61(X, Y) >= U61(X, Y) U62(X) >= U62(X) U71(X, Y) >= U71(X, Y) U72(X) >= U72(X) and(X, Y) >= and(X, Y) !6220!6220(mark(X), Y) > mark(!6220!6220(X, Y)) !6220!6220(X, mark(Y)) >= mark(!6220!6220(X, Y)) U11(mark(X), Y) > mark(U11(X, Y)) U12(mark(X)) >= mark(U12(X)) U21(mark(X), Y, Z) >= mark(U21(X, Y, Z)) U22(mark(X), Y) > mark(U22(X, Y)) U23(mark(X)) >= mark(U23(X)) U31(mark(X), Y) > mark(U31(X, Y)) U32(mark(X)) >= mark(U32(X)) U41(mark(X), Y, Z) >= mark(U41(X, Y, Z)) U42(mark(X), Y) >= mark(U42(X, Y)) U43(mark(X)) >= mark(U43(X)) U51(mark(X), Y, Z) >= mark(U51(X, Y, Z)) U52(mark(X), Y) >= mark(U52(X, Y)) U53(mark(X)) >= mark(U53(X)) U61(mark(X), Y) >= mark(U61(X, Y)) U62(mark(X)) >= mark(U62(X)) U71(mark(X), Y) > mark(U71(X, Y)) U72(mark(X)) >= mark(U72(X)) and(mark(X), Y) > mark(and(X, Y)) !6220!6220(X, Y) >= !6220!6220(X, Y) nil >= nil U11(X, Y) >= U11(X, Y) tt >= tt U12(X) >= U12(X) isNeList(X) >= isNeList(X) U21(X, Y, Z) >= U21(X, Y, Z) U22(X, Y) >= U22(X, Y) isList(X) >= isList(X) U23(X) >= U23(X) U31(X, Y) >= U31(X, Y) U32(X) >= U32(X) isQid(X) >= isQid(X) U41(X, Y, Z) >= U41(X, Y, Z) U42(X, Y) >= U42(X, Y) U43(X) >= U43(X) U51(X, Y, Z) >= U51(X, Y, Z) U52(X, Y) >= U52(X, Y) U53(X) >= U53(X) U61(X, Y) >= U61(X, Y) U62(X) >= U62(X) U71(X, Y) >= U71(X, Y) U72(X) >= U72(X) isNePal(X) >= isNePal(X) and(X, Y) >= and(X, Y) isPalListKind(X) >= isPalListKind(X) isPal(X) >= isPal(X) a >= a e >= e i >= i o >= o u >= u !6220!6220(X, Y) >= !6220!6220(X, Y) U11(X, Y) >= U11(X, Y) U12(X) >= U12(X) isNeList(X) >= isNeList(X) U21(X, Y, Z) >= U21(X, Y, Z) U22(X, Y) >= U22(X, Y) isList(X) >= isList(X) U23(X) >= U23(X) U31(X, Y) >= U31(X, Y) U32(X) >= U32(X) isQid(X) >= isQid(X) U41(X, Y, Z) >= U41(X, Y, Z) U42(X, Y) >= U42(X, Y) U43(X) >= U43(X) U51(X, Y, Z) >= U51(X, Y, Z) U52(X, Y) >= U52(X, Y) U53(X) >= U53(X) U61(X, Y) >= U61(X, Y) U62(X) >= U62(X) U71(X, Y) >= U71(X, Y) U72(X) >= U72(X) isNePal(X) >= isNePal(X) and(X, Y) >= and(X, Y) isPalListKind(X) >= isPalListKind(X) isPal(X) >= isPal(X) top(mark(X)) >= top(X) top(X) >= top(X) With these choices, we have: 1] !6220!6220(!6220!6220(X, Y), Z) >= mark(!6220!6220(X, !6220!6220(Y, Z))) because [2], by (Star) 2] !6220!6220*(!6220!6220(X, Y), Z) >= mark(!6220!6220(X, !6220!6220(Y, Z))) because !6220!6220 > mark and [3], by (Copy) 3] !6220!6220*(!6220!6220(X, Y), Z) >= !6220!6220(X, !6220!6220(Y, Z)) because [4], [7] and [9], by (Stat) 4] !6220!6220(X, Y) > X because [5], by definition 5] !6220!6220*(X, Y) >= X because [6], by (Select) 6] X >= X by (Meta) 7] !6220!6220*(!6220!6220(X, Y), Z) >= X because [8], by (Select) 8] !6220!6220(X, Y) >= X because [5], by (Star) 9] !6220!6220*(!6220!6220(X, Y), Z) >= !6220!6220(Y, Z) because [10], [13] and [15], by (Stat) 10] !6220!6220(X, Y) > Y because [11], by definition 11] !6220!6220*(X, Y) >= Y because [12], by (Select) 12] Y >= Y by (Meta) 13] !6220!6220*(!6220!6220(X, Y), Z) >= Y because [14], by (Select) 14] !6220!6220(X, Y) >= Y because [11], by (Star) 15] !6220!6220*(!6220!6220(X, Y), Z) >= Z because [16], by (Select) 16] Z >= Z by (Meta) 17] !6220!6220(X, nil) > mark(X) because [18], by definition 18] !6220!6220*(X, nil) >= mark(X) because !6220!6220 > mark and [19], by (Copy) 19] !6220!6220*(X, nil) >= X because [6], by (Select) 20] !6220!6220(nil, X) > mark(X) because [21], by definition 21] !6220!6220*(nil, X) >= mark(X) because !6220!6220 > mark and [22], by (Copy) 22] !6220!6220*(nil, X) >= X because [6], by (Select) 23] U11(tt, X) >= mark(U12(isNeList(X))) because [24], by (Star) 24] U11*(tt, X) >= mark(U12(isNeList(X))) because U11 > mark and [25], by (Copy) 25] U11*(tt, X) >= U12(isNeList(X)) because U11 > U12 and [26], by (Copy) 26] U11*(tt, X) >= isNeList(X) because U11 > isNeList and [27], by (Copy) 27] U11*(tt, X) >= X because [28], by (Select) 28] X >= X by (Meta) 29] U12(tt) >= mark(tt) because U12 = mark, U12 in Mul and [30], by (Fun) 30] tt >= tt by (Fun) 31] U21(tt, X, Y) > mark(U22(isList(X), Y)) because [32], by definition 32] U21*(tt, X, Y) >= mark(U22(isList(X), Y)) because U21 > mark and [33], by (Copy) 33] U21*(tt, X, Y) >= U22(isList(X), Y) because U21 > U22, [34] and [37], by (Copy) 34] U21*(tt, X, Y) >= isList(X) because U21 > isList and [35], by (Copy) 35] U21*(tt, X, Y) >= X because [36], by (Select) 36] X >= X by (Meta) 37] U21*(tt, X, Y) >= Y because [38], by (Select) 38] Y >= Y by (Meta) 39] U22(tt, X) >= mark(U23(isList(X))) because [40], by (Star) 40] U22*(tt, X) >= mark(U23(isList(X))) because U22 > mark and [41], by (Copy) 41] U22*(tt, X) >= U23(isList(X)) because U22 > U23 and [42], by (Copy) 42] U22*(tt, X) >= isList(X) because U22 > isList and [43], by (Copy) 43] U22*(tt, X) >= X because [38], by (Select) 44] U23(tt) >= mark(tt) because U23 = mark, U23 in Mul and [30], by (Fun) 45] U31(tt, X) >= mark(U32(isQid(X))) because [46], by (Star) 46] U31*(tt, X) >= mark(U32(isQid(X))) because U31 > mark and [47], by (Copy) 47] U31*(tt, X) >= U32(isQid(X)) because U31 > U32 and [48], by (Copy) 48] U31*(tt, X) >= isQid(X) because U31 > isQid and [49], by (Copy) 49] U31*(tt, X) >= X because [28], by (Select) 50] U32(tt) >= mark(tt) because U32 = mark, U32 in Mul and [30], by (Fun) 51] U41(tt, X, Y) > mark(U42(isList(X), Y)) because [52], by definition 52] U41*(tt, X, Y) >= mark(U42(isList(X), Y)) because U41 > mark and [53], by (Copy) 53] U41*(tt, X, Y) >= U42(isList(X), Y) because U41 > U42, [54] and [56], by (Copy) 54] U41*(tt, X, Y) >= isList(X) because U41 > isList and [55], by (Copy) 55] U41*(tt, X, Y) >= X because [36], by (Select) 56] U41*(tt, X, Y) >= Y because [38], by (Select) 57] U42(tt, X) > mark(U43(isNeList(X))) because [58], by definition 58] U42*(tt, X) >= mark(U43(isNeList(X))) because U42 > mark and [59], by (Copy) 59] U42*(tt, X) >= U43(isNeList(X)) because U42 > U43 and [60], by (Copy) 60] U42*(tt, X) >= isNeList(X) because U42 > isNeList and [61], by (Copy) 61] U42*(tt, X) >= X because [38], by (Select) 62] U43(tt) >= mark(tt) because U43 = mark, U43 in Mul and [30], by (Fun) 63] U51(tt, X, Y) > mark(U52(isNeList(X), Y)) because [64], by definition 64] U51*(tt, X, Y) >= mark(U52(isNeList(X), Y)) because U51 > mark and [65], by (Copy) 65] U51*(tt, X, Y) >= U52(isNeList(X), Y) because U51 > U52, [66] and [68], by (Copy) 66] U51*(tt, X, Y) >= isNeList(X) because U51 > isNeList and [67], by (Copy) 67] U51*(tt, X, Y) >= X because [36], by (Select) 68] U51*(tt, X, Y) >= Y because [38], by (Select) 69] U52(tt, X) >= mark(U53(isList(X))) because [70], by (Star) 70] U52*(tt, X) >= mark(U53(isList(X))) because U52 > mark and [71], by (Copy) 71] U52*(tt, X) >= U53(isList(X)) because U52 > U53 and [72], by (Copy) 72] U52*(tt, X) >= isList(X) because U52 > isList and [73], by (Copy) 73] U52*(tt, X) >= X because [38], by (Select) 74] U53(tt) >= mark(tt) because U53 = mark, U53 in Mul and [30], by (Fun) 75] U61(tt, X) >= mark(U62(isQid(X))) because [76], by (Star) 76] U61*(tt, X) >= mark(U62(isQid(X))) because U61 > mark and [77], by (Copy) 77] U61*(tt, X) >= U62(isQid(X)) because U61 > U62 and [78], by (Copy) 78] U61*(tt, X) >= isQid(X) because U61 > isQid and [79], by (Copy) 79] U61*(tt, X) >= X because [28], by (Select) 80] U62(tt) >= mark(tt) because U62 = mark, U62 in Mul and [30], by (Fun) 81] U71(tt, X) >= mark(U72(isNePal(X))) because [82], by (Star) 82] U71*(tt, X) >= mark(U72(isNePal(X))) because U71 > mark and [83], by (Copy) 83] U71*(tt, X) >= U72(isNePal(X)) because U71 > U72 and [84], by (Copy) 84] U71*(tt, X) >= isNePal(X) because U71 > isNePal and [85], by (Copy) 85] U71*(tt, X) >= X because [28], by (Select) 86] U72(tt) >= mark(tt) because U72 = mark, U72 in Mul and [30], by (Fun) 87] and(tt, X) > mark(X) because [88], by definition 88] and*(tt, X) >= mark(X) because and > mark and [89], by (Copy) 89] and*(tt, X) >= X because [6], by (Select) 90] isList(X) > mark(U11(isPalListKind(X), X)) because [91], by definition 91] isList*(X) >= mark(U11(isPalListKind(X), X)) because isList > mark and [92], by (Copy) 92] isList*(X) >= U11(isPalListKind(X), X) because isList > U11, [93] and [94], by (Copy) 93] isList*(X) >= isPalListKind(X) because isList > isPalListKind and [94], by (Copy) 94] isList*(X) >= X because [28], by (Select) 95] isList(nil) >= mark(tt) because [96], by (Star) 96] isList*(nil) >= mark(tt) because [97], by (Select) 97] nil >= mark(tt) because [98], by (Star) 98] nil* >= mark(tt) because nil > mark and [99], by (Copy) 99] nil* >= tt because nil > tt, by (Copy) 100] isList(!6220!6220(X, Y)) >= mark(U21(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because [101], by (Star) 101] isList*(!6220!6220(X, Y)) >= mark(U21(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because [102], by (Select) 102] !6220!6220(X, Y) >= mark(U21(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because [103], by (Star) 103] !6220!6220*(X, Y) >= mark(U21(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because !6220!6220 > mark and [104], by (Copy) 104] !6220!6220*(X, Y) >= U21(and(isPalListKind(X), isPalListKind(Y)), X, Y) because !6220!6220 > U21, [105], [107] and [109], by (Copy) 105] !6220!6220*(X, Y) >= and(isPalListKind(X), isPalListKind(Y)) because !6220!6220 > and, [106] and [108], by (Copy) 106] !6220!6220*(X, Y) >= isPalListKind(X) because !6220!6220 > isPalListKind and [107], by (Copy) 107] !6220!6220*(X, Y) >= X because [36], by (Select) 108] !6220!6220*(X, Y) >= isPalListKind(Y) because !6220!6220 > isPalListKind and [109], by (Copy) 109] !6220!6220*(X, Y) >= Y because [38], by (Select) 110] isNeList(X) >= mark(U31(isPalListKind(X), X)) because [111], by (Star) 111] isNeList*(X) >= mark(U31(isPalListKind(X), X)) because isNeList > mark and [112], by (Copy) 112] isNeList*(X) >= U31(isPalListKind(X), X) because isNeList > U31, [113] and [114], by (Copy) 113] isNeList*(X) >= isPalListKind(X) because isNeList > isPalListKind and [114], by (Copy) 114] isNeList*(X) >= X because [28], by (Select) 115] isNeList(!6220!6220(X, Y)) > mark(U41(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because [116], by definition 116] isNeList*(!6220!6220(X, Y)) >= mark(U41(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because [117], by (Select) 117] !6220!6220(X, Y) >= mark(U41(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because [118], by (Star) 118] !6220!6220*(X, Y) >= mark(U41(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because !6220!6220 > mark and [119], by (Copy) 119] !6220!6220*(X, Y) >= U41(and(isPalListKind(X), isPalListKind(Y)), X, Y) because !6220!6220 > U41, [105], [107] and [109], by (Copy) 120] isNeList(!6220!6220(X, Y)) >= mark(U51(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because [121], by (Star) 121] isNeList*(!6220!6220(X, Y)) >= mark(U51(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because [122], by (Select) 122] !6220!6220(X, Y) >= mark(U51(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because [123], by (Star) 123] !6220!6220*(X, Y) >= mark(U51(and(isPalListKind(X), isPalListKind(Y)), X, Y)) because !6220!6220 > mark and [124], by (Copy) 124] !6220!6220*(X, Y) >= U51(and(isPalListKind(X), isPalListKind(Y)), X, Y) because !6220!6220 > U51, [105], [107] and [109], by (Copy) 125] isNePal(X) >= mark(U61(isPalListKind(X), X)) because [126], by (Star) 126] isNePal*(X) >= mark(U61(isPalListKind(X), X)) because isNePal > mark and [127], by (Copy) 127] isNePal*(X) >= U61(isPalListKind(X), X) because isNePal > U61, [128] and [129], by (Copy) 128] isNePal*(X) >= isPalListKind(X) because isNePal > isPalListKind and [129], by (Copy) 129] isNePal*(X) >= X because [28], by (Select) 130] isNePal(!6220!6220(X, !6220!6220(Y, X))) >= mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) because [131], by (Star) 131] isNePal*(!6220!6220(X, !6220!6220(Y, X))) >= mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) because [132], by (Select) 132] !6220!6220(X, !6220!6220(Y, X)) >= mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) because [133], by (Star) 133] !6220!6220*(X, !6220!6220(Y, X)) >= mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) because [134], by (Select) 134] !6220!6220(Y, X) >= mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) because [135], by (Star) 135] !6220!6220*(Y, X) >= mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) because !6220!6220 > mark and [136], by (Copy) 136] !6220!6220*(Y, X) >= and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y))) because !6220!6220 > and, [137] and [142], by (Copy) 137] !6220!6220*(Y, X) >= and(isQid(X), isPalListKind(X)) because !6220!6220 > and, [138] and [141], by (Copy) 138] !6220!6220*(Y, X) >= isQid(X) because !6220!6220 > isQid and [139], by (Copy) 139] !6220!6220*(Y, X) >= X because [140], by (Select) 140] X >= X by (Meta) 141] !6220!6220*(Y, X) >= isPalListKind(X) because !6220!6220 > isPalListKind and [139], by (Copy) 142] !6220!6220*(Y, X) >= and(isPal(Y), isPalListKind(Y)) because !6220!6220 > and, [143] and [146], by (Copy) 143] !6220!6220*(Y, X) >= isPal(Y) because !6220!6220 > isPal and [144], by (Copy) 144] !6220!6220*(Y, X) >= Y because [145], by (Select) 145] Y >= Y by (Meta) 146] !6220!6220*(Y, X) >= isPalListKind(Y) because !6220!6220 > isPalListKind and [144], by (Copy) 147] isPal(X) >= mark(U71(isPalListKind(X), X)) because [148], by (Star) 148] isPal*(X) >= mark(U71(isPalListKind(X), X)) because isPal > mark and [149], by (Copy) 149] isPal*(X) >= U71(isPalListKind(X), X) because isPal > U71, [150] and [151], by (Copy) 150] isPal*(X) >= isPalListKind(X) because isPal > isPalListKind and [151], by (Copy) 151] isPal*(X) >= X because [28], by (Select) 152] isPal(nil) > mark(tt) because [153], by definition 153] isPal*(nil) >= mark(tt) because [97], by (Select) 154] isPalListKind(a) >= mark(tt) because [155], by (Star) 155] isPalListKind*(a) >= mark(tt) because [156], by (Select) 156] a >= mark(tt) because [157], by (Star) 157] a* >= mark(tt) because a > mark and [158], by (Copy) 158] a* >= tt because a > tt, by (Copy) 159] isPalListKind(e) >= mark(tt) because isPalListKind = mark, isPalListKind in Mul and [160], by (Fun) 160] e >= tt because e = tt, by (Fun) 161] isPalListKind(i) >= mark(tt) because isPalListKind = mark, isPalListKind in Mul and [162], by (Fun) 162] i >= tt because i = tt, by (Fun) 163] isPalListKind(nil) > mark(tt) because [164], by definition 164] isPalListKind*(nil) >= mark(tt) because [97], by (Select) 165] isPalListKind(o) >= mark(tt) because isPalListKind = mark, isPalListKind in Mul and [166], by (Fun) 166] o >= tt because o = tt, by (Fun) 167] isPalListKind(u) > mark(tt) because [168], by definition 168] isPalListKind*(u) >= mark(tt) because [169], by (Select) 169] u >= mark(tt) because [170], by (Star) 170] u* >= mark(tt) because u > mark and [171], by (Copy) 171] u* >= tt because u > tt, by (Copy) 172] isPalListKind(!6220!6220(X, Y)) >= mark(and(isPalListKind(X), isPalListKind(Y))) because isPalListKind = mark, isPalListKind in Mul and [173], by (Fun) 173] !6220!6220(X, Y) >= and(isPalListKind(X), isPalListKind(Y)) because [105], by (Star) 174] isQid(a) >= mark(tt) because [175], by (Star) 175] isQid*(a) >= mark(tt) because [156], by (Select) 176] isQid(e) >= mark(tt) because isQid = mark, isQid in Mul and [160], by (Fun) 177] isQid(i) >= mark(tt) because isQid = mark, isQid in Mul and [162], by (Fun) 178] isQid(o) >= mark(tt) because isQid = mark, isQid in Mul and [166], by (Fun) 179] isQid(u) >= mark(tt) because [180], by (Star) 180] isQid*(u) >= mark(tt) because [169], by (Select) 181] !6220!6220(X, Y) >= !6220!6220(X, Y) because [182] and [183], by (Fun) 182] X >= X by (Meta) 183] Y >= Y by (Meta) 184] !6220!6220(X, Y) >= !6220!6220(X, Y) because [182] and [185], by (Fun) 185] Y >= Y by (Meta) 186] U11(X, Y) >= U11(X, Y) because U11 in Mul, [182] and [185], by (Fun) 187] U12(X) >= U12(X) because U12 in Mul and [188], by (Fun) 188] X >= X by (Meta) 189] U21(X, Y, Z) >= U21(X, Y, Z) because U21 in Mul, [182], [185] and [190], by (Fun) 190] Z >= Z by (Meta) 191] U22(X, Y) >= U22(X, Y) because U22 in Mul, [182] and [185], by (Fun) 192] U23(X) >= U23(X) because U23 in Mul and [188], by (Fun) 193] U31(X, Y) >= U31(X, Y) because U31 in Mul, [182] and [185], by (Fun) 194] U32(X) >= U32(X) because U32 in Mul and [188], by (Fun) 195] U41(X, Y, Z) >= U41(X, Y, Z) because [182], [185] and [190], by (Fun) 196] U42(X, Y) >= U42(X, Y) because U42 in Mul, [182] and [185], by (Fun) 197] U43(X) >= U43(X) because U43 in Mul and [188], by (Fun) 198] U51(X, Y, Z) >= U51(X, Y, Z) because [182], [185] and [190], by (Fun) 199] U52(X, Y) >= U52(X, Y) because U52 in Mul, [182] and [185], by (Fun) 200] U53(X) >= U53(X) because U53 in Mul and [188], by (Fun) 201] U61(X, Y) >= U61(X, Y) because U61 in Mul, [182] and [185], by (Fun) 202] U62(X) >= U62(X) because U62 in Mul and [188], by (Fun) 203] U71(X, Y) >= U71(X, Y) because U71 in Mul, [182] and [185], by (Fun) 204] U72(X) >= U72(X) because U72 in Mul and [188], by (Fun) 205] and(X, Y) >= and(X, Y) because and in Mul, [182] and [185], by (Fun) 206] !6220!6220(mark(X), Y) > mark(!6220!6220(X, Y)) because [207], by definition 207] !6220!6220*(mark(X), Y) >= mark(!6220!6220(X, Y)) because !6220!6220 > mark and [208], by (Copy) 208] !6220!6220*(mark(X), Y) >= !6220!6220(X, Y) because [209], [211] and [213], by (Stat) 209] mark(X) > X because [210], by definition 210] mark*(X) >= X because [182], by (Select) 211] !6220!6220*(mark(X), Y) >= X because [212], by (Select) 212] mark(X) >= X because [210], by (Star) 213] !6220!6220*(mark(X), Y) >= Y because [185], by (Select) 214] !6220!6220(X, mark(Y)) >= mark(!6220!6220(X, Y)) because [215], by (Star) 215] !6220!6220*(X, mark(Y)) >= mark(!6220!6220(X, Y)) because !6220!6220 > mark and [216], by (Copy) 216] !6220!6220*(X, mark(Y)) >= !6220!6220(X, Y) because [182], [217], [219] and [220], by (Stat) 217] mark(Y) > Y because [218], by definition 218] mark*(Y) >= Y because [185], by (Select) 219] !6220!6220*(X, mark(Y)) >= X because [182], by (Select) 220] !6220!6220*(X, mark(Y)) >= Y because [221], by (Select) 221] mark(Y) >= Y because [218], by (Star) 222] U11(mark(X), Y) > mark(U11(X, Y)) because [223], by definition 223] U11*(mark(X), Y) >= mark(U11(X, Y)) because U11 > mark and [224], by (Copy) 224] U11*(mark(X), Y) >= U11(X, Y) because U11 in Mul, [209] and [185], by (Stat) 225] U12(mark(X)) >= mark(U12(X)) because U12 = mark, U12 in Mul and [226], by (Fun) 226] mark(X) >= U12(X) because mark = U12, mark in Mul and [188], by (Fun) 227] U21(mark(X), Y, Z) >= mark(U21(X, Y, Z)) because [228], by (Star) 228] U21*(mark(X), Y, Z) >= mark(U21(X, Y, Z)) because U21 > mark and [229], by (Copy) 229] U21*(mark(X), Y, Z) >= U21(X, Y, Z) because U21 in Mul, [209], [185] and [190], by (Stat) 230] U22(mark(X), Y) > mark(U22(X, Y)) because [231], by definition 231] U22*(mark(X), Y) >= mark(U22(X, Y)) because U22 > mark and [232], by (Copy) 232] U22*(mark(X), Y) >= U22(X, Y) because U22 in Mul, [209] and [185], by (Stat) 233] U23(mark(X)) >= mark(U23(X)) because U23 = mark, U23 in Mul and [234], by (Fun) 234] mark(X) >= U23(X) because mark = U23, mark in Mul and [188], by (Fun) 235] U31(mark(X), Y) > mark(U31(X, Y)) because [236], by definition 236] U31*(mark(X), Y) >= mark(U31(X, Y)) because U31 > mark and [237], by (Copy) 237] U31*(mark(X), Y) >= U31(X, Y) because U31 in Mul, [209] and [185], by (Stat) 238] U32(mark(X)) >= mark(U32(X)) because U32 = mark, U32 in Mul and [239], by (Fun) 239] mark(X) >= U32(X) because mark = U32, mark in Mul and [188], by (Fun) 240] U41(mark(X), Y, Z) >= mark(U41(X, Y, Z)) because [241], by (Star) 241] U41*(mark(X), Y, Z) >= mark(U41(X, Y, Z)) because U41 > mark and [242], by (Copy) 242] U41*(mark(X), Y, Z) >= U41(X, Y, Z) because [209], [185], [190], [243], [244] and [245], by (Stat) 243] U41*(mark(X), Y, Z) >= X because [212], by (Select) 244] U41*(mark(X), Y, Z) >= Y because [185], by (Select) 245] U41*(mark(X), Y, Z) >= Z because [190], by (Select) 246] U42(mark(X), Y) >= mark(U42(X, Y)) because [247], by (Star) 247] U42*(mark(X), Y) >= mark(U42(X, Y)) because U42 > mark and [248], by (Copy) 248] U42*(mark(X), Y) >= U42(X, Y) because U42 in Mul, [209] and [185], by (Stat) 249] U43(mark(X)) >= mark(U43(X)) because U43 = mark, U43 in Mul and [250], by (Fun) 250] mark(X) >= U43(X) because mark = U43, mark in Mul and [188], by (Fun) 251] U51(mark(X), Y, Z) >= mark(U51(X, Y, Z)) because [252], by (Star) 252] U51*(mark(X), Y, Z) >= mark(U51(X, Y, Z)) because U51 > mark and [253], by (Copy) 253] U51*(mark(X), Y, Z) >= U51(X, Y, Z) because [209], [185], [254], [255] and [256], by (Stat) 254] U51*(mark(X), Y, Z) >= X because [212], by (Select) 255] U51*(mark(X), Y, Z) >= Y because [185], by (Select) 256] U51*(mark(X), Y, Z) >= Z because [190], by (Select) 257] U52(mark(X), Y) >= mark(U52(X, Y)) because [258], by (Star) 258] U52*(mark(X), Y) >= mark(U52(X, Y)) because U52 > mark and [259], by (Copy) 259] U52*(mark(X), Y) >= U52(X, Y) because U52 in Mul, [209] and [185], by (Stat) 260] U53(mark(X)) >= mark(U53(X)) because U53 = mark, U53 in Mul and [261], by (Fun) 261] mark(X) >= U53(X) because mark = U53, mark in Mul and [188], by (Fun) 262] U61(mark(X), Y) >= mark(U61(X, Y)) because [263], by (Star) 263] U61*(mark(X), Y) >= mark(U61(X, Y)) because U61 > mark and [264], by (Copy) 264] U61*(mark(X), Y) >= U61(X, Y) because U61 in Mul, [209] and [185], by (Stat) 265] U62(mark(X)) >= mark(U62(X)) because U62 = mark, U62 in Mul and [266], by (Fun) 266] mark(X) >= U62(X) because mark = U62, mark in Mul and [188], by (Fun) 267] U71(mark(X), Y) > mark(U71(X, Y)) because [268], by definition 268] U71*(mark(X), Y) >= mark(U71(X, Y)) because U71 > mark and [269], by (Copy) 269] U71*(mark(X), Y) >= U71(X, Y) because U71 in Mul, [209] and [185], by (Stat) 270] U72(mark(X)) >= mark(U72(X)) because U72 = mark, U72 in Mul and [271], by (Fun) 271] mark(X) >= U72(X) because mark = U72, mark in Mul and [188], by (Fun) 272] and(mark(X), Y) > mark(and(X, Y)) because [273], by definition 273] and*(mark(X), Y) >= mark(and(X, Y)) because and > mark and [274], by (Copy) 274] and*(mark(X), Y) >= and(X, Y) because and in Mul, [209] and [185], by (Stat) 275] !6220!6220(X, Y) >= !6220!6220(X, Y) because [276] and [277], by (Fun) 276] X >= X by (Meta) 277] Y >= Y by (Meta) 278] nil >= nil by (Fun) 279] U11(X, Y) >= U11(X, Y) because U11 in Mul, [276] and [277], by (Fun) 280] tt >= tt by (Fun) 281] U12(X) >= U12(X) because U12 in Mul and [282], by (Fun) 282] X >= X by (Meta) 283] isNeList(X) >= isNeList(X) because isNeList in Mul and [282], by (Fun) 284] U21(X, Y, Z) >= U21(X, Y, Z) because U21 in Mul, [276], [277] and [285], by (Fun) 285] Z >= Z by (Meta) 286] U22(X, Y) >= U22(X, Y) because U22 in Mul, [276] and [277], by (Fun) 287] isList(X) >= isList(X) because isList in Mul and [282], by (Fun) 288] U23(X) >= U23(X) because U23 in Mul and [282], by (Fun) 289] U31(X, Y) >= U31(X, Y) because U31 in Mul, [276] and [277], by (Fun) 290] U32(X) >= U32(X) because U32 in Mul and [282], by (Fun) 291] isQid(X) >= isQid(X) because isQid in Mul and [282], by (Fun) 292] U41(X, Y, Z) >= U41(X, Y, Z) because [276], [277] and [285], by (Fun) 293] U42(X, Y) >= U42(X, Y) because U42 in Mul, [276] and [277], by (Fun) 294] U43(X) >= U43(X) because U43 in Mul and [282], by (Fun) 295] U51(X, Y, Z) >= U51(X, Y, Z) because [276], [277] and [285], by (Fun) 296] U52(X, Y) >= U52(X, Y) because U52 in Mul, [276] and [277], by (Fun) 297] U53(X) >= U53(X) because U53 in Mul and [282], by (Fun) 298] U61(X, Y) >= U61(X, Y) because U61 in Mul, [276] and [277], by (Fun) 299] U62(X) >= U62(X) because U62 in Mul and [282], by (Fun) 300] U71(X, Y) >= U71(X, Y) because U71 in Mul, [276] and [277], by (Fun) 301] U72(X) >= U72(X) because U72 in Mul and [282], by (Fun) 302] isNePal(X) >= isNePal(X) because isNePal in Mul and [282], by (Fun) 303] and(X, Y) >= and(X, Y) because and in Mul, [276] and [277], by (Fun) 304] isPalListKind(X) >= isPalListKind(X) because isPalListKind in Mul and [282], by (Fun) 305] isPal(X) >= isPal(X) because isPal in Mul and [282], by (Fun) 306] a >= a by (Fun) 307] e >= e by (Fun) 308] i >= i by (Fun) 309] o >= o by (Fun) 310] u >= u by (Fun) 311] !6220!6220(X, Y) >= !6220!6220(X, Y) because [312] and [313], by (Fun) 312] X >= X by (Meta) 313] Y >= Y by (Meta) 314] U11(X, Y) >= U11(X, Y) because U11 in Mul, [312] and [313], by (Fun) 315] U12(X) >= U12(X) because U12 in Mul and [316], by (Fun) 316] X >= X by (Meta) 317] isNeList(X) >= isNeList(X) because isNeList in Mul and [316], by (Fun) 318] U21(X, Y, Z) >= U21(X, Y, Z) because U21 in Mul, [312], [313] and [319], by (Fun) 319] Z >= Z by (Meta) 320] U22(X, Y) >= U22(X, Y) because U22 in Mul, [312] and [313], by (Fun) 321] isList(X) >= isList(X) because isList in Mul and [316], by (Fun) 322] U23(X) >= U23(X) because U23 in Mul and [316], by (Fun) 323] U31(X, Y) >= U31(X, Y) because U31 in Mul, [312] and [313], by (Fun) 324] U32(X) >= U32(X) because U32 in Mul and [316], by (Fun) 325] isQid(X) >= isQid(X) because isQid in Mul and [316], by (Fun) 326] U41(X, Y, Z) >= U41(X, Y, Z) because [312], [313] and [319], by (Fun) 327] U42(X, Y) >= U42(X, Y) because U42 in Mul, [312] and [313], by (Fun) 328] U43(X) >= U43(X) because U43 in Mul and [316], by (Fun) 329] U51(X, Y, Z) >= U51(X, Y, Z) because [312], [313] and [319], by (Fun) 330] U52(X, Y) >= U52(X, Y) because U52 in Mul, [312] and [313], by (Fun) 331] U53(X) >= U53(X) because U53 in Mul and [316], by (Fun) 332] U61(X, Y) >= U61(X, Y) because U61 in Mul, [312] and [313], by (Fun) 333] U62(X) >= U62(X) because U62 in Mul and [316], by (Fun) 334] U71(X, Y) >= U71(X, Y) because U71 in Mul, [312] and [313], by (Fun) 335] U72(X) >= U72(X) because U72 in Mul and [316], by (Fun) 336] isNePal(X) >= isNePal(X) because isNePal in Mul and [316], by (Fun) 337] and(X, Y) >= and(X, Y) because and in Mul, [312] and [313], by (Fun) 338] isPalListKind(X) >= isPalListKind(X) because isPalListKind in Mul and [316], by (Fun) 339] isPal(X) >= isPal(X) because isPal in Mul and [316], by (Fun) 340] top(mark(X)) >= top(X) because [341], by (Star) 341] top*(mark(X)) >= top(X) because [342], by (Select) 342] mark(X) >= top(X) because mark = top, mark in Mul and [282], by (Fun) 343] top(X) >= top(X) because top in Mul and [344], by (Fun) 344] X >= X by (Meta) We can thus remove the following rules: active(!6220!6220(X, nil)) => mark(X) active(!6220!6220(nil, X)) => mark(X) active(U21(tt, X, Y)) => mark(U22(isList(X), Y)) active(U41(tt, X, Y)) => mark(U42(isList(X), Y)) active(U42(tt, X)) => mark(U43(isNeList(X))) active(U51(tt, X, Y)) => mark(U52(isNeList(X), Y)) active(and(tt, X)) => mark(X) active(isList(X)) => mark(U11(isPalListKind(X), X)) active(isNeList(!6220!6220(X, Y))) => mark(U41(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isPal(nil)) => mark(tt) active(isPalListKind(nil)) => mark(tt) active(isPalListKind(u)) => mark(tt) !6220!6220(mark(X), Y) => mark(!6220!6220(X, Y)) U11(mark(X), Y) => mark(U11(X, Y)) U22(mark(X), Y) => mark(U22(X, Y)) U31(mark(X), Y) => mark(U31(X, Y)) U71(mark(X), Y) => mark(U71(X, Y)) and(mark(X), Y) => mark(and(X, Y)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(!6220!6220(X, Y), Z)) >? mark(!6220!6220(X, !6220!6220(Y, Z))) active(U11(tt, X)) >? mark(U12(isNeList(X))) active(U12(tt)) >? mark(tt) active(U22(tt, X)) >? mark(U23(isList(X))) active(U23(tt)) >? mark(tt) active(U31(tt, X)) >? mark(U32(isQid(X))) active(U32(tt)) >? mark(tt) active(U43(tt)) >? mark(tt) active(U52(tt, X)) >? mark(U53(isList(X))) active(U53(tt)) >? mark(tt) active(U61(tt, X)) >? mark(U62(isQid(X))) active(U62(tt)) >? mark(tt) active(U71(tt, X)) >? mark(U72(isNePal(X))) active(U72(tt)) >? mark(tt) active(isList(nil)) >? mark(tt) active(isList(!6220!6220(X, Y))) >? mark(U21(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNeList(X)) >? mark(U31(isPalListKind(X), X)) active(isNeList(!6220!6220(X, Y))) >? mark(U51(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNePal(X)) >? mark(U61(isPalListKind(X), X)) active(isNePal(!6220!6220(X, !6220!6220(Y, X)))) >? mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) active(isPal(X)) >? mark(U71(isPalListKind(X), X)) active(isPalListKind(a)) >? mark(tt) active(isPalListKind(e)) >? mark(tt) active(isPalListKind(i)) >? mark(tt) active(isPalListKind(o)) >? mark(tt) active(isPalListKind(!6220!6220(X, Y))) >? mark(and(isPalListKind(X), isPalListKind(Y))) active(isQid(a)) >? mark(tt) active(isQid(e)) >? mark(tt) active(isQid(i)) >? mark(tt) active(isQid(o)) >? mark(tt) active(isQid(u)) >? mark(tt) active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U12(mark(X)) >? mark(U12(X)) U21(mark(X), Y, Z) >? mark(U21(X, Y, Z)) U23(mark(X)) >? mark(U23(X)) U32(mark(X)) >? mark(U32(X)) U41(mark(X), Y, Z) >? mark(U41(X, Y, Z)) U42(mark(X), Y) >? mark(U42(X, Y)) U43(mark(X)) >? mark(U43(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U52(mark(X), Y) >? mark(U52(X, Y)) U53(mark(X)) >? mark(U53(X)) U61(mark(X), Y) >? mark(U61(X, Y)) U62(mark(X)) >? mark(U62(X)) U72(mark(X)) >? mark(U72(X)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(nil) >? ok(nil) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(tt) >? ok(tt) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(e) >? ok(e) proper(i) >? ok(i) proper(o) >? ok(o) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(mark(X)) >? top(proper(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.y1 + 3y0 U11 = \y0y1.y0 + 2y1 U12 = \y0.y0 U21 = \y0y1y2.y0 + y2 + 2y1 U22 = \y0y1.3 + y0 + 2y1 U23 = \y0.y0 U31 = \y0y1.y0 + y1 U32 = \y0.y0 U41 = \y0y1y2.y1 + y2 + 2y0 U42 = \y0y1.y0 + y1 U43 = \y0.y0 U51 = \y0y1y2.1 + y0 + y1 + y2 U52 = \y0y1.3 + y0 + 2y1 U53 = \y0.y0 U61 = \y0y1.y0 + y1 U62 = \y0.y0 U71 = \y0y1.y0 + 2y1 U72 = \y0.y0 a = 1 active = \y0.y0 and = \y0y1.y0 + y1 e = 2 i = 1 isList = \y0.2y0 isNeList = \y0.1 + 2y0 isNePal = \y0.2y0 isPal = \y0.3y0 isPalListKind = \y0.y0 isQid = \y0.y0 mark = \y0.y0 nil = 2 o = 2 ok = \y0.y0 proper = \y0.y0 top = \y0.2y0 tt = 1 u = 2 Using this interpretation, the requirements translate to: [[active(!6220!6220(!6220!6220(_x0, _x1), _x2))]] = x2 + 3x1 + 9x0 >= x2 + 3x0 + 3x1 = [[mark(!6220!6220(_x0, !6220!6220(_x1, _x2)))]] [[active(U11(tt, _x0))]] = 1 + 2x0 >= 1 + 2x0 = [[mark(U12(isNeList(_x0)))]] [[active(U12(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U22(tt, _x0))]] = 4 + 2x0 > 2x0 = [[mark(U23(isList(_x0)))]] [[active(U23(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U31(tt, _x0))]] = 1 + x0 > x0 = [[mark(U32(isQid(_x0)))]] [[active(U32(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U43(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U52(tt, _x0))]] = 4 + 2x0 > 2x0 = [[mark(U53(isList(_x0)))]] [[active(U53(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U61(tt, _x0))]] = 1 + x0 > x0 = [[mark(U62(isQid(_x0)))]] [[active(U62(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U71(tt, _x0))]] = 1 + 2x0 > 2x0 = [[mark(U72(isNePal(_x0)))]] [[active(U72(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(isList(nil))]] = 4 > 1 = [[mark(tt)]] [[active(isList(!6220!6220(_x0, _x1)))]] = 2x1 + 6x0 >= 2x1 + 3x0 = [[mark(U21(and(isPalListKind(_x0), isPalListKind(_x1)), _x0, _x1))]] [[active(isNeList(_x0))]] = 1 + 2x0 > 2x0 = [[mark(U31(isPalListKind(_x0), _x0))]] [[active(isNeList(!6220!6220(_x0, _x1)))]] = 1 + 2x1 + 6x0 >= 1 + 2x0 + 2x1 = [[mark(U51(and(isPalListKind(_x0), isPalListKind(_x1)), _x0, _x1))]] [[active(isNePal(_x0))]] = 2x0 >= 2x0 = [[mark(U61(isPalListKind(_x0), _x0))]] [[active(isNePal(!6220!6220(_x0, !6220!6220(_x1, _x0))))]] = 6x1 + 8x0 >= 2x0 + 4x1 = [[mark(and(and(isQid(_x0), isPalListKind(_x0)), and(isPal(_x1), isPalListKind(_x1))))]] [[active(isPal(_x0))]] = 3x0 >= 3x0 = [[mark(U71(isPalListKind(_x0), _x0))]] [[active(isPalListKind(a))]] = 1 >= 1 = [[mark(tt)]] [[active(isPalListKind(e))]] = 2 > 1 = [[mark(tt)]] [[active(isPalListKind(i))]] = 1 >= 1 = [[mark(tt)]] [[active(isPalListKind(o))]] = 2 > 1 = [[mark(tt)]] [[active(isPalListKind(!6220!6220(_x0, _x1)))]] = x1 + 3x0 >= x0 + x1 = [[mark(and(isPalListKind(_x0), isPalListKind(_x1)))]] [[active(isQid(a))]] = 1 >= 1 = [[mark(tt)]] [[active(isQid(e))]] = 2 > 1 = [[mark(tt)]] [[active(isQid(i))]] = 1 >= 1 = [[mark(tt)]] [[active(isQid(o))]] = 2 > 1 = [[mark(tt)]] [[active(isQid(u))]] = 2 > 1 = [[mark(tt)]] [[active(!6220!6220(_x0, _x1))]] = x1 + 3x0 >= x1 + 3x0 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = x1 + 3x0 >= x1 + 3x0 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = x0 >= x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = x0 + x2 + 2x1 >= x0 + x2 + 2x1 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = 3 + x0 + 2x1 >= 3 + x0 + 2x1 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = x0 >= x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = x0 >= x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = x0 >= x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = 3 + x0 + 2x1 >= 3 + x0 + 2x1 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = x0 >= x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = x0 >= x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = x0 >= x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[and(active(_x0), _x1)]] [[!6220!6220(_x0, mark(_x1))]] = x1 + 3x0 >= x1 + 3x0 = [[mark(!6220!6220(_x0, _x1))]] [[U12(mark(_x0))]] = x0 >= x0 = [[mark(U12(_x0))]] [[U21(mark(_x0), _x1, _x2)]] = x0 + x2 + 2x1 >= x0 + x2 + 2x1 = [[mark(U21(_x0, _x1, _x2))]] [[U23(mark(_x0))]] = x0 >= x0 = [[mark(U23(_x0))]] [[U32(mark(_x0))]] = x0 >= x0 = [[mark(U32(_x0))]] [[U41(mark(_x0), _x1, _x2)]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[mark(U41(_x0, _x1, _x2))]] [[U42(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U42(_x0, _x1))]] [[U43(mark(_x0))]] = x0 >= x0 = [[mark(U43(_x0))]] [[U51(mark(_x0), _x1, _x2)]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[mark(U51(_x0, _x1, _x2))]] [[U52(mark(_x0), _x1)]] = 3 + x0 + 2x1 >= 3 + x0 + 2x1 = [[mark(U52(_x0, _x1))]] [[U53(mark(_x0))]] = x0 >= x0 = [[mark(U53(_x0))]] [[U61(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U61(_x0, _x1))]] [[U62(mark(_x0))]] = x0 >= x0 = [[mark(U62(_x0))]] [[U72(mark(_x0))]] = x0 >= x0 = [[mark(U72(_x0))]] [[proper(!6220!6220(_x0, _x1))]] = x1 + 3x0 >= x1 + 3x0 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(nil)]] = 2 >= 2 = [[ok(nil)]] [[proper(U11(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U11(proper(_x0), proper(_x1))]] [[proper(tt)]] = 1 >= 1 = [[ok(tt)]] [[proper(U12(_x0))]] = x0 >= x0 = [[U12(proper(_x0))]] [[proper(isNeList(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[isNeList(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = x0 + x2 + 2x1 >= x0 + x2 + 2x1 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U22(_x0, _x1))]] = 3 + x0 + 2x1 >= 3 + x0 + 2x1 = [[U22(proper(_x0), proper(_x1))]] [[proper(isList(_x0))]] = 2x0 >= 2x0 = [[isList(proper(_x0))]] [[proper(U23(_x0))]] = x0 >= x0 = [[U23(proper(_x0))]] [[proper(U31(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U31(proper(_x0), proper(_x1))]] [[proper(U32(_x0))]] = x0 >= x0 = [[U32(proper(_x0))]] [[proper(isQid(_x0))]] = x0 >= x0 = [[isQid(proper(_x0))]] [[proper(U41(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U41(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(proper(_x0), proper(_x1))]] [[proper(U43(_x0))]] = x0 >= x0 = [[U43(proper(_x0))]] [[proper(U51(_x0, _x1, _x2))]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[U51(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U52(_x0, _x1))]] = 3 + x0 + 2x1 >= 3 + x0 + 2x1 = [[U52(proper(_x0), proper(_x1))]] [[proper(U53(_x0))]] = x0 >= x0 = [[U53(proper(_x0))]] [[proper(U61(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = x0 >= x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = x0 >= x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 2x0 >= 2x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = x0 >= x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = 3x0 >= 3x0 = [[isPal(proper(_x0))]] [[proper(a)]] = 1 >= 1 = [[ok(a)]] [[proper(e)]] = 2 >= 2 = [[ok(e)]] [[proper(i)]] = 1 >= 1 = [[ok(i)]] [[proper(o)]] = 2 >= 2 = [[ok(o)]] [[proper(u)]] = 2 >= 2 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = x1 + 3x0 >= x1 + 3x0 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = x0 >= x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x2 + 2x1 >= x0 + x2 + 2x1 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = 3 + x0 + 2x1 >= 3 + x0 + 2x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = x0 >= x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = x0 >= x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = x0 >= x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = x0 >= x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = 3 + x0 + 2x1 >= 3 + x0 + 2x1 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = x0 >= x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = x0 >= x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = x0 >= x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = x0 >= x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = 3x0 >= 3x0 = [[ok(isPal(_x0))]] [[top(mark(_x0))]] = 2x0 >= 2x0 = [[top(proper(_x0))]] [[top(ok(_x0))]] = 2x0 >= 2x0 = [[top(active(_x0))]] We can thus remove the following rules: active(U22(tt, X)) => mark(U23(isList(X))) active(U31(tt, X)) => mark(U32(isQid(X))) active(U52(tt, X)) => mark(U53(isList(X))) active(U61(tt, X)) => mark(U62(isQid(X))) active(U71(tt, X)) => mark(U72(isNePal(X))) active(isList(nil)) => mark(tt) active(isNeList(X)) => mark(U31(isPalListKind(X), X)) active(isPalListKind(e)) => mark(tt) active(isPalListKind(o)) => mark(tt) active(isQid(e)) => mark(tt) active(isQid(o)) => mark(tt) active(isQid(u)) => mark(tt) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(!6220!6220(X, Y), Z)) >? mark(!6220!6220(X, !6220!6220(Y, Z))) active(U11(tt, X)) >? mark(U12(isNeList(X))) active(U12(tt)) >? mark(tt) active(U23(tt)) >? mark(tt) active(U32(tt)) >? mark(tt) active(U43(tt)) >? mark(tt) active(U53(tt)) >? mark(tt) active(U62(tt)) >? mark(tt) active(U72(tt)) >? mark(tt) active(isList(!6220!6220(X, Y))) >? mark(U21(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNeList(!6220!6220(X, Y))) >? mark(U51(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNePal(X)) >? mark(U61(isPalListKind(X), X)) active(isNePal(!6220!6220(X, !6220!6220(Y, X)))) >? mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) active(isPal(X)) >? mark(U71(isPalListKind(X), X)) active(isPalListKind(a)) >? mark(tt) active(isPalListKind(i)) >? mark(tt) active(isPalListKind(!6220!6220(X, Y))) >? mark(and(isPalListKind(X), isPalListKind(Y))) active(isQid(a)) >? mark(tt) active(isQid(i)) >? mark(tt) active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U12(mark(X)) >? mark(U12(X)) U21(mark(X), Y, Z) >? mark(U21(X, Y, Z)) U23(mark(X)) >? mark(U23(X)) U32(mark(X)) >? mark(U32(X)) U41(mark(X), Y, Z) >? mark(U41(X, Y, Z)) U42(mark(X), Y) >? mark(U42(X, Y)) U43(mark(X)) >? mark(U43(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U52(mark(X), Y) >? mark(U52(X, Y)) U53(mark(X)) >? mark(U53(X)) U61(mark(X), Y) >? mark(U61(X, Y)) U62(mark(X)) >? mark(U62(X)) U72(mark(X)) >? mark(U72(X)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(nil) >? ok(nil) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(tt) >? ok(tt) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(e) >? ok(e) proper(i) >? ok(i) proper(o) >? ok(o) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(mark(X)) >? top(proper(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.2 + y1 + 2y0 U11 = \y0y1.2y0 + 3y1 U12 = \y0.y0 U21 = \y0y1y2.1 + y0 + y1 + y2 U22 = \y0y1.y0 + y1 U23 = \y0.2y0 U31 = \y0y1.y0 + 2y1 U32 = \y0.y0 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 U43 = \y0.y0 U51 = \y0y1y2.y1 + y2 + 2y0 U52 = \y0y1.y0 + y1 U53 = \y0.y0 U61 = \y0y1.y0 + y1 U62 = \y0.y0 U71 = \y0y1.y0 + 2y1 U72 = \y0.y0 a = 2 active = \y0.y0 and = \y0y1.y0 + y1 e = 0 i = 1 isList = \y0.2y0 isNeList = \y0.3y0 isNePal = \y0.2y0 isPal = \y0.3y0 isPalListKind = \y0.y0 isQid = \y0.y0 mark = \y0.y0 nil = 0 o = 0 ok = \y0.y0 proper = \y0.y0 top = \y0.2y0 tt = 1 u = 0 Using this interpretation, the requirements translate to: [[active(!6220!6220(!6220!6220(_x0, _x1), _x2))]] = 6 + x2 + 2x1 + 4x0 > 4 + x2 + 2x0 + 2x1 = [[mark(!6220!6220(_x0, !6220!6220(_x1, _x2)))]] [[active(U11(tt, _x0))]] = 2 + 3x0 > 3x0 = [[mark(U12(isNeList(_x0)))]] [[active(U12(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U23(tt))]] = 2 > 1 = [[mark(tt)]] [[active(U32(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U43(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U53(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U62(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U72(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(isList(!6220!6220(_x0, _x1)))]] = 4 + 2x1 + 4x0 > 1 + 2x0 + 2x1 = [[mark(U21(and(isPalListKind(_x0), isPalListKind(_x1)), _x0, _x1))]] [[active(isNeList(!6220!6220(_x0, _x1)))]] = 6 + 3x1 + 6x0 > 3x0 + 3x1 = [[mark(U51(and(isPalListKind(_x0), isPalListKind(_x1)), _x0, _x1))]] [[active(isNePal(_x0))]] = 2x0 >= 2x0 = [[mark(U61(isPalListKind(_x0), _x0))]] [[active(isNePal(!6220!6220(_x0, !6220!6220(_x1, _x0))))]] = 8 + 4x1 + 6x0 > 2x0 + 4x1 = [[mark(and(and(isQid(_x0), isPalListKind(_x0)), and(isPal(_x1), isPalListKind(_x1))))]] [[active(isPal(_x0))]] = 3x0 >= 3x0 = [[mark(U71(isPalListKind(_x0), _x0))]] [[active(isPalListKind(a))]] = 2 > 1 = [[mark(tt)]] [[active(isPalListKind(i))]] = 1 >= 1 = [[mark(tt)]] [[active(isPalListKind(!6220!6220(_x0, _x1)))]] = 2 + x1 + 2x0 > x0 + x1 = [[mark(and(isPalListKind(_x0), isPalListKind(_x1)))]] [[active(isQid(a))]] = 2 > 1 = [[mark(tt)]] [[active(isQid(i))]] = 1 >= 1 = [[mark(tt)]] [[active(!6220!6220(_x0, _x1))]] = 2 + x1 + 2x0 >= 2 + x1 + 2x0 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = 2 + x1 + 2x0 >= 2 + x1 + 2x0 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = 2x0 + 3x1 >= 2x0 + 3x1 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = x0 >= x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = 2x0 >= 2x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = x0 >= x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = x0 >= x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = x0 >= x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = x0 >= x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = x0 >= x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[and(active(_x0), _x1)]] [[!6220!6220(_x0, mark(_x1))]] = 2 + x1 + 2x0 >= 2 + x1 + 2x0 = [[mark(!6220!6220(_x0, _x1))]] [[U12(mark(_x0))]] = x0 >= x0 = [[mark(U12(_x0))]] [[U21(mark(_x0), _x1, _x2)]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[mark(U21(_x0, _x1, _x2))]] [[U23(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U23(_x0))]] [[U32(mark(_x0))]] = x0 >= x0 = [[mark(U32(_x0))]] [[U41(mark(_x0), _x1, _x2)]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[mark(U41(_x0, _x1, _x2))]] [[U42(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U42(_x0, _x1))]] [[U43(mark(_x0))]] = x0 >= x0 = [[mark(U43(_x0))]] [[U51(mark(_x0), _x1, _x2)]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[mark(U51(_x0, _x1, _x2))]] [[U52(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U52(_x0, _x1))]] [[U53(mark(_x0))]] = x0 >= x0 = [[mark(U53(_x0))]] [[U61(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U61(_x0, _x1))]] [[U62(mark(_x0))]] = x0 >= x0 = [[mark(U62(_x0))]] [[U72(mark(_x0))]] = x0 >= x0 = [[mark(U72(_x0))]] [[proper(!6220!6220(_x0, _x1))]] = 2 + x1 + 2x0 >= 2 + x1 + 2x0 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(nil)]] = 0 >= 0 = [[ok(nil)]] [[proper(U11(_x0, _x1))]] = 2x0 + 3x1 >= 2x0 + 3x1 = [[U11(proper(_x0), proper(_x1))]] [[proper(tt)]] = 1 >= 1 = [[ok(tt)]] [[proper(U12(_x0))]] = x0 >= x0 = [[U12(proper(_x0))]] [[proper(isNeList(_x0))]] = 3x0 >= 3x0 = [[isNeList(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U22(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U22(proper(_x0), proper(_x1))]] [[proper(isList(_x0))]] = 2x0 >= 2x0 = [[isList(proper(_x0))]] [[proper(U23(_x0))]] = 2x0 >= 2x0 = [[U23(proper(_x0))]] [[proper(U31(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U31(proper(_x0), proper(_x1))]] [[proper(U32(_x0))]] = x0 >= x0 = [[U32(proper(_x0))]] [[proper(isQid(_x0))]] = x0 >= x0 = [[isQid(proper(_x0))]] [[proper(U41(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U41(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(proper(_x0), proper(_x1))]] [[proper(U43(_x0))]] = x0 >= x0 = [[U43(proper(_x0))]] [[proper(U51(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U51(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U52(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U52(proper(_x0), proper(_x1))]] [[proper(U53(_x0))]] = x0 >= x0 = [[U53(proper(_x0))]] [[proper(U61(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = x0 >= x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = x0 >= x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 2x0 >= 2x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = x0 >= x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = 3x0 >= 3x0 = [[isPal(proper(_x0))]] [[proper(a)]] = 2 >= 2 = [[ok(a)]] [[proper(e)]] = 0 >= 0 = [[ok(e)]] [[proper(i)]] = 1 >= 1 = [[ok(i)]] [[proper(o)]] = 0 >= 0 = [[ok(o)]] [[proper(u)]] = 0 >= 0 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = 2 + x1 + 2x0 >= 2 + x1 + 2x0 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = 2x0 + 3x1 >= 2x0 + 3x1 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = x0 >= x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = 3x0 >= 3x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = x0 >= x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = x0 >= x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = x0 >= x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = x0 >= x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = x0 >= x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = x0 >= x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = x0 >= x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = 3x0 >= 3x0 = [[ok(isPal(_x0))]] [[top(mark(_x0))]] = 2x0 >= 2x0 = [[top(proper(_x0))]] [[top(ok(_x0))]] = 2x0 >= 2x0 = [[top(active(_x0))]] We can thus remove the following rules: active(!6220!6220(!6220!6220(X, Y), Z)) => mark(!6220!6220(X, !6220!6220(Y, Z))) active(U11(tt, X)) => mark(U12(isNeList(X))) active(U23(tt)) => mark(tt) active(isList(!6220!6220(X, Y))) => mark(U21(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNeList(!6220!6220(X, Y))) => mark(U51(and(isPalListKind(X), isPalListKind(Y)), X, Y)) active(isNePal(!6220!6220(X, !6220!6220(Y, X)))) => mark(and(and(isQid(X), isPalListKind(X)), and(isPal(Y), isPalListKind(Y)))) active(isPalListKind(a)) => mark(tt) active(isPalListKind(!6220!6220(X, Y))) => mark(and(isPalListKind(X), isPalListKind(Y))) active(isQid(a)) => mark(tt) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U12(tt)) >? mark(tt) active(U32(tt)) >? mark(tt) active(U43(tt)) >? mark(tt) active(U53(tt)) >? mark(tt) active(U62(tt)) >? mark(tt) active(U72(tt)) >? mark(tt) active(isNePal(X)) >? mark(U61(isPalListKind(X), X)) active(isPal(X)) >? mark(U71(isPalListKind(X), X)) active(isPalListKind(i)) >? mark(tt) active(isQid(i)) >? mark(tt) active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U12(mark(X)) >? mark(U12(X)) U21(mark(X), Y, Z) >? mark(U21(X, Y, Z)) U23(mark(X)) >? mark(U23(X)) U32(mark(X)) >? mark(U32(X)) U41(mark(X), Y, Z) >? mark(U41(X, Y, Z)) U42(mark(X), Y) >? mark(U42(X, Y)) U43(mark(X)) >? mark(U43(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U52(mark(X), Y) >? mark(U52(X, Y)) U53(mark(X)) >? mark(U53(X)) U61(mark(X), Y) >? mark(U61(X, Y)) U62(mark(X)) >? mark(U62(X)) U72(mark(X)) >? mark(U72(X)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(nil) >? ok(nil) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(tt) >? ok(tt) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(e) >? ok(e) proper(i) >? ok(i) proper(o) >? ok(o) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(mark(X)) >? top(proper(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.y0 + y1 U11 = \y0y1.y0 + y1 U12 = \y0.y0 U21 = \y0y1y2.y0 + y1 + y2 U22 = \y0y1.y0 + y1 U23 = \y0.y0 U31 = \y0y1.y0 + 2y1 U32 = \y0.y0 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y1 + 2y0 U43 = \y0.y0 U51 = \y0y1y2.y1 + y2 + 2y0 U52 = \y0y1.y0 + y1 U53 = \y0.2y0 U61 = \y0y1.y1 + 2y0 U62 = \y0.2y0 U71 = \y0y1.y0 + y1 U72 = \y0.y0 a = 3 active = \y0.y0 and = \y0y1.y1 + 2y0 e = 1 i = 1 isList = \y0.y0 isNeList = \y0.y0 isNePal = \y0.2 + 3y0 isPal = \y0.2y0 isPalListKind = \y0.y0 isQid = \y0.2y0 mark = \y0.y0 nil = 0 o = 0 ok = \y0.y0 proper = \y0.y0 top = \y0.2y0 tt = 1 u = 0 Using this interpretation, the requirements translate to: [[active(U12(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U32(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U43(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U53(tt))]] = 2 > 1 = [[mark(tt)]] [[active(U62(tt))]] = 2 > 1 = [[mark(tt)]] [[active(U72(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(isNePal(_x0))]] = 2 + 3x0 > 3x0 = [[mark(U61(isPalListKind(_x0), _x0))]] [[active(isPal(_x0))]] = 2x0 >= 2x0 = [[mark(U71(isPalListKind(_x0), _x0))]] [[active(isPalListKind(i))]] = 1 >= 1 = [[mark(tt)]] [[active(isQid(i))]] = 2 > 1 = [[mark(tt)]] [[active(!6220!6220(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = x0 >= x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = x0 >= x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = x0 >= x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = x0 >= x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = 2x0 >= 2x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = 2x0 >= 2x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = x0 >= x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[and(active(_x0), _x1)]] [[!6220!6220(_x0, mark(_x1))]] = x0 + x1 >= x0 + x1 = [[mark(!6220!6220(_x0, _x1))]] [[U12(mark(_x0))]] = x0 >= x0 = [[mark(U12(_x0))]] [[U21(mark(_x0), _x1, _x2)]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[mark(U21(_x0, _x1, _x2))]] [[U23(mark(_x0))]] = x0 >= x0 = [[mark(U23(_x0))]] [[U32(mark(_x0))]] = x0 >= x0 = [[mark(U32(_x0))]] [[U41(mark(_x0), _x1, _x2)]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[mark(U41(_x0, _x1, _x2))]] [[U42(mark(_x0), _x1)]] = x1 + 2x0 >= x1 + 2x0 = [[mark(U42(_x0, _x1))]] [[U43(mark(_x0))]] = x0 >= x0 = [[mark(U43(_x0))]] [[U51(mark(_x0), _x1, _x2)]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[mark(U51(_x0, _x1, _x2))]] [[U52(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U52(_x0, _x1))]] [[U53(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U53(_x0))]] [[U61(mark(_x0), _x1)]] = x1 + 2x0 >= x1 + 2x0 = [[mark(U61(_x0, _x1))]] [[U62(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U62(_x0))]] [[U72(mark(_x0))]] = x0 >= x0 = [[mark(U72(_x0))]] [[proper(!6220!6220(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(nil)]] = 0 >= 0 = [[ok(nil)]] [[proper(U11(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U11(proper(_x0), proper(_x1))]] [[proper(tt)]] = 1 >= 1 = [[ok(tt)]] [[proper(U12(_x0))]] = x0 >= x0 = [[U12(proper(_x0))]] [[proper(isNeList(_x0))]] = x0 >= x0 = [[isNeList(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U22(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U22(proper(_x0), proper(_x1))]] [[proper(isList(_x0))]] = x0 >= x0 = [[isList(proper(_x0))]] [[proper(U23(_x0))]] = x0 >= x0 = [[U23(proper(_x0))]] [[proper(U31(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U31(proper(_x0), proper(_x1))]] [[proper(U32(_x0))]] = x0 >= x0 = [[U32(proper(_x0))]] [[proper(isQid(_x0))]] = 2x0 >= 2x0 = [[isQid(proper(_x0))]] [[proper(U41(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U41(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U42(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U42(proper(_x0), proper(_x1))]] [[proper(U43(_x0))]] = x0 >= x0 = [[U43(proper(_x0))]] [[proper(U51(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U51(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U52(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U52(proper(_x0), proper(_x1))]] [[proper(U53(_x0))]] = 2x0 >= 2x0 = [[U53(proper(_x0))]] [[proper(U61(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = 2x0 >= 2x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = x0 >= x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 2 + 3x0 >= 2 + 3x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = x0 >= x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = 2x0 >= 2x0 = [[isPal(proper(_x0))]] [[proper(a)]] = 3 >= 3 = [[ok(a)]] [[proper(e)]] = 1 >= 1 = [[ok(e)]] [[proper(i)]] = 1 >= 1 = [[ok(i)]] [[proper(o)]] = 0 >= 0 = [[ok(o)]] [[proper(u)]] = 0 >= 0 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = x0 >= x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = x0 >= x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = x0 >= x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = x0 >= x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = x0 >= x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = x0 >= x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = x0 >= x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = 2 + 3x0 >= 2 + 3x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = x0 >= x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isPal(_x0))]] [[top(mark(_x0))]] = 2x0 >= 2x0 = [[top(proper(_x0))]] [[top(ok(_x0))]] = 2x0 >= 2x0 = [[top(active(_x0))]] We can thus remove the following rules: active(U53(tt)) => mark(tt) active(U62(tt)) => mark(tt) active(isNePal(X)) => mark(U61(isPalListKind(X), X)) active(isQid(i)) => mark(tt) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U12(tt)) >? mark(tt) active(U32(tt)) >? mark(tt) active(U43(tt)) >? mark(tt) active(U72(tt)) >? mark(tt) active(isPal(X)) >? mark(U71(isPalListKind(X), X)) active(isPalListKind(i)) >? mark(tt) active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U12(mark(X)) >? mark(U12(X)) U21(mark(X), Y, Z) >? mark(U21(X, Y, Z)) U23(mark(X)) >? mark(U23(X)) U32(mark(X)) >? mark(U32(X)) U41(mark(X), Y, Z) >? mark(U41(X, Y, Z)) U42(mark(X), Y) >? mark(U42(X, Y)) U43(mark(X)) >? mark(U43(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U52(mark(X), Y) >? mark(U52(X, Y)) U53(mark(X)) >? mark(U53(X)) U61(mark(X), Y) >? mark(U61(X, Y)) U62(mark(X)) >? mark(U62(X)) U72(mark(X)) >? mark(U72(X)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(nil) >? ok(nil) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(tt) >? ok(tt) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(e) >? ok(e) proper(i) >? ok(i) proper(o) >? ok(o) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(mark(X)) >? top(proper(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.y0 + 2y1 U11 = \y0y1.y0 + y1 U12 = \y0.2y0 U21 = \y0y1y2.y0 + y1 + y2 U22 = \y0y1.2y0 + 2y1 U23 = \y0.y0 U31 = \y0y1.1 + y1 + 2y0 U32 = \y0.1 + y0 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 U43 = \y0.2y0 U51 = \y0y1y2.y0 + y1 + y2 U52 = \y0y1.y1 + 2y0 U53 = \y0.y0 U61 = \y0y1.y1 + 2y0 U62 = \y0.y0 U71 = \y0y1.y0 + y1 U72 = \y0.y0 a = 0 active = \y0.y0 and = \y0y1.y0 + y1 e = 0 i = 0 isList = \y0.2y0 isNeList = \y0.y0 isNePal = \y0.y0 isPal = \y0.1 + 2y0 isPalListKind = \y0.y0 isQid = \y0.1 + y0 mark = \y0.y0 nil = 0 o = 1 ok = \y0.y0 proper = \y0.y0 top = \y0.2y0 tt = 0 u = 0 Using this interpretation, the requirements translate to: [[active(U12(tt))]] = 0 >= 0 = [[mark(tt)]] [[active(U32(tt))]] = 1 > 0 = [[mark(tt)]] [[active(U43(tt))]] = 0 >= 0 = [[mark(tt)]] [[active(U72(tt))]] = 0 >= 0 = [[mark(tt)]] [[active(isPal(_x0))]] = 1 + 2x0 > 2x0 = [[mark(U71(isPalListKind(_x0), _x0))]] [[active(isPalListKind(i))]] = 0 >= 0 = [[mark(tt)]] [[active(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = 2x0 >= 2x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = x0 >= x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = 1 + x1 + 2x0 >= 1 + x1 + 2x0 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 1 + x0 >= 1 + x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = 2x0 >= 2x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = x0 >= x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = x0 >= x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = x0 >= x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[and(active(_x0), _x1)]] [[!6220!6220(_x0, mark(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[mark(!6220!6220(_x0, _x1))]] [[U12(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U12(_x0))]] [[U21(mark(_x0), _x1, _x2)]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[mark(U21(_x0, _x1, _x2))]] [[U23(mark(_x0))]] = x0 >= x0 = [[mark(U23(_x0))]] [[U32(mark(_x0))]] = 1 + x0 >= 1 + x0 = [[mark(U32(_x0))]] [[U41(mark(_x0), _x1, _x2)]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[mark(U41(_x0, _x1, _x2))]] [[U42(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U42(_x0, _x1))]] [[U43(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U43(_x0))]] [[U51(mark(_x0), _x1, _x2)]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[mark(U51(_x0, _x1, _x2))]] [[U52(mark(_x0), _x1)]] = x1 + 2x0 >= x1 + 2x0 = [[mark(U52(_x0, _x1))]] [[U53(mark(_x0))]] = x0 >= x0 = [[mark(U53(_x0))]] [[U61(mark(_x0), _x1)]] = x1 + 2x0 >= x1 + 2x0 = [[mark(U61(_x0, _x1))]] [[U62(mark(_x0))]] = x0 >= x0 = [[mark(U62(_x0))]] [[U72(mark(_x0))]] = x0 >= x0 = [[mark(U72(_x0))]] [[proper(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(nil)]] = 0 >= 0 = [[ok(nil)]] [[proper(U11(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U11(proper(_x0), proper(_x1))]] [[proper(tt)]] = 0 >= 0 = [[ok(tt)]] [[proper(U12(_x0))]] = 2x0 >= 2x0 = [[U12(proper(_x0))]] [[proper(isNeList(_x0))]] = x0 >= x0 = [[isNeList(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U22(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[U22(proper(_x0), proper(_x1))]] [[proper(isList(_x0))]] = 2x0 >= 2x0 = [[isList(proper(_x0))]] [[proper(U23(_x0))]] = x0 >= x0 = [[U23(proper(_x0))]] [[proper(U31(_x0, _x1))]] = 1 + x1 + 2x0 >= 1 + x1 + 2x0 = [[U31(proper(_x0), proper(_x1))]] [[proper(U32(_x0))]] = 1 + x0 >= 1 + x0 = [[U32(proper(_x0))]] [[proper(isQid(_x0))]] = 1 + x0 >= 1 + x0 = [[isQid(proper(_x0))]] [[proper(U41(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U41(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(proper(_x0), proper(_x1))]] [[proper(U43(_x0))]] = 2x0 >= 2x0 = [[U43(proper(_x0))]] [[proper(U51(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U51(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U52(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U52(proper(_x0), proper(_x1))]] [[proper(U53(_x0))]] = x0 >= x0 = [[U53(proper(_x0))]] [[proper(U61(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = x0 >= x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = x0 >= x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = x0 >= x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = x0 >= x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[isPal(proper(_x0))]] [[proper(a)]] = 0 >= 0 = [[ok(a)]] [[proper(e)]] = 0 >= 0 = [[ok(e)]] [[proper(i)]] = 0 >= 0 = [[ok(i)]] [[proper(o)]] = 1 >= 1 = [[ok(o)]] [[proper(u)]] = 0 >= 0 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = x0 >= x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = x0 >= x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = 1 + x1 + 2x0 >= 1 + x1 + 2x0 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = 1 + x0 >= 1 + x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = 1 + x0 >= 1 + x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = x0 >= x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = x0 >= x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = x0 >= x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = x0 >= x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = x0 >= x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[ok(isPal(_x0))]] [[top(mark(_x0))]] = 2x0 >= 2x0 = [[top(proper(_x0))]] [[top(ok(_x0))]] = 2x0 >= 2x0 = [[top(active(_x0))]] We can thus remove the following rules: active(U32(tt)) => mark(tt) active(isPal(X)) => mark(U71(isPalListKind(X), X)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U12(tt)) >? mark(tt) active(U43(tt)) >? mark(tt) active(U72(tt)) >? mark(tt) active(isPalListKind(i)) >? mark(tt) active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U12(mark(X)) >? mark(U12(X)) U21(mark(X), Y, Z) >? mark(U21(X, Y, Z)) U23(mark(X)) >? mark(U23(X)) U32(mark(X)) >? mark(U32(X)) U41(mark(X), Y, Z) >? mark(U41(X, Y, Z)) U42(mark(X), Y) >? mark(U42(X, Y)) U43(mark(X)) >? mark(U43(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U52(mark(X), Y) >? mark(U52(X, Y)) U53(mark(X)) >? mark(U53(X)) U61(mark(X), Y) >? mark(U61(X, Y)) U62(mark(X)) >? mark(U62(X)) U72(mark(X)) >? mark(U72(X)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(nil) >? ok(nil) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(tt) >? ok(tt) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(e) >? ok(e) proper(i) >? ok(i) proper(o) >? ok(o) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(mark(X)) >? top(proper(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.y0 + 2y1 U11 = \y0y1.y1 + 2y0 U12 = \y0.y0 U21 = \y0y1y2.y1 + y2 + 2y0 U22 = \y0y1.y0 + 2y1 U23 = \y0.y0 U31 = \y0y1.2y0 + 2y1 U32 = \y0.2y0 U41 = \y0y1y2.y1 + y2 + 2y0 U42 = \y0y1.y0 + y1 U43 = \y0.2y0 U51 = \y0y1y2.1 + y0 + y1 + y2 U52 = \y0y1.y1 + 2y0 U53 = \y0.y0 U61 = \y0y1.y0 + y1 U62 = \y0.2y0 U71 = \y0y1.y1 + 2y0 U72 = \y0.2y0 a = 0 active = \y0.y0 and = \y0y1.2y0 + 2y1 e = 0 i = 2 isList = \y0.2y0 isNeList = \y0.y0 isNePal = \y0.y0 isPal = \y0.y0 isPalListKind = \y0.2y0 isQid = \y0.y0 mark = \y0.y0 nil = 0 o = 0 ok = \y0.y0 proper = \y0.y0 top = \y0.2y0 tt = 1 u = 0 Using this interpretation, the requirements translate to: [[active(U12(tt))]] = 1 >= 1 = [[mark(tt)]] [[active(U43(tt))]] = 2 > 1 = [[mark(tt)]] [[active(U72(tt))]] = 2 > 1 = [[mark(tt)]] [[active(isPalListKind(i))]] = 4 > 1 = [[mark(tt)]] [[active(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = x0 >= x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = x0 >= x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 2x0 >= 2x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = 2x0 >= 2x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = x0 >= x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = 2x0 >= 2x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = 2x0 >= 2x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[and(active(_x0), _x1)]] [[!6220!6220(_x0, mark(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[mark(!6220!6220(_x0, _x1))]] [[U12(mark(_x0))]] = x0 >= x0 = [[mark(U12(_x0))]] [[U21(mark(_x0), _x1, _x2)]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[mark(U21(_x0, _x1, _x2))]] [[U23(mark(_x0))]] = x0 >= x0 = [[mark(U23(_x0))]] [[U32(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U32(_x0))]] [[U41(mark(_x0), _x1, _x2)]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[mark(U41(_x0, _x1, _x2))]] [[U42(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U42(_x0, _x1))]] [[U43(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U43(_x0))]] [[U51(mark(_x0), _x1, _x2)]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[mark(U51(_x0, _x1, _x2))]] [[U52(mark(_x0), _x1)]] = x1 + 2x0 >= x1 + 2x0 = [[mark(U52(_x0, _x1))]] [[U53(mark(_x0))]] = x0 >= x0 = [[mark(U53(_x0))]] [[U61(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U61(_x0, _x1))]] [[U62(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U62(_x0))]] [[U72(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U72(_x0))]] [[proper(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(nil)]] = 0 >= 0 = [[ok(nil)]] [[proper(U11(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U11(proper(_x0), proper(_x1))]] [[proper(tt)]] = 1 >= 1 = [[ok(tt)]] [[proper(U12(_x0))]] = x0 >= x0 = [[U12(proper(_x0))]] [[proper(isNeList(_x0))]] = x0 >= x0 = [[isNeList(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U22(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[U22(proper(_x0), proper(_x1))]] [[proper(isList(_x0))]] = 2x0 >= 2x0 = [[isList(proper(_x0))]] [[proper(U23(_x0))]] = x0 >= x0 = [[U23(proper(_x0))]] [[proper(U31(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[U31(proper(_x0), proper(_x1))]] [[proper(U32(_x0))]] = 2x0 >= 2x0 = [[U32(proper(_x0))]] [[proper(isQid(_x0))]] = x0 >= x0 = [[isQid(proper(_x0))]] [[proper(U41(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U41(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(proper(_x0), proper(_x1))]] [[proper(U43(_x0))]] = 2x0 >= 2x0 = [[U43(proper(_x0))]] [[proper(U51(_x0, _x1, _x2))]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[U51(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U52(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U52(proper(_x0), proper(_x1))]] [[proper(U53(_x0))]] = x0 >= x0 = [[U53(proper(_x0))]] [[proper(U61(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = 2x0 >= 2x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = 2x0 >= 2x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = x0 >= x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = 2x0 >= 2x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = x0 >= x0 = [[isPal(proper(_x0))]] [[proper(a)]] = 0 >= 0 = [[ok(a)]] [[proper(e)]] = 0 >= 0 = [[ok(e)]] [[proper(i)]] = 2 >= 2 = [[ok(i)]] [[proper(o)]] = 0 >= 0 = [[ok(o)]] [[proper(u)]] = 0 >= 0 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = x0 >= x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = x0 >= x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = x0 >= x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = x0 >= x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = 1 + x0 + x1 + x2 >= 1 + x0 + x1 + x2 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = x0 >= x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = x0 >= x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = x0 >= x0 = [[ok(isPal(_x0))]] [[top(mark(_x0))]] = 2x0 >= 2x0 = [[top(proper(_x0))]] [[top(ok(_x0))]] = 2x0 >= 2x0 = [[top(active(_x0))]] We can thus remove the following rules: active(U43(tt)) => mark(tt) active(U72(tt)) => mark(tt) active(isPalListKind(i)) => mark(tt) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U12(tt)) >? mark(tt) active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U12(mark(X)) >? mark(U12(X)) U21(mark(X), Y, Z) >? mark(U21(X, Y, Z)) U23(mark(X)) >? mark(U23(X)) U32(mark(X)) >? mark(U32(X)) U41(mark(X), Y, Z) >? mark(U41(X, Y, Z)) U42(mark(X), Y) >? mark(U42(X, Y)) U43(mark(X)) >? mark(U43(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U52(mark(X), Y) >? mark(U52(X, Y)) U53(mark(X)) >? mark(U53(X)) U61(mark(X), Y) >? mark(U61(X, Y)) U62(mark(X)) >? mark(U62(X)) U72(mark(X)) >? mark(U72(X)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(nil) >? ok(nil) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(tt) >? ok(tt) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(e) >? ok(e) proper(i) >? ok(i) proper(o) >? ok(o) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(mark(X)) >? top(proper(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.y0 + 2y1 U11 = \y0y1.y0 + y1 U12 = \y0.1 + y0 U21 = \y0y1y2.y0 + y1 + y2 U22 = \y0y1.y0 + y1 U23 = \y0.1 + y0 U31 = \y0y1.y0 + y1 U32 = \y0.2y0 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 U43 = \y0.y0 U51 = \y0y1y2.y1 + y2 + 2y0 U52 = \y0y1.y1 + 2y0 U53 = \y0.y0 U61 = \y0y1.y0 + y1 U62 = \y0.y0 U71 = \y0y1.y0 + y1 U72 = \y0.y0 a = 0 active = \y0.y0 and = \y0y1.y1 + 2y0 e = 0 i = 0 isList = \y0.2y0 isNeList = \y0.y0 isNePal = \y0.y0 isPal = \y0.y0 isPalListKind = \y0.y0 isQid = \y0.y0 mark = \y0.y0 nil = 1 o = 0 ok = \y0.y0 proper = \y0.y0 top = \y0.2y0 tt = 0 u = 0 Using this interpretation, the requirements translate to: [[active(U12(tt))]] = 1 > 0 = [[mark(tt)]] [[active(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = 1 + x0 >= 1 + x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = 1 + x0 >= 1 + x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 2x0 >= 2x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = x0 >= x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = x0 >= x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = x0 >= x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = x0 >= x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[and(active(_x0), _x1)]] [[!6220!6220(_x0, mark(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[mark(!6220!6220(_x0, _x1))]] [[U12(mark(_x0))]] = 1 + x0 >= 1 + x0 = [[mark(U12(_x0))]] [[U21(mark(_x0), _x1, _x2)]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[mark(U21(_x0, _x1, _x2))]] [[U23(mark(_x0))]] = 1 + x0 >= 1 + x0 = [[mark(U23(_x0))]] [[U32(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U32(_x0))]] [[U41(mark(_x0), _x1, _x2)]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[mark(U41(_x0, _x1, _x2))]] [[U42(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U42(_x0, _x1))]] [[U43(mark(_x0))]] = x0 >= x0 = [[mark(U43(_x0))]] [[U51(mark(_x0), _x1, _x2)]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[mark(U51(_x0, _x1, _x2))]] [[U52(mark(_x0), _x1)]] = x1 + 2x0 >= x1 + 2x0 = [[mark(U52(_x0, _x1))]] [[U53(mark(_x0))]] = x0 >= x0 = [[mark(U53(_x0))]] [[U61(mark(_x0), _x1)]] = x0 + x1 >= x0 + x1 = [[mark(U61(_x0, _x1))]] [[U62(mark(_x0))]] = x0 >= x0 = [[mark(U62(_x0))]] [[U72(mark(_x0))]] = x0 >= x0 = [[mark(U72(_x0))]] [[proper(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(nil)]] = 1 >= 1 = [[ok(nil)]] [[proper(U11(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U11(proper(_x0), proper(_x1))]] [[proper(tt)]] = 0 >= 0 = [[ok(tt)]] [[proper(U12(_x0))]] = 1 + x0 >= 1 + x0 = [[U12(proper(_x0))]] [[proper(isNeList(_x0))]] = x0 >= x0 = [[isNeList(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U22(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U22(proper(_x0), proper(_x1))]] [[proper(isList(_x0))]] = 2x0 >= 2x0 = [[isList(proper(_x0))]] [[proper(U23(_x0))]] = 1 + x0 >= 1 + x0 = [[U23(proper(_x0))]] [[proper(U31(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U31(proper(_x0), proper(_x1))]] [[proper(U32(_x0))]] = 2x0 >= 2x0 = [[U32(proper(_x0))]] [[proper(isQid(_x0))]] = x0 >= x0 = [[isQid(proper(_x0))]] [[proper(U41(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U41(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(proper(_x0), proper(_x1))]] [[proper(U43(_x0))]] = x0 >= x0 = [[U43(proper(_x0))]] [[proper(U51(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U51(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U52(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U52(proper(_x0), proper(_x1))]] [[proper(U53(_x0))]] = x0 >= x0 = [[U53(proper(_x0))]] [[proper(U61(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = x0 >= x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = x0 >= x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = x0 >= x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = x0 >= x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = x0 >= x0 = [[isPal(proper(_x0))]] [[proper(a)]] = 0 >= 0 = [[ok(a)]] [[proper(e)]] = 0 >= 0 = [[ok(e)]] [[proper(i)]] = 0 >= 0 = [[ok(i)]] [[proper(o)]] = 0 >= 0 = [[ok(o)]] [[proper(u)]] = 0 >= 0 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = 1 + x0 >= 1 + x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = x0 >= x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = 1 + x0 >= 1 + x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = x0 >= x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = x0 >= x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = x0 >= x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = x0 >= x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = x0 >= x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = x0 >= x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = x0 >= x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = x0 >= x0 = [[ok(isPal(_x0))]] [[top(mark(_x0))]] = 2x0 >= 2x0 = [[top(proper(_x0))]] [[top(ok(_x0))]] = 2x0 >= 2x0 = [[top(active(_x0))]] We can thus remove the following rules: active(U12(tt)) => mark(tt) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U12(mark(X)) >? mark(U12(X)) U21(mark(X), Y, Z) >? mark(U21(X, Y, Z)) U23(mark(X)) >? mark(U23(X)) U32(mark(X)) >? mark(U32(X)) U41(mark(X), Y, Z) >? mark(U41(X, Y, Z)) U42(mark(X), Y) >? mark(U42(X, Y)) U43(mark(X)) >? mark(U43(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U52(mark(X), Y) >? mark(U52(X, Y)) U53(mark(X)) >? mark(U53(X)) U61(mark(X), Y) >? mark(U61(X, Y)) U62(mark(X)) >? mark(U62(X)) U72(mark(X)) >? mark(U72(X)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(nil) >? ok(nil) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(tt) >? ok(tt) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(e) >? ok(e) proper(i) >? ok(i) proper(o) >? ok(o) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(mark(X)) >? top(proper(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.1 + y0 + y1 U11 = \y0y1.y0 + y1 U12 = \y0.2y0 U21 = \y0y1y2.y1 + y2 + 2y0 U22 = \y0y1.2y0 + 2y1 U23 = \y0.y0 U31 = \y0y1.y1 + 2y0 U32 = \y0.2y0 U41 = \y0y1y2.y1 + y2 + 2y0 U42 = \y0y1.y1 + 2y0 U43 = \y0.2y0 U51 = \y0y1y2.y0 + y1 + y2 U52 = \y0y1.y1 + 2y0 U53 = \y0.2y0 U61 = \y0y1.y1 + 2y0 U62 = \y0.y0 U71 = \y0y1.y0 + y1 U72 = \y0.2y0 a = 1 active = \y0.y0 and = \y0y1.1 + y1 + 2y0 e = 1 i = 0 isList = \y0.y0 isNeList = \y0.2y0 isNePal = \y0.2y0 isPal = \y0.y0 isPalListKind = \y0.y0 isQid = \y0.2y0 mark = \y0.2 + y0 nil = 1 o = 1 ok = \y0.y0 proper = \y0.y0 top = \y0.y0 tt = 0 u = 0 Using this interpretation, the requirements translate to: [[active(!6220!6220(_x0, _x1))]] = 1 + x0 + x1 >= 1 + x0 + x1 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = 1 + x0 + x1 >= 1 + x0 + x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = 2x0 >= 2x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = x0 >= x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 2x0 >= 2x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = 2x0 >= 2x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = 2x0 >= 2x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = x0 >= x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = 2x0 >= 2x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = 1 + x1 + 2x0 >= 1 + x1 + 2x0 = [[and(active(_x0), _x1)]] [[!6220!6220(_x0, mark(_x1))]] = 3 + x0 + x1 >= 3 + x0 + x1 = [[mark(!6220!6220(_x0, _x1))]] [[U12(mark(_x0))]] = 4 + 2x0 > 2 + 2x0 = [[mark(U12(_x0))]] [[U21(mark(_x0), _x1, _x2)]] = 4 + x1 + x2 + 2x0 > 2 + x1 + x2 + 2x0 = [[mark(U21(_x0, _x1, _x2))]] [[U23(mark(_x0))]] = 2 + x0 >= 2 + x0 = [[mark(U23(_x0))]] [[U32(mark(_x0))]] = 4 + 2x0 > 2 + 2x0 = [[mark(U32(_x0))]] [[U41(mark(_x0), _x1, _x2)]] = 4 + x1 + x2 + 2x0 > 2 + x1 + x2 + 2x0 = [[mark(U41(_x0, _x1, _x2))]] [[U42(mark(_x0), _x1)]] = 4 + x1 + 2x0 > 2 + x1 + 2x0 = [[mark(U42(_x0, _x1))]] [[U43(mark(_x0))]] = 4 + 2x0 > 2 + 2x0 = [[mark(U43(_x0))]] [[U51(mark(_x0), _x1, _x2)]] = 2 + x0 + x1 + x2 >= 2 + x0 + x1 + x2 = [[mark(U51(_x0, _x1, _x2))]] [[U52(mark(_x0), _x1)]] = 4 + x1 + 2x0 > 2 + x1 + 2x0 = [[mark(U52(_x0, _x1))]] [[U53(mark(_x0))]] = 4 + 2x0 > 2 + 2x0 = [[mark(U53(_x0))]] [[U61(mark(_x0), _x1)]] = 4 + x1 + 2x0 > 2 + x1 + 2x0 = [[mark(U61(_x0, _x1))]] [[U62(mark(_x0))]] = 2 + x0 >= 2 + x0 = [[mark(U62(_x0))]] [[U72(mark(_x0))]] = 4 + 2x0 > 2 + 2x0 = [[mark(U72(_x0))]] [[proper(!6220!6220(_x0, _x1))]] = 1 + x0 + x1 >= 1 + x0 + x1 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(nil)]] = 1 >= 1 = [[ok(nil)]] [[proper(U11(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U11(proper(_x0), proper(_x1))]] [[proper(tt)]] = 0 >= 0 = [[ok(tt)]] [[proper(U12(_x0))]] = 2x0 >= 2x0 = [[U12(proper(_x0))]] [[proper(isNeList(_x0))]] = 2x0 >= 2x0 = [[isNeList(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U22(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[U22(proper(_x0), proper(_x1))]] [[proper(isList(_x0))]] = x0 >= x0 = [[isList(proper(_x0))]] [[proper(U23(_x0))]] = x0 >= x0 = [[U23(proper(_x0))]] [[proper(U31(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U31(proper(_x0), proper(_x1))]] [[proper(U32(_x0))]] = 2x0 >= 2x0 = [[U32(proper(_x0))]] [[proper(isQid(_x0))]] = 2x0 >= 2x0 = [[isQid(proper(_x0))]] [[proper(U41(_x0, _x1, _x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[U41(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U42(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U42(proper(_x0), proper(_x1))]] [[proper(U43(_x0))]] = 2x0 >= 2x0 = [[U43(proper(_x0))]] [[proper(U51(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U51(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U52(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U52(proper(_x0), proper(_x1))]] [[proper(U53(_x0))]] = 2x0 >= 2x0 = [[U53(proper(_x0))]] [[proper(U61(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = x0 >= x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = 2x0 >= 2x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 2x0 >= 2x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = 1 + x1 + 2x0 >= 1 + x1 + 2x0 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = x0 >= x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = x0 >= x0 = [[isPal(proper(_x0))]] [[proper(a)]] = 1 >= 1 = [[ok(a)]] [[proper(e)]] = 1 >= 1 = [[ok(e)]] [[proper(i)]] = 0 >= 0 = [[ok(i)]] [[proper(o)]] = 1 >= 1 = [[ok(o)]] [[proper(u)]] = 0 >= 0 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = 1 + x0 + x1 >= 1 + x0 + x1 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = x0 >= x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = x0 >= x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = x0 >= x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = 1 + x1 + 2x0 >= 1 + x1 + 2x0 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = x0 >= x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = x0 >= x0 = [[ok(isPal(_x0))]] [[top(mark(_x0))]] = 2 + x0 > x0 = [[top(proper(_x0))]] [[top(ok(_x0))]] = x0 >= x0 = [[top(active(_x0))]] We can thus remove the following rules: U12(mark(X)) => mark(U12(X)) U21(mark(X), Y, Z) => mark(U21(X, Y, Z)) U32(mark(X)) => mark(U32(X)) U41(mark(X), Y, Z) => mark(U41(X, Y, Z)) U42(mark(X), Y) => mark(U42(X, Y)) U43(mark(X)) => mark(U43(X)) U52(mark(X), Y) => mark(U52(X, Y)) U53(mark(X)) => mark(U53(X)) U61(mark(X), Y) => mark(U61(X, Y)) U72(mark(X)) => mark(U72(X)) top(mark(X)) => top(proper(X)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U23(mark(X)) >? mark(U23(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U62(mark(X)) >? mark(U62(X)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(nil) >? ok(nil) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(tt) >? ok(tt) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(e) >? ok(e) proper(i) >? ok(i) proper(o) >? ok(o) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.y0 + y1 U11 = \y0y1.y0 + y1 U12 = \y0.2y0 U21 = \y0y1y2.y1 + 2y0 + 2y2 U22 = \y0y1.2y0 + 2y1 U23 = \y0.y0 U31 = \y0y1.y0 + y1 U32 = \y0.2y0 U41 = \y0y1y2.y2 + 2y0 + 2y1 U42 = \y0y1.y0 + y1 U43 = \y0.2y0 U51 = \y0y1y2.y1 + y2 + 2y0 U52 = \y0y1.y1 + 2y0 U53 = \y0.y0 U61 = \y0y1.y0 + y1 U62 = \y0.2y0 U71 = \y0y1.y0 + 2y1 U72 = \y0.y0 a = 0 active = \y0.2y0 and = \y0y1.y1 + 2y0 e = 3 i = 0 isList = \y0.2y0 isNeList = \y0.y0 isNePal = \y0.y0 isPal = \y0.2y0 isPalListKind = \y0.y0 isQid = \y0.y0 mark = \y0.y0 nil = 3 o = 3 ok = \y0.2y0 proper = \y0.3y0 top = \y0.y0 tt = 0 u = 0 Using this interpretation, the requirements translate to: [[active(!6220!6220(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = 2x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = 4x0 >= 4x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = 2x1 + 4x0 + 4x2 >= x1 + 2x2 + 4x0 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = 4x0 + 4x1 >= 2x1 + 4x0 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = 2x0 >= 2x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 4x0 >= 4x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = 2x2 + 4x0 + 4x1 >= x2 + 2x1 + 4x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = 4x0 >= 4x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = 2x1 + 2x2 + 4x0 >= x1 + x2 + 4x0 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = 2x0 >= 2x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = 4x0 >= 4x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = 2x0 + 4x1 >= 2x0 + 2x1 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = 2x0 >= 2x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[and(active(_x0), _x1)]] [[!6220!6220(_x0, mark(_x1))]] = x0 + x1 >= x0 + x1 = [[mark(!6220!6220(_x0, _x1))]] [[U23(mark(_x0))]] = x0 >= x0 = [[mark(U23(_x0))]] [[U51(mark(_x0), _x1, _x2)]] = x1 + x2 + 2x0 >= x1 + x2 + 2x0 = [[mark(U51(_x0, _x1, _x2))]] [[U62(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U62(_x0))]] [[proper(!6220!6220(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(nil)]] = 9 > 6 = [[ok(nil)]] [[proper(U11(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U11(proper(_x0), proper(_x1))]] [[proper(tt)]] = 0 >= 0 = [[ok(tt)]] [[proper(U12(_x0))]] = 6x0 >= 6x0 = [[U12(proper(_x0))]] [[proper(isNeList(_x0))]] = 3x0 >= 3x0 = [[isNeList(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = 3x1 + 6x0 + 6x2 >= 3x1 + 6x0 + 6x2 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U22(_x0, _x1))]] = 6x0 + 6x1 >= 6x0 + 6x1 = [[U22(proper(_x0), proper(_x1))]] [[proper(isList(_x0))]] = 6x0 >= 6x0 = [[isList(proper(_x0))]] [[proper(U23(_x0))]] = 3x0 >= 3x0 = [[U23(proper(_x0))]] [[proper(U31(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U31(proper(_x0), proper(_x1))]] [[proper(U32(_x0))]] = 6x0 >= 6x0 = [[U32(proper(_x0))]] [[proper(isQid(_x0))]] = 3x0 >= 3x0 = [[isQid(proper(_x0))]] [[proper(U41(_x0, _x1, _x2))]] = 3x2 + 6x0 + 6x1 >= 3x2 + 6x0 + 6x1 = [[U41(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U42(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U42(proper(_x0), proper(_x1))]] [[proper(U43(_x0))]] = 6x0 >= 6x0 = [[U43(proper(_x0))]] [[proper(U51(_x0, _x1, _x2))]] = 3x1 + 3x2 + 6x0 >= 3x1 + 3x2 + 6x0 = [[U51(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U52(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[U52(proper(_x0), proper(_x1))]] [[proper(U53(_x0))]] = 3x0 >= 3x0 = [[U53(proper(_x0))]] [[proper(U61(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = 6x0 >= 6x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = 3x0 + 6x1 >= 3x0 + 6x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = 3x0 >= 3x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 3x0 >= 3x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = 3x0 >= 3x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = 6x0 >= 6x0 = [[isPal(proper(_x0))]] [[proper(a)]] = 0 >= 0 = [[ok(a)]] [[proper(e)]] = 9 > 6 = [[ok(e)]] [[proper(i)]] = 0 >= 0 = [[ok(i)]] [[proper(o)]] = 9 > 6 = [[ok(o)]] [[proper(u)]] = 0 >= 0 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = 4x0 >= 4x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = 2x1 + 4x0 + 4x2 >= 2x1 + 4x0 + 4x2 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = 4x0 + 4x1 >= 4x0 + 4x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = 4x0 >= 4x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = 4x0 >= 4x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = 2x2 + 4x0 + 4x1 >= 2x2 + 4x0 + 4x1 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = 4x0 >= 4x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = 2x1 + 2x2 + 4x0 >= 2x1 + 2x2 + 4x0 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = 4x0 >= 4x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = 2x0 + 4x1 >= 2x0 + 4x1 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = 4x0 >= 4x0 = [[ok(isPal(_x0))]] [[top(ok(_x0))]] = 2x0 >= 2x0 = [[top(active(_x0))]] We can thus remove the following rules: proper(nil) => ok(nil) proper(e) => ok(e) proper(o) => ok(o) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U23(mark(X)) >? mark(U23(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U62(mark(X)) >? mark(U62(X)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(tt) >? ok(tt) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(i) >? ok(i) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.y1 + 2y0 U11 = \y0y1.y0 + y1 U12 = \y0.y0 U21 = \y0y1y2.y0 + y1 + y2 U22 = \y0y1.y1 + 2y0 U23 = \y0.y0 U31 = \y0y1.y0 + y1 U32 = \y0.2y0 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y1 + 2y0 U43 = \y0.y0 U51 = \y0y1y2.y0 + 2y1 + 2y2 U52 = \y0y1.y1 + 2y0 U53 = \y0.y0 U61 = \y0y1.y1 + 2y0 U62 = \y0.2y0 U71 = \y0y1.y1 + 2y0 U72 = \y0.2y0 a = 0 active = \y0.2y0 and = \y0y1.y0 + y1 i = 0 isList = \y0.y0 isNeList = \y0.2y0 isNePal = \y0.y0 isPal = \y0.2y0 isPalListKind = \y0.y0 isQid = \y0.y0 mark = \y0.y0 ok = \y0.2y0 proper = \y0.3y0 top = \y0.y0 tt = 1 u = 0 Using this interpretation, the requirements translate to: [[active(!6220!6220(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = 2x1 + 4x0 >= 2x0 + 2x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = 2x0 >= 2x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = 2x0 + 2x1 + 2x2 >= x1 + x2 + 2x0 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = 2x0 >= 2x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 4x0 >= 4x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = 2x0 + 2x1 + 2x2 >= x1 + x2 + 2x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = 2x0 >= 2x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = 2x0 + 4x1 + 4x2 >= 2x0 + 2x1 + 2x2 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = 2x0 >= 2x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = 4x0 >= 4x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = 4x0 >= 4x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[and(active(_x0), _x1)]] [[!6220!6220(_x0, mark(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[mark(!6220!6220(_x0, _x1))]] [[U23(mark(_x0))]] = x0 >= x0 = [[mark(U23(_x0))]] [[U51(mark(_x0), _x1, _x2)]] = x0 + 2x1 + 2x2 >= x0 + 2x1 + 2x2 = [[mark(U51(_x0, _x1, _x2))]] [[U62(mark(_x0))]] = 2x0 >= 2x0 = [[mark(U62(_x0))]] [[proper(!6220!6220(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(U11(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U11(proper(_x0), proper(_x1))]] [[proper(tt)]] = 3 > 2 = [[ok(tt)]] [[proper(U12(_x0))]] = 3x0 >= 3x0 = [[U12(proper(_x0))]] [[proper(isNeList(_x0))]] = 6x0 >= 6x0 = [[isNeList(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = 3x0 + 3x1 + 3x2 >= 3x0 + 3x1 + 3x2 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U22(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[U22(proper(_x0), proper(_x1))]] [[proper(isList(_x0))]] = 3x0 >= 3x0 = [[isList(proper(_x0))]] [[proper(U23(_x0))]] = 3x0 >= 3x0 = [[U23(proper(_x0))]] [[proper(U31(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U31(proper(_x0), proper(_x1))]] [[proper(U32(_x0))]] = 6x0 >= 6x0 = [[U32(proper(_x0))]] [[proper(isQid(_x0))]] = 3x0 >= 3x0 = [[isQid(proper(_x0))]] [[proper(U41(_x0, _x1, _x2))]] = 3x0 + 3x1 + 3x2 >= 3x0 + 3x1 + 3x2 = [[U41(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U42(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[U42(proper(_x0), proper(_x1))]] [[proper(U43(_x0))]] = 3x0 >= 3x0 = [[U43(proper(_x0))]] [[proper(U51(_x0, _x1, _x2))]] = 3x0 + 6x1 + 6x2 >= 3x0 + 6x1 + 6x2 = [[U51(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U52(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[U52(proper(_x0), proper(_x1))]] [[proper(U53(_x0))]] = 3x0 >= 3x0 = [[U53(proper(_x0))]] [[proper(U61(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = 6x0 >= 6x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = 6x0 >= 6x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 3x0 >= 3x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = 3x0 >= 3x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = 6x0 >= 6x0 = [[isPal(proper(_x0))]] [[proper(a)]] = 0 >= 0 = [[ok(a)]] [[proper(i)]] = 0 >= 0 = [[ok(i)]] [[proper(u)]] = 0 >= 0 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = 4x0 >= 4x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = 2x0 + 2x1 + 2x2 >= 2x0 + 2x1 + 2x2 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = 4x0 >= 4x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = 2x0 + 2x1 + 2x2 >= 2x0 + 2x1 + 2x2 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = 2x0 + 4x1 + 4x2 >= 2x0 + 4x1 + 4x2 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = 4x0 >= 4x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = 4x0 >= 4x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = 4x0 >= 4x0 = [[ok(isPal(_x0))]] [[top(ok(_x0))]] = 2x0 >= 2x0 = [[top(active(_x0))]] We can thus remove the following rules: proper(tt) => ok(tt) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) !6220!6220(X, mark(Y)) >? mark(!6220!6220(X, Y)) U23(mark(X)) >? mark(U23(X)) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) U62(mark(X)) >? mark(U62(X)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(U11(X, Y)) >? U11(proper(X), proper(Y)) proper(U12(X)) >? U12(proper(X)) proper(isNeList(X)) >? isNeList(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U22(X, Y)) >? U22(proper(X), proper(Y)) proper(isList(X)) >? isList(proper(X)) proper(U23(X)) >? U23(proper(X)) proper(U31(X, Y)) >? U31(proper(X), proper(Y)) proper(U32(X)) >? U32(proper(X)) proper(isQid(X)) >? isQid(proper(X)) proper(U41(X, Y, Z)) >? U41(proper(X), proper(Y), proper(Z)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U43(X)) >? U43(proper(X)) proper(U51(X, Y, Z)) >? U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) >? U52(proper(X), proper(Y)) proper(U53(X)) >? U53(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(a) >? ok(a) proper(i) >? ok(i) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.y0 + 2y1 U11 = \y0y1.2 + y0 + y1 U12 = \y0.y0 U21 = \y0y1y2.y2 + 2y0 + 2y1 U22 = \y0y1.2 + y0 + y1 U23 = \y0.2 + 2y0 U31 = \y0y1.2 + y0 + y1 U32 = \y0.y0 U41 = \y0y1y2.3 + y0 + y1 + y2 U42 = \y0y1.y0 + y1 U43 = \y0.1 + y0 U51 = \y0y1y2.2 + y0 + y1 + y2 U52 = \y0y1.2 + y0 + y1 U53 = \y0.1 + y0 U61 = \y0y1.y0 + y1 U62 = \y0.2y0 U71 = \y0y1.y1 + 2y0 U72 = \y0.y0 a = 3 active = \y0.y0 and = \y0y1.y1 + 2y0 i = 3 isList = \y0.2 + y0 isNeList = \y0.2 + 2y0 isNePal = \y0.2y0 isPal = \y0.y0 isPalListKind = \y0.2y0 isQid = \y0.2 + y0 mark = \y0.2 + y0 ok = \y0.y0 proper = \y0.3y0 top = \y0.y0 u = 0 Using this interpretation, the requirements translate to: [[active(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = x0 >= x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = x2 + 2x0 + 2x1 >= x2 + 2x0 + 2x1 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = 2 + 2x0 >= 2 + 2x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = x0 >= x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = 3 + x0 + x1 + x2 >= 3 + x0 + x1 + x2 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = 1 + x0 >= 1 + x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = 2 + x0 + x1 + x2 >= 2 + x0 + x1 + x2 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = 1 + x0 >= 1 + x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = 2x0 >= 2x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = x0 >= x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[and(active(_x0), _x1)]] [[!6220!6220(_x0, mark(_x1))]] = 4 + x0 + 2x1 > 2 + x0 + 2x1 = [[mark(!6220!6220(_x0, _x1))]] [[U23(mark(_x0))]] = 6 + 2x0 > 4 + 2x0 = [[mark(U23(_x0))]] [[U51(mark(_x0), _x1, _x2)]] = 4 + x0 + x1 + x2 >= 4 + x0 + x1 + x2 = [[mark(U51(_x0, _x1, _x2))]] [[U62(mark(_x0))]] = 4 + 2x0 > 2 + 2x0 = [[mark(U62(_x0))]] [[proper(!6220!6220(_x0, _x1))]] = 3x0 + 6x1 >= 3x0 + 6x1 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(U11(_x0, _x1))]] = 6 + 3x0 + 3x1 > 2 + 3x0 + 3x1 = [[U11(proper(_x0), proper(_x1))]] [[proper(U12(_x0))]] = 3x0 >= 3x0 = [[U12(proper(_x0))]] [[proper(isNeList(_x0))]] = 6 + 6x0 > 2 + 6x0 = [[isNeList(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = 3x2 + 6x0 + 6x1 >= 3x2 + 6x0 + 6x1 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U22(_x0, _x1))]] = 6 + 3x0 + 3x1 > 2 + 3x0 + 3x1 = [[U22(proper(_x0), proper(_x1))]] [[proper(isList(_x0))]] = 6 + 3x0 > 2 + 3x0 = [[isList(proper(_x0))]] [[proper(U23(_x0))]] = 6 + 6x0 > 2 + 6x0 = [[U23(proper(_x0))]] [[proper(U31(_x0, _x1))]] = 6 + 3x0 + 3x1 > 2 + 3x0 + 3x1 = [[U31(proper(_x0), proper(_x1))]] [[proper(U32(_x0))]] = 3x0 >= 3x0 = [[U32(proper(_x0))]] [[proper(isQid(_x0))]] = 6 + 3x0 > 2 + 3x0 = [[isQid(proper(_x0))]] [[proper(U41(_x0, _x1, _x2))]] = 9 + 3x0 + 3x1 + 3x2 > 3 + 3x0 + 3x1 + 3x2 = [[U41(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U42(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U42(proper(_x0), proper(_x1))]] [[proper(U43(_x0))]] = 3 + 3x0 > 1 + 3x0 = [[U43(proper(_x0))]] [[proper(U51(_x0, _x1, _x2))]] = 6 + 3x0 + 3x1 + 3x2 > 2 + 3x0 + 3x1 + 3x2 = [[U51(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U52(_x0, _x1))]] = 6 + 3x0 + 3x1 > 2 + 3x0 + 3x1 = [[U52(proper(_x0), proper(_x1))]] [[proper(U53(_x0))]] = 3 + 3x0 > 1 + 3x0 = [[U53(proper(_x0))]] [[proper(U61(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = 6x0 >= 6x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = 3x0 >= 3x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 6x0 >= 6x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = 6x0 >= 6x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = 3x0 >= 3x0 = [[isPal(proper(_x0))]] [[proper(a)]] = 9 > 3 = [[ok(a)]] [[proper(i)]] = 9 > 3 = [[ok(i)]] [[proper(u)]] = 0 >= 0 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = x0 + 2x1 >= x0 + 2x1 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = x0 >= x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = 2 + 2x0 >= 2 + 2x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = x2 + 2x0 + 2x1 >= x2 + 2x0 + 2x1 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = 2 + x0 >= 2 + x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = 2 + 2x0 >= 2 + 2x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = x0 >= x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = 2 + x0 >= 2 + x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = 3 + x0 + x1 + x2 >= 3 + x0 + x1 + x2 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = 1 + x0 >= 1 + x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = 2 + x0 + x1 + x2 >= 2 + x0 + x1 + x2 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = 1 + x0 >= 1 + x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = x0 >= x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = x0 >= x0 = [[ok(isPal(_x0))]] [[top(ok(_x0))]] = x0 >= x0 = [[top(active(_x0))]] We can thus remove the following rules: !6220!6220(X, mark(Y)) => mark(!6220!6220(X, Y)) U23(mark(X)) => mark(U23(X)) U62(mark(X)) => mark(U62(X)) proper(U11(X, Y)) => U11(proper(X), proper(Y)) proper(isNeList(X)) => isNeList(proper(X)) proper(U22(X, Y)) => U22(proper(X), proper(Y)) proper(isList(X)) => isList(proper(X)) proper(U23(X)) => U23(proper(X)) proper(U31(X, Y)) => U31(proper(X), proper(Y)) proper(isQid(X)) => isQid(proper(X)) proper(U41(X, Y, Z)) => U41(proper(X), proper(Y), proper(Z)) proper(U43(X)) => U43(proper(X)) proper(U51(X, Y, Z)) => U51(proper(X), proper(Y), proper(Z)) proper(U52(X, Y)) => U52(proper(X), proper(Y)) proper(U53(X)) => U53(proper(X)) proper(a) => ok(a) proper(i) => ok(i) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) U51(mark(X), Y, Z) >? mark(U51(X, Y, Z)) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(U12(X)) >? U12(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U32(X)) >? U32(proper(X)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) proper(u) >? ok(u) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.y0 + 2y1 U11 = \y0y1.y1 + 2y0 U12 = \y0.y0 U21 = \y0y1y2.y0 + y2 + 2y1 U22 = \y0y1.y0 + y1 U23 = \y0.y0 U31 = \y0y1.y1 + 2y0 U32 = \y0.y0 U41 = \y0y1y2.y1 + y2 + 2y0 U42 = \y0y1.y1 + 2y0 U43 = \y0.y0 U51 = \y0y1y2.y1 + y2 + 2y0 U52 = \y0y1.y0 + y1 U53 = \y0.2y0 U61 = \y0y1.y1 + 2y0 U62 = \y0.y0 U71 = \y0y1.y0 + y1 U72 = \y0.y0 active = \y0.2y0 and = \y0y1.y1 + 2y0 isList = \y0.3y0 isNeList = \y0.3y0 isNePal = \y0.y0 isPal = \y0.2y0 isPalListKind = \y0.2y0 isQid = \y0.3y0 mark = \y0.1 + y0 ok = \y0.2y0 proper = \y0.3y0 top = \y0.y0 u = 3 Using this interpretation, the requirements translate to: [[active(!6220!6220(_x0, _x1))]] = 2x0 + 4x1 >= 2x0 + 2x1 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = 2x0 + 4x1 >= x0 + 4x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = 2x0 >= 2x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = 2x0 + 2x2 + 4x1 >= x2 + 2x0 + 2x1 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = 2x0 >= 2x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 2x0 >= 2x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = 2x1 + 2x2 + 4x0 >= x1 + x2 + 4x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = 2x0 >= 2x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = 2x1 + 2x2 + 4x0 >= x1 + x2 + 4x0 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = 4x0 >= 4x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = 2x0 >= 2x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = 2x0 >= 2x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[and(active(_x0), _x1)]] [[U51(mark(_x0), _x1, _x2)]] = 2 + x1 + x2 + 2x0 > 1 + x1 + x2 + 2x0 = [[mark(U51(_x0, _x1, _x2))]] [[proper(!6220!6220(_x0, _x1))]] = 3x0 + 6x1 >= 3x0 + 6x1 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(U12(_x0))]] = 3x0 >= 3x0 = [[U12(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = 3x0 + 3x2 + 6x1 >= 3x0 + 3x2 + 6x1 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U32(_x0))]] = 3x0 >= 3x0 = [[U32(proper(_x0))]] [[proper(U42(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[U42(proper(_x0), proper(_x1))]] [[proper(U61(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = 3x0 >= 3x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = 3x0 >= 3x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 3x0 >= 3x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = 3x1 + 6x0 >= 3x1 + 6x0 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = 6x0 >= 6x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = 6x0 >= 6x0 = [[isPal(proper(_x0))]] [[proper(u)]] = 9 > 6 = [[ok(u)]] [[!6220!6220(ok(_x0), ok(_x1))]] = 2x0 + 4x1 >= 2x0 + 4x1 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = 6x0 >= 6x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = 2x0 + 2x2 + 4x1 >= 2x0 + 2x2 + 4x1 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = 6x0 >= 6x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = 6x0 >= 6x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = 2x1 + 2x2 + 4x0 >= 2x1 + 2x2 + 4x0 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = 2x1 + 2x2 + 4x0 >= 2x1 + 2x2 + 4x0 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = 4x0 >= 4x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = 2x0 >= 2x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = 4x0 >= 4x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = 4x0 >= 4x0 = [[ok(isPal(_x0))]] [[top(ok(_x0))]] = 2x0 >= 2x0 = [[top(active(_x0))]] We can thus remove the following rules: U51(mark(X), Y, Z) => mark(U51(X, Y, Z)) proper(u) => ok(u) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) proper(!6220!6220(X, Y)) >? !6220!6220(proper(X), proper(Y)) proper(U12(X)) >? U12(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U32(X)) >? U32(proper(X)) proper(U42(X, Y)) >? U42(proper(X), proper(Y)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.2 + y0 + y1 U11 = \y0y1.y1 + 2y0 U12 = \y0.y0 U21 = \y0y1y2.y0 + y1 + y2 U22 = \y0y1.1 + y0 + y1 U23 = \y0.y0 U31 = \y0y1.y1 + 2y0 U32 = \y0.y0 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.1 + y1 + 2y0 U43 = \y0.y0 U51 = \y0y1y2.y0 + y1 + y2 U52 = \y0y1.y0 + y1 U53 = \y0.y0 U61 = \y0y1.y0 + y1 U62 = \y0.y0 U71 = \y0y1.y0 + y1 U72 = \y0.y0 active = \y0.y0 and = \y0y1.y0 + y1 isList = \y0.y0 isNeList = \y0.y0 isNePal = \y0.y0 isPal = \y0.y0 isPalListKind = \y0.2y0 isQid = \y0.y0 ok = \y0.y0 proper = \y0.2y0 top = \y0.2y0 Using this interpretation, the requirements translate to: [[active(!6220!6220(_x0, _x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = x0 >= x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = 1 + x0 + x1 >= 1 + x0 + x1 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = x0 >= x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = x1 + 2x0 >= x1 + 2x0 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = x0 >= x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 1 + x1 + 2x0 >= 1 + x1 + 2x0 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = x0 >= x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = x0 >= x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = x0 >= x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = x0 >= x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = x0 + x1 >= x0 + x1 = [[and(active(_x0), _x1)]] [[proper(!6220!6220(_x0, _x1))]] = 4 + 2x0 + 2x1 > 2 + 2x0 + 2x1 = [[!6220!6220(proper(_x0), proper(_x1))]] [[proper(U12(_x0))]] = 2x0 >= 2x0 = [[U12(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = 2x0 + 2x1 + 2x2 >= 2x0 + 2x1 + 2x2 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U32(_x0))]] = 2x0 >= 2x0 = [[U32(proper(_x0))]] [[proper(U42(_x0, _x1))]] = 2 + 2x1 + 4x0 > 1 + 2x1 + 4x0 = [[U42(proper(_x0), proper(_x1))]] [[proper(U61(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = 2x0 >= 2x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = 2x0 >= 2x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 2x0 >= 2x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = 4x0 >= 4x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = 2x0 >= 2x0 = [[isPal(proper(_x0))]] [[!6220!6220(ok(_x0), ok(_x1))]] = 2 + x0 + x1 >= 2 + x0 + x1 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = x0 >= x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = x0 >= x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = 1 + x0 + x1 >= 1 + x0 + x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = x0 >= x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = x0 >= x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = x1 + 2x0 >= x1 + 2x0 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = x0 >= x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = x0 >= x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = 1 + x1 + 2x0 >= 1 + x1 + 2x0 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = x0 >= x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = x0 + x1 + x2 >= x0 + x1 + x2 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = x0 >= x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = x0 >= x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = x0 >= x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = x0 >= x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = x0 + x1 >= x0 + x1 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = 2x0 >= 2x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = x0 >= x0 = [[ok(isPal(_x0))]] [[top(ok(_x0))]] = 2x0 >= 2x0 = [[top(active(_x0))]] We can thus remove the following rules: proper(!6220!6220(X, Y)) => !6220!6220(proper(X), proper(Y)) proper(U42(X, Y)) => U42(proper(X), proper(Y)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U23(X)) >? U23(active(X)) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U51(X, Y, Z)) >? U51(active(X), Y, Z) active(U52(X, Y)) >? U52(active(X), Y) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) proper(U12(X)) >? U12(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U32(X)) >? U32(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPalListKind(X)) >? isPalListKind(proper(X)) proper(isPal(X)) >? isPal(proper(X)) !6220!6220(ok(X), ok(Y)) >? ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) >? ok(U11(X, Y)) U12(ok(X)) >? ok(U12(X)) isNeList(ok(X)) >? ok(isNeList(X)) U21(ok(X), ok(Y), ok(Z)) >? ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) >? ok(U22(X, Y)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U31(ok(X), ok(Y)) >? ok(U31(X, Y)) U32(ok(X)) >? ok(U32(X)) isQid(ok(X)) >? ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) >? ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) >? ok(U42(X, Y)) U43(ok(X)) >? ok(U43(X)) U51(ok(X), ok(Y), ok(Z)) >? ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) >? ok(U52(X, Y)) U53(ok(X)) >? ok(U53(X)) U61(ok(X), ok(Y)) >? ok(U61(X, Y)) U62(ok(X)) >? ok(U62(X)) U71(ok(X), ok(Y)) >? ok(U71(X, Y)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) and(ok(X), ok(Y)) >? ok(and(X, Y)) isPalListKind(ok(X)) >? ok(isPalListKind(X)) isPal(ok(X)) >? ok(isPal(X)) top(ok(X)) >? top(active(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.y0 + y1 U11 = \y0y1.y0 + y1 U12 = \y0.2y0 U21 = \y0y1y2.y0 + 2y1 + 2y2 U22 = \y0y1.y0 + 2y1 U23 = \y0.1 + 2y0 U31 = \y0y1.y0 + 2y1 U32 = \y0.2y0 U41 = \y0y1y2.y2 + 2y0 + 2y1 U42 = \y0y1.y0 + y1 U43 = \y0.y0 U51 = \y0y1y2.1 + 2y0 + 2y1 + 2y2 U52 = \y0y1.1 + 2y0 + 2y1 U53 = \y0.2y0 U61 = \y0y1.y1 + 2y0 U62 = \y0.y0 U71 = \y0y1.y0 + 2y1 U72 = \y0.y0 active = \y0.2y0 and = \y0y1.2y0 + 2y1 isList = \y0.y0 isNeList = \y0.y0 isNePal = \y0.y0 isPal = \y0.y0 isPalListKind = \y0.1 + 3y0 isQid = \y0.2y0 ok = \y0.1 + 2y0 proper = \y0.2y0 top = \y0.y0 Using this interpretation, the requirements translate to: [[active(!6220!6220(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = 2x0 + 2x1 >= x0 + 2x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = 4x0 >= 4x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = 2x0 + 4x1 + 4x2 >= 2x0 + 2x1 + 2x2 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = 2x0 + 4x1 >= 2x0 + 2x1 = [[U22(active(_x0), _x1)]] [[active(U23(_x0))]] = 2 + 4x0 > 1 + 4x0 = [[U23(active(_x0))]] [[active(U31(_x0, _x1))]] = 2x0 + 4x1 >= 2x0 + 2x1 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 4x0 >= 4x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = 2x2 + 4x0 + 4x1 >= x2 + 2x1 + 4x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 2x0 + 2x1 >= x1 + 2x0 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = 2x0 >= 2x0 = [[U43(active(_x0))]] [[active(U51(_x0, _x1, _x2))]] = 2 + 4x0 + 4x1 + 4x2 > 1 + 2x1 + 2x2 + 4x0 = [[U51(active(_x0), _x1, _x2)]] [[active(U52(_x0, _x1))]] = 2 + 4x0 + 4x1 > 1 + 2x1 + 4x0 = [[U52(active(_x0), _x1)]] [[active(U53(_x0))]] = 4x0 >= 4x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = 2x1 + 4x0 >= x1 + 4x0 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = 2x0 >= 2x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = 2x0 + 4x1 >= 2x0 + 2x1 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = 2x0 >= 2x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = 4x0 + 4x1 >= 2x1 + 4x0 = [[and(active(_x0), _x1)]] [[proper(U12(_x0))]] = 4x0 >= 4x0 = [[U12(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = 2x0 + 4x1 + 4x2 >= 2x0 + 4x1 + 4x2 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U32(_x0))]] = 4x0 >= 4x0 = [[U32(proper(_x0))]] [[proper(U61(_x0, _x1))]] = 2x1 + 4x0 >= 2x1 + 4x0 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = 2x0 >= 2x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = 2x0 + 4x1 >= 2x0 + 4x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = 2x0 >= 2x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 2x0 >= 2x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = 4x0 + 4x1 >= 4x0 + 4x1 = [[and(proper(_x0), proper(_x1))]] [[proper(isPalListKind(_x0))]] = 2 + 6x0 > 1 + 6x0 = [[isPalListKind(proper(_x0))]] [[proper(isPal(_x0))]] = 2x0 >= 2x0 = [[isPal(proper(_x0))]] [[!6220!6220(ok(_x0), ok(_x1))]] = 2 + 2x0 + 2x1 > 1 + 2x0 + 2x1 = [[ok(!6220!6220(_x0, _x1))]] [[U11(ok(_x0), ok(_x1))]] = 2 + 2x0 + 2x1 > 1 + 2x0 + 2x1 = [[ok(U11(_x0, _x1))]] [[U12(ok(_x0))]] = 2 + 4x0 > 1 + 4x0 = [[ok(U12(_x0))]] [[isNeList(ok(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[ok(isNeList(_x0))]] [[U21(ok(_x0), ok(_x1), ok(_x2))]] = 5 + 2x0 + 4x1 + 4x2 > 1 + 2x0 + 4x1 + 4x2 = [[ok(U21(_x0, _x1, _x2))]] [[U22(ok(_x0), ok(_x1))]] = 3 + 2x0 + 4x1 > 1 + 2x0 + 4x1 = [[ok(U22(_x0, _x1))]] [[isList(ok(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = 3 + 4x0 >= 3 + 4x0 = [[ok(U23(_x0))]] [[U31(ok(_x0), ok(_x1))]] = 3 + 2x0 + 4x1 > 1 + 2x0 + 4x1 = [[ok(U31(_x0, _x1))]] [[U32(ok(_x0))]] = 2 + 4x0 > 1 + 4x0 = [[ok(U32(_x0))]] [[isQid(ok(_x0))]] = 2 + 4x0 > 1 + 4x0 = [[ok(isQid(_x0))]] [[U41(ok(_x0), ok(_x1), ok(_x2))]] = 5 + 2x2 + 4x0 + 4x1 > 1 + 2x2 + 4x0 + 4x1 = [[ok(U41(_x0, _x1, _x2))]] [[U42(ok(_x0), ok(_x1))]] = 2 + 2x0 + 2x1 > 1 + 2x0 + 2x1 = [[ok(U42(_x0, _x1))]] [[U43(ok(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[ok(U43(_x0))]] [[U51(ok(_x0), ok(_x1), ok(_x2))]] = 7 + 4x0 + 4x1 + 4x2 > 3 + 4x0 + 4x1 + 4x2 = [[ok(U51(_x0, _x1, _x2))]] [[U52(ok(_x0), ok(_x1))]] = 5 + 4x0 + 4x1 > 3 + 4x0 + 4x1 = [[ok(U52(_x0, _x1))]] [[U53(ok(_x0))]] = 2 + 4x0 > 1 + 4x0 = [[ok(U53(_x0))]] [[U61(ok(_x0), ok(_x1))]] = 3 + 2x1 + 4x0 > 1 + 2x1 + 4x0 = [[ok(U61(_x0, _x1))]] [[U62(ok(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[ok(U62(_x0))]] [[U71(ok(_x0), ok(_x1))]] = 3 + 2x0 + 4x1 > 1 + 2x0 + 4x1 = [[ok(U71(_x0, _x1))]] [[U72(ok(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[ok(isNePal(_x0))]] [[and(ok(_x0), ok(_x1))]] = 4 + 4x0 + 4x1 > 1 + 4x0 + 4x1 = [[ok(and(_x0, _x1))]] [[isPalListKind(ok(_x0))]] = 4 + 6x0 > 3 + 6x0 = [[ok(isPalListKind(_x0))]] [[isPal(ok(_x0))]] = 1 + 2x0 >= 1 + 2x0 = [[ok(isPal(_x0))]] [[top(ok(_x0))]] = 1 + 2x0 > 2x0 = [[top(active(_x0))]] We can thus remove the following rules: active(U23(X)) => U23(active(X)) active(U51(X, Y, Z)) => U51(active(X), Y, Z) active(U52(X, Y)) => U52(active(X), Y) proper(isPalListKind(X)) => isPalListKind(proper(X)) !6220!6220(ok(X), ok(Y)) => ok(!6220!6220(X, Y)) U11(ok(X), ok(Y)) => ok(U11(X, Y)) U12(ok(X)) => ok(U12(X)) U21(ok(X), ok(Y), ok(Z)) => ok(U21(X, Y, Z)) U22(ok(X), ok(Y)) => ok(U22(X, Y)) U31(ok(X), ok(Y)) => ok(U31(X, Y)) U32(ok(X)) => ok(U32(X)) isQid(ok(X)) => ok(isQid(X)) U41(ok(X), ok(Y), ok(Z)) => ok(U41(X, Y, Z)) U42(ok(X), ok(Y)) => ok(U42(X, Y)) U51(ok(X), ok(Y), ok(Z)) => ok(U51(X, Y, Z)) U52(ok(X), ok(Y)) => ok(U52(X, Y)) U53(ok(X)) => ok(U53(X)) U61(ok(X), ok(Y)) => ok(U61(X, Y)) U71(ok(X), ok(Y)) => ok(U71(X, Y)) and(ok(X), ok(Y)) => ok(and(X, Y)) isPalListKind(ok(X)) => ok(isPalListKind(X)) top(ok(X)) => top(active(X)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(!6220!6220(X, Y)) >? !6220!6220(active(X), Y) active(!6220!6220(X, Y)) >? !6220!6220(X, active(Y)) active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U21(X, Y, Z)) >? U21(active(X), Y, Z) active(U22(X, Y)) >? U22(active(X), Y) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U43(X)) >? U43(active(X)) active(U53(X)) >? U53(active(X)) active(U61(X, Y)) >? U61(active(X), Y) active(U62(X)) >? U62(active(X)) active(U71(X, Y)) >? U71(active(X), Y) active(U72(X)) >? U72(active(X)) active(and(X, Y)) >? and(active(X), Y) proper(U12(X)) >? U12(proper(X)) proper(U21(X, Y, Z)) >? U21(proper(X), proper(Y), proper(Z)) proper(U32(X)) >? U32(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) proper(U62(X)) >? U62(proper(X)) proper(U71(X, Y)) >? U71(proper(X), proper(Y)) proper(U72(X)) >? U72(proper(X)) proper(isNePal(X)) >? isNePal(proper(X)) proper(and(X, Y)) >? and(proper(X), proper(Y)) proper(isPal(X)) >? isPal(proper(X)) isNeList(ok(X)) >? ok(isNeList(X)) isList(ok(X)) >? ok(isList(X)) U23(ok(X)) >? ok(U23(X)) U43(ok(X)) >? ok(U43(X)) U62(ok(X)) >? ok(U62(X)) U72(ok(X)) >? ok(U72(X)) isNePal(ok(X)) >? ok(isNePal(X)) isPal(ok(X)) >? ok(isPal(X)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: !6220!6220 = \y0y1.3 + y0 + y1 U11 = \y0y1.y0 + y1 U12 = \y0.y0 U21 = \y0y1y2.3 + y0 + y1 + y2 U22 = \y0y1.y0 + y1 U23 = \y0.3y0 U31 = \y0y1.y0 + y1 U32 = \y0.y0 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 U43 = \y0.3 + 2y0 U53 = \y0.y0 U61 = \y0y1.1 + y0 + y1 U62 = \y0.3 + 3y0 U71 = \y0y1.3 + y0 + y1 U72 = \y0.3 + 3y0 active = \y0.2 + 3y0 and = \y0y1.3 + y0 + y1 isList = \y0.3y0 isNeList = \y0.3y0 isNePal = \y0.3 + 2y0 isPal = \y0.3 + 2y0 ok = \y0.3 + y0 proper = \y0.2 + 3y0 Using this interpretation, the requirements translate to: [[active(!6220!6220(_x0, _x1))]] = 11 + 3x0 + 3x1 > 5 + x1 + 3x0 = [[!6220!6220(active(_x0), _x1)]] [[active(!6220!6220(_x0, _x1))]] = 11 + 3x0 + 3x1 > 5 + x0 + 3x1 = [[!6220!6220(_x0, active(_x1))]] [[active(U11(_x0, _x1))]] = 2 + 3x0 + 3x1 >= 2 + x1 + 3x0 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = 2 + 3x0 >= 2 + 3x0 = [[U12(active(_x0))]] [[active(U21(_x0, _x1, _x2))]] = 11 + 3x0 + 3x1 + 3x2 > 5 + x1 + x2 + 3x0 = [[U21(active(_x0), _x1, _x2)]] [[active(U22(_x0, _x1))]] = 2 + 3x0 + 3x1 >= 2 + x1 + 3x0 = [[U22(active(_x0), _x1)]] [[active(U31(_x0, _x1))]] = 2 + 3x0 + 3x1 >= 2 + x1 + 3x0 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 2 + 3x0 >= 2 + 3x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = 2 + 3x0 + 3x1 + 3x2 >= 2 + x1 + x2 + 3x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 2 + 3x0 + 3x1 >= 2 + x1 + 3x0 = [[U42(active(_x0), _x1)]] [[active(U43(_x0))]] = 11 + 6x0 > 7 + 6x0 = [[U43(active(_x0))]] [[active(U53(_x0))]] = 2 + 3x0 >= 2 + 3x0 = [[U53(active(_x0))]] [[active(U61(_x0, _x1))]] = 5 + 3x0 + 3x1 > 3 + x1 + 3x0 = [[U61(active(_x0), _x1)]] [[active(U62(_x0))]] = 11 + 9x0 > 9 + 9x0 = [[U62(active(_x0))]] [[active(U71(_x0, _x1))]] = 11 + 3x0 + 3x1 > 5 + x1 + 3x0 = [[U71(active(_x0), _x1)]] [[active(U72(_x0))]] = 11 + 9x0 > 9 + 9x0 = [[U72(active(_x0))]] [[active(and(_x0, _x1))]] = 11 + 3x0 + 3x1 > 5 + x1 + 3x0 = [[and(active(_x0), _x1)]] [[proper(U12(_x0))]] = 2 + 3x0 >= 2 + 3x0 = [[U12(proper(_x0))]] [[proper(U21(_x0, _x1, _x2))]] = 11 + 3x0 + 3x1 + 3x2 > 9 + 3x0 + 3x1 + 3x2 = [[U21(proper(_x0), proper(_x1), proper(_x2))]] [[proper(U32(_x0))]] = 2 + 3x0 >= 2 + 3x0 = [[U32(proper(_x0))]] [[proper(U61(_x0, _x1))]] = 5 + 3x0 + 3x1 >= 5 + 3x0 + 3x1 = [[U61(proper(_x0), proper(_x1))]] [[proper(U62(_x0))]] = 11 + 9x0 > 9 + 9x0 = [[U62(proper(_x0))]] [[proper(U71(_x0, _x1))]] = 11 + 3x0 + 3x1 > 7 + 3x0 + 3x1 = [[U71(proper(_x0), proper(_x1))]] [[proper(U72(_x0))]] = 11 + 9x0 > 9 + 9x0 = [[U72(proper(_x0))]] [[proper(isNePal(_x0))]] = 11 + 6x0 > 7 + 6x0 = [[isNePal(proper(_x0))]] [[proper(and(_x0, _x1))]] = 11 + 3x0 + 3x1 > 7 + 3x0 + 3x1 = [[and(proper(_x0), proper(_x1))]] [[proper(isPal(_x0))]] = 11 + 6x0 > 7 + 6x0 = [[isPal(proper(_x0))]] [[isNeList(ok(_x0))]] = 9 + 3x0 > 3 + 3x0 = [[ok(isNeList(_x0))]] [[isList(ok(_x0))]] = 9 + 3x0 > 3 + 3x0 = [[ok(isList(_x0))]] [[U23(ok(_x0))]] = 9 + 3x0 > 3 + 3x0 = [[ok(U23(_x0))]] [[U43(ok(_x0))]] = 9 + 2x0 > 6 + 2x0 = [[ok(U43(_x0))]] [[U62(ok(_x0))]] = 12 + 3x0 > 6 + 3x0 = [[ok(U62(_x0))]] [[U72(ok(_x0))]] = 12 + 3x0 > 6 + 3x0 = [[ok(U72(_x0))]] [[isNePal(ok(_x0))]] = 9 + 2x0 > 6 + 2x0 = [[ok(isNePal(_x0))]] [[isPal(ok(_x0))]] = 9 + 2x0 > 6 + 2x0 = [[ok(isPal(_x0))]] We can thus remove the following rules: active(!6220!6220(X, Y)) => !6220!6220(active(X), Y) active(!6220!6220(X, Y)) => !6220!6220(X, active(Y)) active(U21(X, Y, Z)) => U21(active(X), Y, Z) active(U43(X)) => U43(active(X)) active(U61(X, Y)) => U61(active(X), Y) active(U62(X)) => U62(active(X)) active(U71(X, Y)) => U71(active(X), Y) active(U72(X)) => U72(active(X)) active(and(X, Y)) => and(active(X), Y) proper(U21(X, Y, Z)) => U21(proper(X), proper(Y), proper(Z)) proper(U62(X)) => U62(proper(X)) proper(U71(X, Y)) => U71(proper(X), proper(Y)) proper(U72(X)) => U72(proper(X)) proper(isNePal(X)) => isNePal(proper(X)) proper(and(X, Y)) => and(proper(X), proper(Y)) proper(isPal(X)) => isPal(proper(X)) isNeList(ok(X)) => ok(isNeList(X)) isList(ok(X)) => ok(isList(X)) U23(ok(X)) => ok(U23(X)) U43(ok(X)) => ok(U43(X)) U62(ok(X)) => ok(U62(X)) U72(ok(X)) => ok(U72(X)) isNePal(ok(X)) => ok(isNePal(X)) isPal(ok(X)) => ok(isPal(X)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U11(X, Y)) >? U11(active(X), Y) active(U12(X)) >? U12(active(X)) active(U22(X, Y)) >? U22(active(X), Y) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U53(X)) >? U53(active(X)) proper(U12(X)) >? U12(proper(X)) proper(U32(X)) >? U32(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: U11 = \y0y1.y0 + y1 U12 = \y0.2 + y0 U22 = \y0y1.y0 + y1 U31 = \y0y1.y0 + y1 U32 = \y0.y0 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 U53 = \y0.y0 U61 = \y0y1.y0 + y1 active = \y0.3y0 proper = \y0.3y0 Using this interpretation, the requirements translate to: [[active(U11(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U11(active(_x0), _x1)]] [[active(U12(_x0))]] = 6 + 3x0 > 2 + 3x0 = [[U12(active(_x0))]] [[active(U22(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U22(active(_x0), _x1)]] [[active(U31(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 3x0 >= 3x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = 3x0 + 3x1 + 3x2 >= x1 + x2 + 3x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U42(active(_x0), _x1)]] [[active(U53(_x0))]] = 3x0 >= 3x0 = [[U53(active(_x0))]] [[proper(U12(_x0))]] = 6 + 3x0 > 2 + 3x0 = [[U12(proper(_x0))]] [[proper(U32(_x0))]] = 3x0 >= 3x0 = [[U32(proper(_x0))]] [[proper(U61(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U61(proper(_x0), proper(_x1))]] We can thus remove the following rules: active(U12(X)) => U12(active(X)) proper(U12(X)) => U12(proper(X)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U11(X, Y)) >? U11(active(X), Y) active(U22(X, Y)) >? U22(active(X), Y) active(U31(X, Y)) >? U31(active(X), Y) active(U32(X)) >? U32(active(X)) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U53(X)) >? U53(active(X)) proper(U32(X)) >? U32(proper(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: U11 = \y0y1.y0 + y1 U22 = \y0y1.y0 + y1 U31 = \y0y1.y0 + y1 U32 = \y0.2 + y0 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 U53 = \y0.y0 U61 = \y0y1.y0 + y1 active = \y0.3y0 proper = \y0.3y0 Using this interpretation, the requirements translate to: [[active(U11(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U11(active(_x0), _x1)]] [[active(U22(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U22(active(_x0), _x1)]] [[active(U31(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U31(active(_x0), _x1)]] [[active(U32(_x0))]] = 6 + 3x0 > 2 + 3x0 = [[U32(active(_x0))]] [[active(U41(_x0, _x1, _x2))]] = 3x0 + 3x1 + 3x2 >= x1 + x2 + 3x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U42(active(_x0), _x1)]] [[active(U53(_x0))]] = 3x0 >= 3x0 = [[U53(active(_x0))]] [[proper(U32(_x0))]] = 6 + 3x0 > 2 + 3x0 = [[U32(proper(_x0))]] [[proper(U61(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U61(proper(_x0), proper(_x1))]] We can thus remove the following rules: active(U32(X)) => U32(active(X)) proper(U32(X)) => U32(proper(X)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U11(X, Y)) >? U11(active(X), Y) active(U22(X, Y)) >? U22(active(X), Y) active(U31(X, Y)) >? U31(active(X), Y) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) active(U53(X)) >? U53(active(X)) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: U11 = \y0y1.y0 + y1 U22 = \y0y1.y0 + y1 U31 = \y0y1.y0 + y1 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 U53 = \y0.2 + y0 U61 = \y0y1.y0 + y1 active = \y0.3y0 proper = \y0.3y0 Using this interpretation, the requirements translate to: [[active(U11(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U11(active(_x0), _x1)]] [[active(U22(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U22(active(_x0), _x1)]] [[active(U31(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U31(active(_x0), _x1)]] [[active(U41(_x0, _x1, _x2))]] = 3x0 + 3x1 + 3x2 >= x1 + x2 + 3x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U42(active(_x0), _x1)]] [[active(U53(_x0))]] = 6 + 3x0 > 2 + 3x0 = [[U53(active(_x0))]] [[proper(U61(_x0, _x1))]] = 3x0 + 3x1 >= 3x0 + 3x1 = [[U61(proper(_x0), proper(_x1))]] We can thus remove the following rules: active(U53(X)) => U53(active(X)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U11(X, Y)) >? U11(active(X), Y) active(U22(X, Y)) >? U22(active(X), Y) active(U31(X, Y)) >? U31(active(X), Y) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) proper(U61(X, Y)) >? U61(proper(X), proper(Y)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: U11 = \y0y1.y0 + y1 U22 = \y0y1.y0 + y1 U31 = \y0y1.y0 + y1 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 U61 = \y0y1.2 + y0 + y1 active = \y0.3y0 proper = \y0.3y0 Using this interpretation, the requirements translate to: [[active(U11(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U11(active(_x0), _x1)]] [[active(U22(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U22(active(_x0), _x1)]] [[active(U31(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U31(active(_x0), _x1)]] [[active(U41(_x0, _x1, _x2))]] = 3x0 + 3x1 + 3x2 >= x1 + x2 + 3x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U42(active(_x0), _x1)]] [[proper(U61(_x0, _x1))]] = 6 + 3x0 + 3x1 > 2 + 3x0 + 3x1 = [[U61(proper(_x0), proper(_x1))]] We can thus remove the following rules: proper(U61(X, Y)) => U61(proper(X), proper(Y)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U11(X, Y)) >? U11(active(X), Y) active(U22(X, Y)) >? U22(active(X), Y) active(U31(X, Y)) >? U31(active(X), Y) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: U11 = \y0y1.2 + y0 + y1 U22 = \y0y1.y0 + y1 U31 = \y0y1.y0 + y1 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 active = \y0.3y0 Using this interpretation, the requirements translate to: [[active(U11(_x0, _x1))]] = 6 + 3x0 + 3x1 > 2 + x1 + 3x0 = [[U11(active(_x0), _x1)]] [[active(U22(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U22(active(_x0), _x1)]] [[active(U31(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U31(active(_x0), _x1)]] [[active(U41(_x0, _x1, _x2))]] = 3x0 + 3x1 + 3x2 >= x1 + x2 + 3x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U42(active(_x0), _x1)]] We can thus remove the following rules: active(U11(X, Y)) => U11(active(X), Y) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U22(X, Y)) >? U22(active(X), Y) active(U31(X, Y)) >? U31(active(X), Y) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: U22 = \y0y1.2 + y0 + y1 U31 = \y0y1.y0 + y1 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 active = \y0.3y0 Using this interpretation, the requirements translate to: [[active(U22(_x0, _x1))]] = 6 + 3x0 + 3x1 > 2 + x1 + 3x0 = [[U22(active(_x0), _x1)]] [[active(U31(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U31(active(_x0), _x1)]] [[active(U41(_x0, _x1, _x2))]] = 3x0 + 3x1 + 3x2 >= x1 + x2 + 3x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U42(active(_x0), _x1)]] We can thus remove the following rules: active(U22(X, Y)) => U22(active(X), Y) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U31(X, Y)) >? U31(active(X), Y) active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: U31 = \y0y1.2 + y0 + y1 U41 = \y0y1y2.y0 + y1 + y2 U42 = \y0y1.y0 + y1 active = \y0.3y0 Using this interpretation, the requirements translate to: [[active(U31(_x0, _x1))]] = 6 + 3x0 + 3x1 > 2 + x1 + 3x0 = [[U31(active(_x0), _x1)]] [[active(U41(_x0, _x1, _x2))]] = 3x0 + 3x1 + 3x2 >= x1 + x2 + 3x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U42(active(_x0), _x1)]] We can thus remove the following rules: active(U31(X, Y)) => U31(active(X), Y) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U41(X, Y, Z)) >? U41(active(X), Y, Z) active(U42(X, Y)) >? U42(active(X), Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: U41 = \y0y1y2.2 + y0 + y1 + y2 U42 = \y0y1.y0 + y1 active = \y0.3y0 Using this interpretation, the requirements translate to: [[active(U41(_x0, _x1, _x2))]] = 6 + 3x0 + 3x1 + 3x2 > 2 + x1 + x2 + 3x0 = [[U41(active(_x0), _x1, _x2)]] [[active(U42(_x0, _x1))]] = 3x0 + 3x1 >= x1 + 3x0 = [[U42(active(_x0), _x1)]] We can thus remove the following rules: active(U41(X, Y, Z)) => U41(active(X), Y, Z) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): active(U42(X, Y)) >? U42(active(X), Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: U42 = \y0y1.1 + y0 + y1 active = \y0.3y0 Using this interpretation, the requirements translate to: [[active(U42(_x0, _x1))]] = 3 + 3x0 + 3x1 > 1 + x1 + 3x0 = [[U42(active(_x0), _x1)]] We can thus remove the following rules: active(U42(X, Y)) => U42(active(X), Y) All rules were succesfully removed. Thus, termination of the original system has been reduced to termination of the beta-rule, which is well-known to hold. +++ Citations +++ [Kop12] C. Kop. Higher Order Termination. PhD Thesis, 2012.