YES Termination w.r.t. Q proof of AProVE_09_Inductive_qsortmiddle.ari

(0) Obligation:

Q restricted rewrite system:
The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

Q is empty.

(1) Overlay + Local Confluence (EQUIVALENT transformation)

The TRS is overlay and locally confluent. By [NOC] we can switch to innermost.

(2) Obligation:

Q restricted rewrite system:
The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

(3) DependencyPairsProof (EQUIVALENT transformation)

Using Dependency Pairs [AG00,LPAR04] we result in the following initial DP problem.

(4) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QSORT(xs) → QS(half(length(xs)), xs)
QSORT(xs) → HALF(length(xs))
QSORT(xs) → LENGTH(xs)
QS(n, cons(x, xs)) → APPEND(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
QS(n, cons(x, xs)) → QS(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs)))
QS(n, cons(x, xs)) → HALF(n)
QS(n, cons(x, xs)) → FILTERLOW(get(n, cons(x, xs)), cons(x, xs))
QS(n, cons(x, xs)) → GET(n, cons(x, xs))
QS(n, cons(x, xs)) → QS(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))
QS(n, cons(x, xs)) → FILTERHIGH(get(n, cons(x, xs)), cons(x, xs))
FILTERLOW(n, cons(x, xs)) → IF1(ge(n, x), n, x, xs)
FILTERLOW(n, cons(x, xs)) → GE(n, x)
IF1(true, n, x, xs) → FILTERLOW(n, xs)
IF1(false, n, x, xs) → FILTERLOW(n, xs)
FILTERHIGH(n, cons(x, xs)) → IF2(ge(x, n), n, x, xs)
FILTERHIGH(n, cons(x, xs)) → GE(x, n)
IF2(true, n, x, xs) → FILTERHIGH(n, xs)
IF2(false, n, x, xs) → FILTERHIGH(n, xs)
GE(s(x), s(y)) → GE(x, y)
APPEND(cons(x, xs), ys) → APPEND(xs, ys)
LENGTH(cons(x, xs)) → LENGTH(xs)
HALF(s(s(x))) → HALF(x)
GET(s(n), cons(x, cons(y, xs))) → GET(n, cons(y, xs))

The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(5) DependencyGraphProof (EQUIVALENT transformation)

The approximation of the Dependency Graph [LPAR04,FROCOS05,EDGSTAR] contains 8 SCCs with 10 less nodes.

(6) Complex Obligation (AND)

(7) Obligation:

Q DP problem:
The TRS P consists of the following rules:

GET(s(n), cons(x, cons(y, xs))) → GET(n, cons(y, xs))

The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(8) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(9) Obligation:

Q DP problem:
The TRS P consists of the following rules:

GET(s(n), cons(x, cons(y, xs))) → GET(n, cons(y, xs))

R is empty.
The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(10) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

(11) Obligation:

Q DP problem:
The TRS P consists of the following rules:

GET(s(n), cons(x, cons(y, xs))) → GET(n, cons(y, xs))

R is empty.
Q is empty.
We have to consider all minimal (P,Q,R)-chains.

(12) QDPSizeChangeProof (EQUIVALENT transformation)

By using the subterm criterion [SUBTERM_CRITERION] together with the size-change analysis [AAECC05] we have proven that there are no infinite chains for this DP problem.

From the DPs we obtained the following set of size-change graphs:

  • GET(s(n), cons(x, cons(y, xs))) → GET(n, cons(y, xs))
    The graph contains the following edges 1 > 1, 2 > 2

(13) YES

(14) Obligation:

Q DP problem:
The TRS P consists of the following rules:

HALF(s(s(x))) → HALF(x)

The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(15) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(16) Obligation:

Q DP problem:
The TRS P consists of the following rules:

HALF(s(s(x))) → HALF(x)

R is empty.
The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(17) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

(18) Obligation:

Q DP problem:
The TRS P consists of the following rules:

HALF(s(s(x))) → HALF(x)

R is empty.
Q is empty.
We have to consider all minimal (P,Q,R)-chains.

(19) QDPSizeChangeProof (EQUIVALENT transformation)

By using the subterm criterion [SUBTERM_CRITERION] together with the size-change analysis [AAECC05] we have proven that there are no infinite chains for this DP problem.

From the DPs we obtained the following set of size-change graphs:

  • HALF(s(s(x))) → HALF(x)
    The graph contains the following edges 1 > 1

(20) YES

(21) Obligation:

Q DP problem:
The TRS P consists of the following rules:

LENGTH(cons(x, xs)) → LENGTH(xs)

The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(22) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(23) Obligation:

Q DP problem:
The TRS P consists of the following rules:

LENGTH(cons(x, xs)) → LENGTH(xs)

R is empty.
The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(24) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

(25) Obligation:

Q DP problem:
The TRS P consists of the following rules:

LENGTH(cons(x, xs)) → LENGTH(xs)

R is empty.
Q is empty.
We have to consider all minimal (P,Q,R)-chains.

(26) QDPSizeChangeProof (EQUIVALENT transformation)

By using the subterm criterion [SUBTERM_CRITERION] together with the size-change analysis [AAECC05] we have proven that there are no infinite chains for this DP problem.

From the DPs we obtained the following set of size-change graphs:

  • LENGTH(cons(x, xs)) → LENGTH(xs)
    The graph contains the following edges 1 > 1

(27) YES

(28) Obligation:

Q DP problem:
The TRS P consists of the following rules:

APPEND(cons(x, xs), ys) → APPEND(xs, ys)

The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(29) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(30) Obligation:

Q DP problem:
The TRS P consists of the following rules:

APPEND(cons(x, xs), ys) → APPEND(xs, ys)

R is empty.
The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(31) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

(32) Obligation:

Q DP problem:
The TRS P consists of the following rules:

APPEND(cons(x, xs), ys) → APPEND(xs, ys)

R is empty.
Q is empty.
We have to consider all minimal (P,Q,R)-chains.

(33) QDPSizeChangeProof (EQUIVALENT transformation)

By using the subterm criterion [SUBTERM_CRITERION] together with the size-change analysis [AAECC05] we have proven that there are no infinite chains for this DP problem.

From the DPs we obtained the following set of size-change graphs:

  • APPEND(cons(x, xs), ys) → APPEND(xs, ys)
    The graph contains the following edges 1 > 1, 2 >= 2

(34) YES

(35) Obligation:

Q DP problem:
The TRS P consists of the following rules:

GE(s(x), s(y)) → GE(x, y)

The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(36) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(37) Obligation:

Q DP problem:
The TRS P consists of the following rules:

GE(s(x), s(y)) → GE(x, y)

R is empty.
The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(38) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

(39) Obligation:

Q DP problem:
The TRS P consists of the following rules:

GE(s(x), s(y)) → GE(x, y)

R is empty.
Q is empty.
We have to consider all minimal (P,Q,R)-chains.

(40) QDPSizeChangeProof (EQUIVALENT transformation)

By using the subterm criterion [SUBTERM_CRITERION] together with the size-change analysis [AAECC05] we have proven that there are no infinite chains for this DP problem.

From the DPs we obtained the following set of size-change graphs:

  • GE(s(x), s(y)) → GE(x, y)
    The graph contains the following edges 1 > 1, 2 > 2

(41) YES

(42) Obligation:

Q DP problem:
The TRS P consists of the following rules:

IF2(true, n, x, xs) → FILTERHIGH(n, xs)
FILTERHIGH(n, cons(x, xs)) → IF2(ge(x, n), n, x, xs)
IF2(false, n, x, xs) → FILTERHIGH(n, xs)

The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(43) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(44) Obligation:

Q DP problem:
The TRS P consists of the following rules:

IF2(true, n, x, xs) → FILTERHIGH(n, xs)
FILTERHIGH(n, cons(x, xs)) → IF2(ge(x, n), n, x, xs)
IF2(false, n, x, xs) → FILTERHIGH(n, xs)

The TRS R consists of the following rules:

ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(45) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

(46) Obligation:

Q DP problem:
The TRS P consists of the following rules:

IF2(true, n, x, xs) → FILTERHIGH(n, xs)
FILTERHIGH(n, cons(x, xs)) → IF2(ge(x, n), n, x, xs)
IF2(false, n, x, xs) → FILTERHIGH(n, xs)

The TRS R consists of the following rules:

ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)

The set Q consists of the following terms:

ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))

We have to consider all minimal (P,Q,R)-chains.

(47) QDPSizeChangeProof (EQUIVALENT transformation)

By using the subterm criterion [SUBTERM_CRITERION] together with the size-change analysis [AAECC05] we have proven that there are no infinite chains for this DP problem.

From the DPs we obtained the following set of size-change graphs:

  • FILTERHIGH(n, cons(x, xs)) → IF2(ge(x, n), n, x, xs)
    The graph contains the following edges 1 >= 2, 2 > 3, 2 > 4

  • IF2(true, n, x, xs) → FILTERHIGH(n, xs)
    The graph contains the following edges 2 >= 1, 4 >= 2

  • IF2(false, n, x, xs) → FILTERHIGH(n, xs)
    The graph contains the following edges 2 >= 1, 4 >= 2

(48) YES

(49) Obligation:

Q DP problem:
The TRS P consists of the following rules:

IF1(true, n, x, xs) → FILTERLOW(n, xs)
FILTERLOW(n, cons(x, xs)) → IF1(ge(n, x), n, x, xs)
IF1(false, n, x, xs) → FILTERLOW(n, xs)

The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(50) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(51) Obligation:

Q DP problem:
The TRS P consists of the following rules:

IF1(true, n, x, xs) → FILTERLOW(n, xs)
FILTERLOW(n, cons(x, xs)) → IF1(ge(n, x), n, x, xs)
IF1(false, n, x, xs) → FILTERLOW(n, xs)

The TRS R consists of the following rules:

ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(52) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

(53) Obligation:

Q DP problem:
The TRS P consists of the following rules:

IF1(true, n, x, xs) → FILTERLOW(n, xs)
FILTERLOW(n, cons(x, xs)) → IF1(ge(n, x), n, x, xs)
IF1(false, n, x, xs) → FILTERLOW(n, xs)

The TRS R consists of the following rules:

ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)

The set Q consists of the following terms:

ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))

We have to consider all minimal (P,Q,R)-chains.

(54) QDPSizeChangeProof (EQUIVALENT transformation)

By using the subterm criterion [SUBTERM_CRITERION] together with the size-change analysis [AAECC05] we have proven that there are no infinite chains for this DP problem.

From the DPs we obtained the following set of size-change graphs:

  • FILTERLOW(n, cons(x, xs)) → IF1(ge(n, x), n, x, xs)
    The graph contains the following edges 1 >= 2, 2 > 3, 2 > 4

  • IF1(true, n, x, xs) → FILTERLOW(n, xs)
    The graph contains the following edges 2 >= 1, 4 >= 2

  • IF1(false, n, x, xs) → FILTERLOW(n, xs)
    The graph contains the following edges 2 >= 1, 4 >= 2

(55) YES

(56) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))
QS(n, cons(x, xs)) → QS(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs)))

The TRS R consists of the following rules:

qsort(xs) → qs(half(length(xs)), xs)
qs(n, nil) → nil
qs(n, cons(x, xs)) → append(qs(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))), cons(get(n, cons(x, xs)), qs(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))))
filterlow(n, nil) → nil
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterhigh(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
append(nil, ys) → ys
append(cons(x, xs), ys) → cons(x, append(xs, ys))
length(nil) → 0
length(cons(x, xs)) → s(length(xs))
half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, nil) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(57) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(58) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))
QS(n, cons(x, xs)) → QS(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(59) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

qsort(x0)
qs(x0, nil)
qs(x0, cons(x1, x2))
append(nil, ys)
append(cons(x0, x1), ys)
length(nil)
length(cons(x0, x1))

(60) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs)))
QS(n, cons(x, xs)) → QS(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(61) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(n, cons(x, xs)) → QS(half(n), filterhigh(get(n, cons(x, xs)), cons(x, xs))) at position [1] we obtained the following new rules [LPAR04]:

QS(n, cons(x, xs)) → QS(half(n), if2(ge(x, get(n, cons(x, xs))), get(n, cons(x, xs)), x, xs)) → QS(n, cons(x, xs)) → QS(half(n), if2(ge(x, get(n, cons(x, xs))), get(n, cons(x, xs)), x, xs))

(62) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs)))
QS(n, cons(x, xs)) → QS(half(n), if2(ge(x, get(n, cons(x, xs))), get(n, cons(x, xs)), x, xs))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(63) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(n, cons(x, xs)) → QS(half(n), filterlow(get(n, cons(x, xs)), cons(x, xs))) at position [1] we obtained the following new rules [LPAR04]:

QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs)) → QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))

(64) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), if2(ge(x, get(n, cons(x, xs))), get(n, cons(x, xs)), x, xs))
QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(65) TransformationProof (EQUIVALENT transformation)

By narrowing [LPAR04] the rule QS(n, cons(x, xs)) → QS(half(n), if2(ge(x, get(n, cons(x, xs))), get(n, cons(x, xs)), x, xs)) at position [1] we obtained the following new rules [LPAR04]:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), get(x0, cons(x1, nil)), x1, nil)) → QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), get(x0, cons(x1, nil)), x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3))) → QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, get(x0, cons(x1, nil))), x1, x1, nil)) → QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, get(x0, cons(x1, nil))), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(s(x0), cons(x1, cons(x2, x3)))), get(x0, cons(x2, x3)), x1, cons(x2, x3))) → QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(s(x0), cons(x1, cons(x2, x3)))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

(66) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), get(x0, cons(x1, nil)), x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, get(x0, cons(x1, nil))), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(s(x0), cons(x1, cons(x2, x3)))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(67) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), get(x0, cons(x1, nil)), x1, nil)) at position [1,1] we obtained the following new rules [LPAR04]:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil)) → QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))

(68) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, get(x0, cons(x1, nil))), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(s(x0), cons(x1, cons(x2, x3)))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(69) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2))) at position [0] we obtained the following new rules [LPAR04]:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))

(70) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, get(x0, cons(x1, nil))), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(s(x0), cons(x1, cons(x2, x3)))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(71) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3))) at position [1,1] we obtained the following new rules [LPAR04]:

QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3))) → QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

(72) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, get(x0, cons(x1, nil))), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(s(x0), cons(x1, cons(x2, x3)))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(73) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, get(x0, cons(x1, nil))), x1, x1, nil)) at position [1,0,1] we obtained the following new rules [LPAR04]:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil)) → QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))

(74) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(s(x0), cons(x1, cons(x2, x3)))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(75) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2))) at position [0] we obtained the following new rules [LPAR04]:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2)))

(76) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(s(x0), cons(x1, cons(x2, x3)))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(77) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(s(x0), cons(x1, cons(x2, x3)))), get(x0, cons(x2, x3)), x1, cons(x2, x3))) at position [1,0,1] we obtained the following new rules [LPAR04]:

QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3))) → QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

(78) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(79) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2))) at position [1,1] we obtained the following new rules [LPAR04]:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))

(80) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(81) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, get(0, cons(x0, cons(x1, x2)))), x0, x0, cons(x1, x2))) at position [1,0,1] we obtained the following new rules [LPAR04]:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))

(82) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs))
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(83) TransformationProof (EQUIVALENT transformation)

By narrowing [LPAR04] the rule QS(n, cons(x, xs)) → QS(half(n), if1(ge(get(n, cons(x, xs)), x), get(n, cons(x, xs)), x, xs)) at position [1] we obtained the following new rules [LPAR04]:

QS(y0, cons(0, y2)) → QS(half(y0), if1(true, get(y0, cons(0, y2)), 0, y2)) → QS(y0, cons(0, y2)) → QS(half(y0), if1(true, get(y0, cons(0, y2)), 0, y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), get(x0, cons(x1, nil)), x1, nil)) → QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), get(x0, cons(x1, nil)), x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3))) → QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(get(x0, cons(x1, nil)), x1), x1, x1, nil)) → QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(get(x0, cons(x1, nil)), x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(s(x0), cons(x1, cons(x2, x3))), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3))) → QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(s(x0), cons(x1, cons(x2, x3))), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

(84) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(y0, cons(0, y2)) → QS(half(y0), if1(true, get(y0, cons(0, y2)), 0, y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), get(x0, cons(x1, nil)), x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(get(x0, cons(x1, nil)), x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(s(x0), cons(x1, cons(x2, x3))), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(85) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(y0, cons(0, y2)) → QS(half(y0), if1(true, get(y0, cons(0, y2)), 0, y2)) at position [1] we obtained the following new rules [LPAR04]:

QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2)) → QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))

(86) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), get(x0, cons(x1, nil)), x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(get(x0, cons(x1, nil)), x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(s(x0), cons(x1, cons(x2, x3))), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(87) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), get(x0, cons(x1, nil)), x1, nil)) at position [1,1] we obtained the following new rules [LPAR04]:

QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil)) → QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))

(88) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(get(x0, cons(x1, nil)), x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(s(x0), cons(x1, cons(x2, x3))), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(89) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2))) at position [0] we obtained the following new rules [LPAR04]:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))

(90) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(get(x0, cons(x1, nil)), x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(s(x0), cons(x1, cons(x2, x3))), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(91) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(s(x0), cons(x1, cons(x2, x3))), x1, cons(x2, x3))) at position [1,1] we obtained the following new rules [LPAR04]:

QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3))) → QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

(92) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(get(x0, cons(x1, nil)), x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(s(x0), cons(x1, cons(x2, x3))), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(93) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(get(x0, cons(x1, nil)), x1), x1, x1, nil)) at position [1,0,0] we obtained the following new rules [LPAR04]:

QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil)) → QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))

(94) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(s(x0), cons(x1, cons(x2, x3))), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(95) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(0, cons(x0, cons(x1, x2))) → QS(half(0), if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2))) at position [0] we obtained the following new rules [LPAR04]:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))

(96) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(s(x0), cons(x1, cons(x2, x3))), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(97) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(s(x0), cons(x1, cons(x2, x3))), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3))) at position [1,0,0] we obtained the following new rules [LPAR04]:

QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3))) → QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))

(98) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(99) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), get(0, cons(x0, cons(x1, x2))), x0, cons(x1, x2))) at position [1,1] we obtained the following new rules [LPAR04]:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

(100) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(101) TransformationProof (EQUIVALENT transformation)

By rewriting [LPAR04] the rule QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(get(0, cons(x0, cons(x1, x2))), x0), x0, x0, cons(x1, x2))) at position [1,0,0] we obtained the following new rules [LPAR04]:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2))) → QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

(102) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(0)) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(103) QDPQMonotonicMRRProof (EQUIVALENT transformation)

By using the Q-monotonic rule removal processor with the following ordering, at least one Dependency Pair or term rewrite system rule of this QDP problem can be strictly oriented such that it always occurs at a strongly monotonic position in a (P,Q,R)-chain.

Strictly oriented rules of the TRS R:

half(s(0)) → 0

Used ordering: Polynomial interpretation [POLO]:

POL(0) = 2   
POL(QS(x1, x2)) = 2·x1   
POL(cons(x1, x2)) = x1 + 2·x2   
POL(false) = 0   
POL(filterhigh(x1, x2)) = x2   
POL(filterlow(x1, x2)) = x2   
POL(ge(x1, x2)) = x1 + x2   
POL(get(x1, x2)) = x2   
POL(half(x1)) = x1   
POL(if1(x1, x2, x3, x4)) = x3 + 2·x4   
POL(if2(x1, x2, x3, x4)) = x3 + 2·x4   
POL(nil) = 1   
POL(s(x1)) = 2·x1   
POL(true) = 0   

(104) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
half(s(s(x))) → s(half(x))
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(105) QDPQMonotonicMRRProof (EQUIVALENT transformation)

By using the Q-monotonic rule removal processor with the following ordering, at least one Dependency Pair or term rewrite system rule of this QDP problem can be strictly oriented such that it always occurs at a strongly monotonic position in a (P,Q,R)-chain.

Strictly oriented rules of the TRS R:

half(s(s(x))) → s(half(x))

Used ordering: Polynomial interpretation [POLO]:

POL(0) = 1   
POL(QS(x1, x2)) = 2·x1   
POL(cons(x1, x2)) = 1 + x1 + 2·x2   
POL(false) = 0   
POL(filterhigh(x1, x2)) = x2   
POL(filterlow(x1, x2)) = x2   
POL(ge(x1, x2)) = 0   
POL(get(x1, x2)) = x2   
POL(half(x1)) = x1   
POL(if1(x1, x2, x3, x4)) = 1 + x3 + 2·x4   
POL(if2(x1, x2, x3, x4)) = 1 + 2·x1 + x3 + 2·x4   
POL(nil) = 2   
POL(s(x1)) = 1 + 2·x1   
POL(true) = 0   

(106) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(107) QDPQMonotonicMRRProof (EQUIVALENT transformation)

By using the Q-monotonic rule removal processor with the following ordering, at least one Dependency Pair or term rewrite system rule of this QDP problem can be strictly oriented such that it always occurs at a strongly monotonic position in a (P,Q,R)-chain.
Strictly oriented dependency pairs:

QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if2(ge(x1, get(x0, cons(x2, x3))), get(x0, cons(x2, x3)), x1, cons(x2, x3)))
QS(s(x0), cons(x1, cons(x2, x3))) → QS(half(s(x0)), if1(ge(get(x0, cons(x2, x3)), x1), get(x0, cons(x2, x3)), x1, cons(x2, x3)))


Used ordering: Polynomial interpretation [POLO]:

POL(0) = 0   
POL(QS(x1, x2)) = x1   
POL(cons(x1, x2)) = x1 + 2·x2   
POL(false) = 0   
POL(filterhigh(x1, x2)) = x2   
POL(filterlow(x1, x2)) = x2   
POL(ge(x1, x2)) = 2   
POL(get(x1, x2)) = x2   
POL(half(x1)) = 0   
POL(if1(x1, x2, x3, x4)) = x3 + 2·x4   
POL(if2(x1, x2, x3, x4)) = x3 + 2·x4   
POL(nil) = 2   
POL(s(x1)) = 1   
POL(true) = 0   

(108) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(109) QDPOrderProof (EQUIVALENT transformation)

We use the reduction pair processor [LPAR04,JAR06].


The following pairs can be oriented strictly and are deleted.


QS(y0, cons(0, y2)) → QS(half(y0), filterlow(get(y0, cons(0, y2)), y2))
The remaining pairs can at least be oriented weakly.
Used ordering: Polynomial Order [NEGPOLO,POLO] with Interpretation:
POL( QS(x1, x2) ) = 2x1 + 2x2 + 2

POL( half(x1) ) = x1

POL( 0 ) = 1

POL( if1(x1, ..., x4) ) = x1 + x3 + 2x4 + 1

POL( if2(x1, ..., x4) ) = x3 + 2x4 + 1

POL( ge(x1, x2) ) = 0

POL( true ) = 0

POL( s(x1) ) = 2

POL( filterhigh(x1, x2) ) = x2

POL( cons(x1, x2) ) = x1 + 2x2 + 1

POL( false ) = 0

POL( filterlow(x1, x2) ) = x2

POL( get(x1, x2) ) = max{0, -2}

POL( nil ) = 1


The following usable rules [FROCOS05] with respect to the argument filtering of the ordering [JAR06] were oriented:

half(0) → 0
ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
if2(true, n, x, xs) → filterhigh(n, xs)
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
if1(true, n, x, xs) → filterlow(n, xs)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
filterlow(n, nil) → nil
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
ge(0, s(x)) → false
filterhigh(n, nil) → nil

(110) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

half(0) → 0
get(n, cons(x, nil)) → x
get(0, cons(x, cons(y, xs))) → x
get(s(n), cons(x, cons(y, xs))) → get(n, cons(y, xs))
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
ge(x, 0) → true
ge(0, s(x)) → false
ge(s(x), s(y)) → ge(x, y)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(true, n, x, xs) → filterhigh(n, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(111) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(112) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
if1(true, n, x, xs) → filterlow(n, xs)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
ge(0, s(x)) → false
half(0) → 0
if2(true, n, x, xs) → filterhigh(n, xs)
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))
get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

We have to consider all minimal (P,Q,R)-chains.

(113) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

get(x0, nil)
get(x0, cons(x1, nil))
get(0, cons(x0, cons(x1, x2)))
get(s(x0), cons(x1, cons(x2, x3)))

(114) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
if1(true, n, x, xs) → filterlow(n, xs)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
ge(0, s(x)) → false
half(0) → 0
if2(true, n, x, xs) → filterhigh(n, xs)
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))

We have to consider all minimal (P,Q,R)-chains.

(115) Induction-Processor (SOUND transformation)


This DP could be deleted by the Induction-Processor:
QS(x0, cons(x1, nil)) → QS(half(x0), if2(ge(x1, x1), x1, x1, nil))


This order was computed:
Polynomial interpretation [POLO]:

POL(0) = 0   
POL(QS(x1, x2)) = x2   
POL(cons(x1, x2)) = 1 + x2   
POL(false_renamed) = 1   
POL(filterhigh(x1, x2)) = x2   
POL(filterlow(x1, x2)) = x2   
POL(ge(x1, x2)) = 1   
POL(half(x1)) = 1   
POL(if1(x1, x2, x3, x4)) = x1 + x4   
POL(if2(x1, x2, x3, x4)) = x1 + x4   
POL(nil) = 0   
POL(s(x1)) = 1 + x1   
POL(true_renamed) = 1   

At least one of these decreasing rules is always used after the deleted DP:
if2(true_renamed, n2, x6, xs1) → filterhigh(n2, xs1)


The following formula is valid:
x1:sort[a0].if2'(ge(x1 , x1 ), x1 , x1 , nil)=true


The transformed set:
if2'(true_renamed, n2, x6, xs1) → true
filterhigh'(n3, cons(x7, xs2)) → if2'(ge(x7, n3), n3, x7, xs2)
if2'(false_renamed, n4, x8, xs3) → filterhigh'(n4, xs3)
filterhigh'(n5, nil) → false
ge(x, 0) → true_renamed
ge(s(x'), s(y)) → ge(x', y)
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
filterlow(n', cons(x3, xs')) → if1(ge(n', x3), n', x3, xs')
if1(false_renamed, n'', x4, xs'') → cons(x4, filterlow(n'', xs''))
filterlow(n1, nil) → nil
ge(0, s(x5)) → false_renamed
half(0) → 0
if2(true_renamed, n2, x6, xs1) → filterhigh(n2, xs1)
filterhigh(n3, cons(x7, xs2)) → if2(ge(x7, n3), n3, x7, xs2)
if2(false_renamed, n4, x8, xs3) → cons(x8, filterhigh(n4, xs3))
filterhigh(n5, nil) → nil
half(s(v14)) → 0
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_true(true) → true
isa_true(false) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v23)) → false
equal_sort[a0](s(v24), 0) → false
equal_sort[a0](s(v24), s(v25)) → equal_sort[a0](v24, v25)
equal_sort[a5](cons(v26, v27), cons(v28, v29)) → and(equal_sort[a0](v26, v28), equal_sort[a5](v27, v29))
equal_sort[a5](cons(v26, v27), nil) → false
equal_sort[a5](nil, cons(v30, v31)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a36](true_renamed, true_renamed) → true
equal_sort[a36](true_renamed, false_renamed) → false
equal_sort[a36](false_renamed, true_renamed) → false
equal_sort[a36](false_renamed, false_renamed) → true
equal_sort[a66](witness_sort[a66], witness_sort[a66]) → true


The proof given by the theorem prover:
The following output was given by the internal theorem prover:
proof of internal
# AProVE Commit ID: 3a20a6ef7432c3f292db1a8838479c42bf5e3b22 root 20240618 unpublished


Partial correctness of the following Program

   [x, v23, v24, v25, v26, v27, v28, v29, v30, v31, n2, x6, xs1, n4, x8, x7, xs2, n5, n3, x', y, x5, n1, n', x3, xs', v14, n, x'', n'', x4]
   equal_bool(true, false) -> false
   equal_bool(false, true) -> false
   equal_bool(true, true) -> true
   equal_bool(false, false) -> true
   true and x -> x
   false and x -> false
   true or x -> true
   false or x -> x
   not(false) -> true
   not(true) -> false
   isa_true(true) -> true
   isa_true(false) -> false
   isa_false(true) -> false
   isa_false(false) -> true
   equal_sort[a0](0, 0) -> true
   equal_sort[a0](0, s(v23)) -> false
   equal_sort[a0](s(v24), 0) -> false
   equal_sort[a0](s(v24), s(v25)) -> equal_sort[a0](v24, v25)
   equal_sort[a5](cons(v26, v27), cons(v28, v29)) -> equal_sort[a0](v26, v28) and equal_sort[a5](v27, v29)
   equal_sort[a5](cons(v26, v27), nil) -> false
   equal_sort[a5](nil, cons(v30, v31)) -> false
   equal_sort[a5](nil, nil) -> true
   equal_sort[a36](true_renamed, true_renamed) -> true
   equal_sort[a36](true_renamed, false_renamed) -> false
   equal_sort[a36](false_renamed, true_renamed) -> false
   equal_sort[a36](false_renamed, false_renamed) -> true
   equal_sort[a66](witness_sort[a66], witness_sort[a66]) -> true
   if2'(true_renamed, n2, x6, xs1) -> true
   if2'(false_renamed, n4, x8, cons(x7, xs2)) -> if2'(ge(x7, n4), n4, x7, xs2)
   if2'(false_renamed, n4, x8, nil) -> false
   filterhigh'(n5, nil) -> false
   equal_sort[a36](ge(x7, n3), true_renamed) -> true | filterhigh'(n3, cons(x7, xs2)) -> true
   equal_sort[a36](ge(x7, n3), true_renamed) -> false | filterhigh'(n3, cons(x7, xs2)) -> filterhigh'(n3, xs2)
   ge(x, 0) -> true_renamed
   ge(s(x'), s(y)) -> ge(x', y)
   ge(0, s(x5)) -> false_renamed
   filterlow(n1, nil) -> nil
   equal_sort[a36](ge(n', x3), true_renamed) -> true | filterlow(n', cons(x3, xs')) -> filterlow(n', xs')
   equal_sort[a36](ge(n', x3), true_renamed) -> false | filterlow(n', cons(x3, xs')) -> cons(x3, filterlow(n', xs'))
   half(0) -> 0
   half(s(v14)) -> 0
   filterhigh(n5, nil) -> nil
   equal_sort[a36](ge(x7, n3), true_renamed) -> true | filterhigh(n3, cons(x7, xs2)) -> filterhigh(n3, xs2)
   equal_sort[a36](ge(x7, n3), true_renamed) -> false | filterhigh(n3, cons(x7, xs2)) -> cons(x7, filterhigh(n3, xs2))
   if1(true_renamed, n, x'', cons(x3, xs')) -> if1(ge(n, x3), n, x3, xs')
   if1(true_renamed, n, x'', nil) -> nil
   if1(false_renamed, n'', x4, cons(x3, xs')) -> cons(x4, if1(ge(n'', x3), n'', x3, xs'))
   if1(false_renamed, n'', x4, nil) -> cons(x4, nil)
   if2(true_renamed, n2, x6, cons(x7, xs2)) -> if2(ge(x7, n2), n2, x7, xs2)
   if2(true_renamed, n2, x6, nil) -> nil
   if2(false_renamed, n4, x8, cons(x7, xs2)) -> cons(x8, if2(ge(x7, n4), n4, x7, xs2))
   if2(false_renamed, n4, x8, nil) -> cons(x8, nil)

using the following formula:
x1:sort[a0].if2'(ge(x1, x1), x1, x1, nil)=true

could be successfully shown:
(0) Formula
(1) Induction by data structure [EQUIVALENT, 0 ms]
(2) AND
    (3) Formula
        (4) Symbolic evaluation [EQUIVALENT, 0 ms]
        (5) YES
    (6) Formula
        (7) Symbolic evaluation [EQUIVALENT, 0 ms]
        (8) Formula
        (9) Hypothesis Lifting [EQUIVALENT, 0 ms]
        (10) Formula
        (11) Inverse Substitution [SOUND, 0 ms]
        (12) Formula
        (13) Inverse Substitution [SOUND, 0 ms]
        (14) Formula
        (15) Induction by data structure [EQUIVALENT, 0 ms]
        (16) AND
            (17) Formula
                (18) Symbolic evaluation [EQUIVALENT, 0 ms]
                (19) YES
            (20) Formula
                (21) Symbolic evaluation [EQUIVALENT, 0 ms]
                (22) YES


----------------------------------------

(0)
Obligation:
Formula:
x1:sort[a0].if2'(ge(x1, x1), x1, x1, nil)=true

There are no hypotheses.




----------------------------------------

(1) Induction by data structure (EQUIVALENT)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
if2'(ge(0, 0), 0, 0, nil)=true

There are no hypotheses.





1. Step Case:
Formula:
n:sort[a0].if2'(ge(s(n), s(n)), s(n), s(n), nil)=true

Hypotheses:
n:sort[a0].if2'(ge(n, n), n, n, nil)=true






----------------------------------------

(2)
Complex Obligation (AND)

----------------------------------------

(3)
Obligation:
Formula:
if2'(ge(0, 0), 0, 0, nil)=true

There are no hypotheses.




----------------------------------------

(4) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(5)
YES

----------------------------------------

(6)
Obligation:
Formula:
n:sort[a0].if2'(ge(s(n), s(n)), s(n), s(n), nil)=true

Hypotheses:
n:sort[a0].if2'(ge(n, n), n, n, nil)=true




----------------------------------------

(7) Symbolic evaluation (EQUIVALENT)
Could be shown by simple symbolic evaluation.
----------------------------------------

(8)
Obligation:
Formula:
n:sort[a0].if2'(ge(n, n), s(n), s(n), nil)=true

Hypotheses:
n:sort[a0].if2'(ge(n, n), n, n, nil)=true




----------------------------------------

(9) Hypothesis Lifting (EQUIVALENT)
Formula could be generalised by hypothesis lifting to the following new obligation:
Formula:
n:sort[a0].(if2'(ge(n, n), n, n, nil)=true->if2'(ge(n, n), s(n), s(n), nil)=true)

There are no hypotheses.




----------------------------------------

(10)
Obligation:
Formula:
n:sort[a0].(if2'(ge(n, n), n, n, nil)=true->if2'(ge(n, n), s(n), s(n), nil)=true)

There are no hypotheses.




----------------------------------------

(11) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n':sort[a36],n:sort[a0].(if2'(n', n, n, nil)=true->if2'(n', s(n), s(n), nil)=true)

Inverse substitution used:
[ge(n, n)/n']


----------------------------------------

(12)
Obligation:
Formula:
n':sort[a36],n:sort[a0].(if2'(n', n, n, nil)=true->if2'(n', s(n), s(n), nil)=true)

There are no hypotheses.




----------------------------------------

(13) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n':sort[a36],n:sort[a0],n'':sort[a0].(if2'(n', n, n, nil)=true->if2'(n', n'', n'', nil)=true)

Inverse substitution used:
[s(n)/n'']


----------------------------------------

(14)
Obligation:
Formula:
n':sort[a36],n:sort[a0],n'':sort[a0].(if2'(n', n, n, nil)=true->if2'(n', n'', n'', nil)=true)

There are no hypotheses.




----------------------------------------

(15) Induction by data structure (EQUIVALENT)
Induction by data structure sort[a36] generates the following cases:



1. Base Case:
Formula:
n:sort[a0],n'':sort[a0].(if2'(true_renamed, n, n, nil)=true->if2'(true_renamed, n'', n'', nil)=true)

There are no hypotheses.





1. Base Case:
Formula:
n:sort[a0],n'':sort[a0].(if2'(false_renamed, n, n, nil)=true->if2'(false_renamed, n'', n'', nil)=true)

There are no hypotheses.






----------------------------------------

(16)
Complex Obligation (AND)

----------------------------------------

(17)
Obligation:
Formula:
n:sort[a0],n'':sort[a0].(if2'(true_renamed, n, n, nil)=true->if2'(true_renamed, n'', n'', nil)=true)

There are no hypotheses.




----------------------------------------

(18) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(19)
YES

----------------------------------------

(20)
Obligation:
Formula:
n:sort[a0],n'':sort[a0].(if2'(false_renamed, n, n, nil)=true->if2'(false_renamed, n'', n'', nil)=true)

There are no hypotheses.




----------------------------------------

(21) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(22)
YES

(116) Complex Obligation (AND)

(117) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
if1(true, n, x, xs) → filterlow(n, xs)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
ge(0, s(x)) → false
half(0) → 0
if2(true, n, x, xs) → filterhigh(n, xs)
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))

We have to consider all minimal (P,Q,R)-chains.

(118) Induction-Processor (SOUND transformation)


This DP could be deleted by the Induction-Processor:
QS(0, cons(x0, cons(x1, x2))) → QS(0, if2(ge(x0, x0), x0, x0, cons(x1, x2)))


This order was computed:
Polynomial interpretation [POLO]:

POL(0) = 1   
POL(QS(x1, x2)) = x2   
POL(cons(x1, x2)) = 1 + x2   
POL(false_renamed) = 1   
POL(filterhigh(x1, x2)) = x2   
POL(filterlow(x1, x2)) = x2   
POL(ge(x1, x2)) = 1   
POL(half(x1)) = 1   
POL(if1(x1, x2, x3, x4)) = 1 + x4   
POL(if2(x1, x2, x3, x4)) = x1 + x4   
POL(nil) = 0   
POL(s(x1)) = 1 + x1   
POL(true_renamed) = 1   

At least one of these decreasing rules is always used after the deleted DP:
if2(true_renamed, n2, x6, xs1) → filterhigh(n2, xs1)


The following formula is valid:
x0:sort[a0],x1:sort[a0],x2:sort[a5].if2'(ge(x0 , x0 ), x0 , x0 , cons(x1 , x2 ))=true


The transformed set:
if2'(true_renamed, n2, x6, xs1) → true
filterhigh'(n3, cons(x7, xs2)) → if2'(ge(x7, n3), n3, x7, xs2)
if2'(false_renamed, n4, x8, xs3) → filterhigh'(n4, xs3)
filterhigh'(n5, nil) → false
ge(x, 0) → true_renamed
ge(s(x'), s(y)) → ge(x', y)
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
filterlow(n', cons(x3, xs')) → if1(ge(n', x3), n', x3, xs')
if1(false_renamed, n'', x4, xs'') → cons(x4, filterlow(n'', xs''))
filterlow(n1, nil) → nil
ge(0, s(x5)) → false_renamed
half(0) → 0
if2(true_renamed, n2, x6, xs1) → filterhigh(n2, xs1)
filterhigh(n3, cons(x7, xs2)) → if2(ge(x7, n3), n3, x7, xs2)
if2(false_renamed, n4, x8, xs3) → cons(x8, filterhigh(n4, xs3))
filterhigh(n5, nil) → nil
half(s(v14)) → 0
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_true(true) → true
isa_true(false) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v23)) → false
equal_sort[a0](s(v24), 0) → false
equal_sort[a0](s(v24), s(v25)) → equal_sort[a0](v24, v25)
equal_sort[a5](cons(v26, v27), cons(v28, v29)) → and(equal_sort[a0](v26, v28), equal_sort[a5](v27, v29))
equal_sort[a5](cons(v26, v27), nil) → false
equal_sort[a5](nil, cons(v30, v31)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a34](true_renamed, true_renamed) → true
equal_sort[a34](true_renamed, false_renamed) → false
equal_sort[a34](false_renamed, true_renamed) → false
equal_sort[a34](false_renamed, false_renamed) → true
equal_sort[a64](witness_sort[a64], witness_sort[a64]) → true


The proof given by the theorem prover:
The following output was given by the internal theorem prover:
proof of internal
# AProVE Commit ID: 3a20a6ef7432c3f292db1a8838479c42bf5e3b22 root 20240618 unpublished


Partial correctness of the following Program

   [x, v23, v24, v25, v26, v27, v28, v29, v30, v31, n2, x6, xs1, n4, x8, x7, xs2, n5, n3, x', y, x5, n1, n', x3, xs', v14, n, x'', n'', x4]
   equal_bool(true, false) -> false
   equal_bool(false, true) -> false
   equal_bool(true, true) -> true
   equal_bool(false, false) -> true
   true and x -> x
   false and x -> false
   true or x -> true
   false or x -> x
   not(false) -> true
   not(true) -> false
   isa_true(true) -> true
   isa_true(false) -> false
   isa_false(true) -> false
   isa_false(false) -> true
   equal_sort[a0](0, 0) -> true
   equal_sort[a0](0, s(v23)) -> false
   equal_sort[a0](s(v24), 0) -> false
   equal_sort[a0](s(v24), s(v25)) -> equal_sort[a0](v24, v25)
   equal_sort[a5](cons(v26, v27), cons(v28, v29)) -> equal_sort[a0](v26, v28) and equal_sort[a5](v27, v29)
   equal_sort[a5](cons(v26, v27), nil) -> false
   equal_sort[a5](nil, cons(v30, v31)) -> false
   equal_sort[a5](nil, nil) -> true
   equal_sort[a34](true_renamed, true_renamed) -> true
   equal_sort[a34](true_renamed, false_renamed) -> false
   equal_sort[a34](false_renamed, true_renamed) -> false
   equal_sort[a34](false_renamed, false_renamed) -> true
   equal_sort[a64](witness_sort[a64], witness_sort[a64]) -> true
   if2'(true_renamed, n2, x6, xs1) -> true
   if2'(false_renamed, n4, x8, cons(x7, xs2)) -> if2'(ge(x7, n4), n4, x7, xs2)
   if2'(false_renamed, n4, x8, nil) -> false
   filterhigh'(n5, nil) -> false
   equal_sort[a34](ge(x7, n3), true_renamed) -> true | filterhigh'(n3, cons(x7, xs2)) -> true
   equal_sort[a34](ge(x7, n3), true_renamed) -> false | filterhigh'(n3, cons(x7, xs2)) -> filterhigh'(n3, xs2)
   ge(x, 0) -> true_renamed
   ge(s(x'), s(y)) -> ge(x', y)
   ge(0, s(x5)) -> false_renamed
   filterlow(n1, nil) -> nil
   equal_sort[a34](ge(n', x3), true_renamed) -> true | filterlow(n', cons(x3, xs')) -> filterlow(n', xs')
   equal_sort[a34](ge(n', x3), true_renamed) -> false | filterlow(n', cons(x3, xs')) -> cons(x3, filterlow(n', xs'))
   half(0) -> 0
   half(s(v14)) -> 0
   filterhigh(n5, nil) -> nil
   equal_sort[a34](ge(x7, n3), true_renamed) -> true | filterhigh(n3, cons(x7, xs2)) -> filterhigh(n3, xs2)
   equal_sort[a34](ge(x7, n3), true_renamed) -> false | filterhigh(n3, cons(x7, xs2)) -> cons(x7, filterhigh(n3, xs2))
   if1(true_renamed, n, x'', cons(x3, xs')) -> if1(ge(n, x3), n, x3, xs')
   if1(true_renamed, n, x'', nil) -> nil
   if1(false_renamed, n'', x4, cons(x3, xs')) -> cons(x4, if1(ge(n'', x3), n'', x3, xs'))
   if1(false_renamed, n'', x4, nil) -> cons(x4, nil)
   if2(true_renamed, n2, x6, cons(x7, xs2)) -> if2(ge(x7, n2), n2, x7, xs2)
   if2(true_renamed, n2, x6, nil) -> nil
   if2(false_renamed, n4, x8, cons(x7, xs2)) -> cons(x8, if2(ge(x7, n4), n4, x7, xs2))
   if2(false_renamed, n4, x8, nil) -> cons(x8, nil)

using the following formula:
x0:sort[a0],x1:sort[a0],x2:sort[a5].if2'(ge(x0, x0), x0, x0, cons(x1, x2))=true

could be successfully shown:
(0) Formula
(1) Induction by data structure [EQUIVALENT, 0 ms]
(2) AND
    (3) Formula
        (4) Symbolic evaluation [EQUIVALENT, 0 ms]
        (5) YES
    (6) Formula
        (7) Symbolic evaluation [EQUIVALENT, 0 ms]
        (8) Formula
        (9) Case Analysis [EQUIVALENT, 0 ms]
        (10) AND
            (11) Formula
                (12) Case Analysis [EQUIVALENT, 0 ms]
                (13) AND
                    (14) Formula
                        (15) Inverse Substitution [SOUND, 0 ms]
                        (16) Formula
                        (17) Induction by data structure [SOUND, 0 ms]
                        (18) AND
                            (19) Formula
                                (20) Symbolic evaluation [EQUIVALENT, 0 ms]
                                (21) YES
                            (22) Formula
                                (23) Symbolic evaluation under hypothesis [EQUIVALENT, 0 ms]
                                (24) YES
                    (25) Formula
                        (26) Inverse Substitution [SOUND, 0 ms]
                        (27) Formula
                        (28) Induction by data structure [SOUND, 0 ms]
                        (29) AND
                            (30) Formula
                                (31) Symbolic evaluation [EQUIVALENT, 0 ms]
                                (32) YES
                            (33) Formula
                                (34) Symbolic evaluation under hypothesis [EQUIVALENT, 0 ms]
                                (35) YES
            (36) Formula
                (37) Case Analysis [EQUIVALENT, 0 ms]
                (38) AND
                    (39) Formula
                        (40) Inverse Substitution [SOUND, 0 ms]
                        (41) Formula
                        (42) Induction by data structure [SOUND, 0 ms]
                        (43) AND
                            (44) Formula
                                (45) Symbolic evaluation [EQUIVALENT, 0 ms]
                                (46) YES
                            (47) Formula
                                (48) Symbolic evaluation under hypothesis [EQUIVALENT, 0 ms]
                                (49) YES
                    (50) Formula
                        (51) Inverse Substitution [SOUND, 0 ms]
                        (52) Formula
                        (53) Induction by data structure [SOUND, 0 ms]
                        (54) AND
                            (55) Formula
                                (56) Symbolic evaluation [EQUIVALENT, 0 ms]
                                (57) YES
                            (58) Formula
                                (59) Symbolic evaluation under hypothesis [EQUIVALENT, 0 ms]
                                (60) YES


----------------------------------------

(0)
Obligation:
Formula:
x0:sort[a0],x1:sort[a0],x2:sort[a5].if2'(ge(x0, x0), x0, x0, cons(x1, x2))=true

There are no hypotheses.




----------------------------------------

(1) Induction by data structure (EQUIVALENT)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
x1:sort[a0],x2:sort[a5].if2'(ge(0, 0), 0, 0, cons(x1, x2))=true

There are no hypotheses.





1. Step Case:
Formula:
n:sort[a0],x1:sort[a0],x2:sort[a5].if2'(ge(s(n), s(n)), s(n), s(n), cons(x1, x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true






----------------------------------------

(2)
Complex Obligation (AND)

----------------------------------------

(3)
Obligation:
Formula:
x1:sort[a0],x2:sort[a5].if2'(ge(0, 0), 0, 0, cons(x1, x2))=true

There are no hypotheses.




----------------------------------------

(4) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(5)
YES

----------------------------------------

(6)
Obligation:
Formula:
n:sort[a0],x1:sort[a0],x2:sort[a5].if2'(ge(s(n), s(n)), s(n), s(n), cons(x1, x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(7) Symbolic evaluation (EQUIVALENT)
Could be shown by simple symbolic evaluation.
----------------------------------------

(8)
Obligation:
Formula:
n:sort[a0],x1:sort[a0],x2:sort[a5].if2'(ge(n, n), s(n), s(n), cons(x1, x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(9) Case Analysis (EQUIVALENT)
Case analysis leads to the following new obligations:

Formula:
n:sort[a0],x2:sort[a5].if2'(ge(n, n), s(n), s(n), cons(0, x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true





Formula:
n:sort[a0],x_1:sort[a0],x2:sort[a5].if2'(ge(n, n), s(n), s(n), cons(s(x_1), x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true






----------------------------------------

(10)
Complex Obligation (AND)

----------------------------------------

(11)
Obligation:
Formula:
n:sort[a0],x2:sort[a5].if2'(ge(n, n), s(n), s(n), cons(0, x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(12) Case Analysis (EQUIVALENT)
Case analysis leads to the following new obligations:

Formula:
n:sort[a0],x_1:sort[a0],x_2:sort[a5].if2'(ge(n, n), s(n), s(n), cons(0, cons(x_1, x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true





Formula:
n:sort[a0].if2'(ge(n, n), s(n), s(n), cons(0, nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true






----------------------------------------

(13)
Complex Obligation (AND)

----------------------------------------

(14)
Obligation:
Formula:
n:sort[a0],x_1:sort[a0],x_2:sort[a5].if2'(ge(n, n), s(n), s(n), cons(0, cons(x_1, x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(15) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n:sort[a0],n':sort[a0],x_1:sort[a0],x_2:sort[a5].if2'(ge(n, n), n', n', cons(0, cons(x_1, x_2)))=true

Inverse substitution used:
[s(n)/n']


----------------------------------------

(16)
Obligation:
Formula:
n:sort[a0],n':sort[a0],x_1:sort[a0],x_2:sort[a5].if2'(ge(n, n), n', n', cons(0, cons(x_1, x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(17) Induction by data structure (SOUND)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
n':sort[a0],x_1:sort[a0],x_2:sort[a5].if2'(ge(0, 0), n', n', cons(0, cons(x_1, x_2)))=true

There are no hypotheses.





1. Step Case:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0],x_2:sort[a5].if2'(ge(s(n''), s(n'')), n', n', cons(0, cons(x_1, x_2)))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_2:sort[a5].if2'(ge(n'', n''), n', n', cons(0, cons(x_1, x_2)))=true






----------------------------------------

(18)
Complex Obligation (AND)

----------------------------------------

(19)
Obligation:
Formula:
n':sort[a0],x_1:sort[a0],x_2:sort[a5].if2'(ge(0, 0), n', n', cons(0, cons(x_1, x_2)))=true

There are no hypotheses.




----------------------------------------

(20) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(21)
YES

----------------------------------------

(22)
Obligation:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0],x_2:sort[a5].if2'(ge(s(n''), s(n'')), n', n', cons(0, cons(x_1, x_2)))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_2:sort[a5].if2'(ge(n'', n''), n', n', cons(0, cons(x_1, x_2)))=true




----------------------------------------

(23) Symbolic evaluation under hypothesis (EQUIVALENT)
Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses:

n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_2:sort[a5].if2'(ge(n'', n''), n', n', cons(0, cons(x_1, x_2)))=true

----------------------------------------

(24)
YES

----------------------------------------

(25)
Obligation:
Formula:
n:sort[a0].if2'(ge(n, n), s(n), s(n), cons(0, nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(26) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n:sort[a0],n':sort[a0].if2'(ge(n, n), n', n', cons(0, nil))=true

Inverse substitution used:
[s(n)/n']


----------------------------------------

(27)
Obligation:
Formula:
n:sort[a0],n':sort[a0].if2'(ge(n, n), n', n', cons(0, nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(28) Induction by data structure (SOUND)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
n':sort[a0].if2'(ge(0, 0), n', n', cons(0, nil))=true

There are no hypotheses.





1. Step Case:
Formula:
n'':sort[a0],n':sort[a0].if2'(ge(s(n''), s(n'')), n', n', cons(0, nil))=true

Hypotheses:
n'':sort[a0],!n':sort[a0].if2'(ge(n'', n''), n', n', cons(0, nil))=true






----------------------------------------

(29)
Complex Obligation (AND)

----------------------------------------

(30)
Obligation:
Formula:
n':sort[a0].if2'(ge(0, 0), n', n', cons(0, nil))=true

There are no hypotheses.




----------------------------------------

(31) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(32)
YES

----------------------------------------

(33)
Obligation:
Formula:
n'':sort[a0],n':sort[a0].if2'(ge(s(n''), s(n'')), n', n', cons(0, nil))=true

Hypotheses:
n'':sort[a0],!n':sort[a0].if2'(ge(n'', n''), n', n', cons(0, nil))=true




----------------------------------------

(34) Symbolic evaluation under hypothesis (EQUIVALENT)
Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses:

n'':sort[a0],!n':sort[a0].if2'(ge(n'', n''), n', n', cons(0, nil))=true

----------------------------------------

(35)
YES

----------------------------------------

(36)
Obligation:
Formula:
n:sort[a0],x_1:sort[a0],x2:sort[a5].if2'(ge(n, n), s(n), s(n), cons(s(x_1), x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(37) Case Analysis (EQUIVALENT)
Case analysis leads to the following new obligations:

Formula:
n:sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if2'(ge(n, n), s(n), s(n), cons(s(x_1), cons(x_1', x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true





Formula:
n:sort[a0],x_1:sort[a0].if2'(ge(n, n), s(n), s(n), cons(s(x_1), nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true






----------------------------------------

(38)
Complex Obligation (AND)

----------------------------------------

(39)
Obligation:
Formula:
n:sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if2'(ge(n, n), s(n), s(n), cons(s(x_1), cons(x_1', x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(40) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n:sort[a0],n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if2'(ge(n, n), n', n', cons(s(x_1), cons(x_1', x_2)))=true

Inverse substitution used:
[s(n)/n']


----------------------------------------

(41)
Obligation:
Formula:
n:sort[a0],n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if2'(ge(n, n), n', n', cons(s(x_1), cons(x_1', x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(42) Induction by data structure (SOUND)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if2'(ge(0, 0), n', n', cons(s(x_1), cons(x_1', x_2)))=true

There are no hypotheses.





1. Step Case:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if2'(ge(s(n''), s(n'')), n', n', cons(s(x_1), cons(x_1', x_2)))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_1':sort[a0],!x_2:sort[a5].if2'(ge(n'', n''), n', n', cons(s(x_1), cons(x_1', x_2)))=true






----------------------------------------

(43)
Complex Obligation (AND)

----------------------------------------

(44)
Obligation:
Formula:
n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if2'(ge(0, 0), n', n', cons(s(x_1), cons(x_1', x_2)))=true

There are no hypotheses.




----------------------------------------

(45) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(46)
YES

----------------------------------------

(47)
Obligation:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if2'(ge(s(n''), s(n'')), n', n', cons(s(x_1), cons(x_1', x_2)))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_1':sort[a0],!x_2:sort[a5].if2'(ge(n'', n''), n', n', cons(s(x_1), cons(x_1', x_2)))=true




----------------------------------------

(48) Symbolic evaluation under hypothesis (EQUIVALENT)
Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses:

n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_1':sort[a0],!x_2:sort[a5].if2'(ge(n'', n''), n', n', cons(s(x_1), cons(x_1', x_2)))=true

----------------------------------------

(49)
YES

----------------------------------------

(50)
Obligation:
Formula:
n:sort[a0],x_1:sort[a0].if2'(ge(n, n), s(n), s(n), cons(s(x_1), nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(51) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n:sort[a0],n':sort[a0],x_1:sort[a0].if2'(ge(n, n), n', n', cons(s(x_1), nil))=true

Inverse substitution used:
[s(n)/n']


----------------------------------------

(52)
Obligation:
Formula:
n:sort[a0],n':sort[a0],x_1:sort[a0].if2'(ge(n, n), n', n', cons(s(x_1), nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if2'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(53) Induction by data structure (SOUND)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
n':sort[a0],x_1:sort[a0].if2'(ge(0, 0), n', n', cons(s(x_1), nil))=true

There are no hypotheses.





1. Step Case:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0].if2'(ge(s(n''), s(n'')), n', n', cons(s(x_1), nil))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0].if2'(ge(n'', n''), n', n', cons(s(x_1), nil))=true






----------------------------------------

(54)
Complex Obligation (AND)

----------------------------------------

(55)
Obligation:
Formula:
n':sort[a0],x_1:sort[a0].if2'(ge(0, 0), n', n', cons(s(x_1), nil))=true

There are no hypotheses.




----------------------------------------

(56) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(57)
YES

----------------------------------------

(58)
Obligation:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0].if2'(ge(s(n''), s(n'')), n', n', cons(s(x_1), nil))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0].if2'(ge(n'', n''), n', n', cons(s(x_1), nil))=true




----------------------------------------

(59) Symbolic evaluation under hypothesis (EQUIVALENT)
Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses:

n'':sort[a0],!n':sort[a0],!x_1:sort[a0].if2'(ge(n'', n''), n', n', cons(s(x_1), nil))=true

----------------------------------------

(60)
YES

(119) Complex Obligation (AND)

(120) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
if1(true, n, x, xs) → filterlow(n, xs)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
ge(0, s(x)) → false
half(0) → 0
if2(true, n, x, xs) → filterhigh(n, xs)
filterhigh(n, cons(x, xs)) → if2(ge(x, n), n, x, xs)
if2(false, n, x, xs) → cons(x, filterhigh(n, xs))
filterhigh(n, nil) → nil

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))

We have to consider all minimal (P,Q,R)-chains.

(121) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(122) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
ge(0, s(x)) → false
half(0) → 0

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))

We have to consider all minimal (P,Q,R)-chains.

(123) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

filterhigh(x0, nil)
filterhigh(x0, cons(x1, x2))
if2(true, x0, x1, x2)
if2(false, x0, x1, x2)

(124) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
ge(0, s(x)) → false
half(0) → 0

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))

We have to consider all minimal (P,Q,R)-chains.

(125) Induction-Processor (SOUND transformation)


This DP could be deleted by the Induction-Processor:
QS(x0, cons(x1, nil)) → QS(half(x0), if1(ge(x1, x1), x1, x1, nil))


This order was computed:
Polynomial interpretation [POLO]:

POL(0) = 1   
POL(QS(x1, x2)) = x2   
POL(cons(x1, x2)) = 1 + x2   
POL(false_renamed) = 1   
POL(filterlow(x1, x2)) = x2   
POL(ge(x1, x2)) = 1   
POL(half(x1)) = 1   
POL(if1(x1, x2, x3, x4)) = x1 + x4   
POL(nil) = 0   
POL(s(x1)) = 1 + x1   
POL(true_renamed) = 1   

At least one of these decreasing rules is always used after the deleted DP:
if1(true_renamed, n, x'', xs) → filterlow(n, xs)


The following formula is valid:
x1:sort[a0].if1'(ge(x1 , x1 ), x1 , x1 , nil)=true


The transformed set:
if1'(true_renamed, n, x'', xs) → true
if1'(false_renamed, n', x3, xs') → filterlow'(n', xs')
filterlow'(n'', nil) → false
filterlow'(n1, cons(x5, xs'')) → if1'(ge(n1, x5), n1, x5, xs'')
ge(x, 0) → true_renamed
ge(s(x'), s(y)) → ge(x', y)
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
if1(false_renamed, n', x3, xs') → cons(x3, filterlow(n', xs'))
filterlow(n'', nil) → nil
ge(0, s(x4)) → false_renamed
half(0) → 0
filterlow(n1, cons(x5, xs'')) → if1(ge(n1, x5), n1, x5, xs'')
half(s(v14)) → 0
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_true(true) → true
isa_true(false) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v15)) → false
equal_sort[a0](s(v16), 0) → false
equal_sort[a0](s(v16), s(v17)) → equal_sort[a0](v16, v17)
equal_sort[a5](cons(v18, v19), cons(v20, v21)) → and(equal_sort[a0](v18, v20), equal_sort[a5](v19, v21))
equal_sort[a5](cons(v18, v19), nil) → false
equal_sort[a5](nil, cons(v22, v23)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a21](true_renamed, true_renamed) → true
equal_sort[a21](true_renamed, false_renamed) → false
equal_sort[a21](false_renamed, true_renamed) → false
equal_sort[a21](false_renamed, false_renamed) → true
equal_sort[a43](witness_sort[a43], witness_sort[a43]) → true


The proof given by the theorem prover:
The following output was given by the internal theorem prover:
proof of internal
# AProVE Commit ID: 3a20a6ef7432c3f292db1a8838479c42bf5e3b22 root 20240618 unpublished


Partial correctness of the following Program

   [x, v15, v16, v17, v18, v19, v20, v21, v22, v23, n, x'', xs, n', x3, x5, xs'', n'', n1, x', y, x4, v14]
   equal_bool(true, false) -> false
   equal_bool(false, true) -> false
   equal_bool(true, true) -> true
   equal_bool(false, false) -> true
   true and x -> x
   false and x -> false
   true or x -> true
   false or x -> x
   not(false) -> true
   not(true) -> false
   isa_true(true) -> true
   isa_true(false) -> false
   isa_false(true) -> false
   isa_false(false) -> true
   equal_sort[a0](0, 0) -> true
   equal_sort[a0](0, s(v15)) -> false
   equal_sort[a0](s(v16), 0) -> false
   equal_sort[a0](s(v16), s(v17)) -> equal_sort[a0](v16, v17)
   equal_sort[a5](cons(v18, v19), cons(v20, v21)) -> equal_sort[a0](v18, v20) and equal_sort[a5](v19, v21)
   equal_sort[a5](cons(v18, v19), nil) -> false
   equal_sort[a5](nil, cons(v22, v23)) -> false
   equal_sort[a5](nil, nil) -> true
   equal_sort[a21](true_renamed, true_renamed) -> true
   equal_sort[a21](true_renamed, false_renamed) -> false
   equal_sort[a21](false_renamed, true_renamed) -> false
   equal_sort[a21](false_renamed, false_renamed) -> true
   equal_sort[a43](witness_sort[a43], witness_sort[a43]) -> true
   if1'(true_renamed, n, x'', xs) -> true
   if1'(false_renamed, n', x3, nil) -> false
   if1'(false_renamed, n', x3, cons(x5, xs'')) -> if1'(ge(n', x5), n', x5, xs'')
   filterlow'(n'', nil) -> false
   equal_sort[a21](ge(n1, x5), true_renamed) -> true | filterlow'(n1, cons(x5, xs'')) -> true
   equal_sort[a21](ge(n1, x5), true_renamed) -> false | filterlow'(n1, cons(x5, xs'')) -> filterlow'(n1, xs'')
   ge(x, 0) -> true_renamed
   ge(s(x'), s(y)) -> ge(x', y)
   ge(0, s(x4)) -> false_renamed
   filterlow(n'', nil) -> nil
   equal_sort[a21](ge(n1, x5), true_renamed) -> true | filterlow(n1, cons(x5, xs'')) -> filterlow(n1, xs'')
   equal_sort[a21](ge(n1, x5), true_renamed) -> false | filterlow(n1, cons(x5, xs'')) -> cons(x5, filterlow(n1, xs''))
   half(0) -> 0
   half(s(v14)) -> 0
   if1(true_renamed, n, x'', nil) -> nil
   if1(true_renamed, n, x'', cons(x5, xs'')) -> if1(ge(n, x5), n, x5, xs'')
   if1(false_renamed, n', x3, nil) -> cons(x3, nil)
   if1(false_renamed, n', x3, cons(x5, xs'')) -> cons(x3, if1(ge(n', x5), n', x5, xs''))

using the following formula:
x1:sort[a0].if1'(ge(x1, x1), x1, x1, nil)=true

could be successfully shown:
(0) Formula
(1) Induction by data structure [EQUIVALENT, 0 ms]
(2) AND
    (3) Formula
        (4) Symbolic evaluation [EQUIVALENT, 0 ms]
        (5) YES
    (6) Formula
        (7) Symbolic evaluation [EQUIVALENT, 0 ms]
        (8) Formula
        (9) Hypothesis Lifting [EQUIVALENT, 0 ms]
        (10) Formula
        (11) Inverse Substitution [SOUND, 0 ms]
        (12) Formula
        (13) Inverse Substitution [SOUND, 0 ms]
        (14) Formula
        (15) Induction by data structure [EQUIVALENT, 0 ms]
        (16) AND
            (17) Formula
                (18) Symbolic evaluation [EQUIVALENT, 0 ms]
                (19) YES
            (20) Formula
                (21) Symbolic evaluation [EQUIVALENT, 0 ms]
                (22) YES


----------------------------------------

(0)
Obligation:
Formula:
x1:sort[a0].if1'(ge(x1, x1), x1, x1, nil)=true

There are no hypotheses.




----------------------------------------

(1) Induction by data structure (EQUIVALENT)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
if1'(ge(0, 0), 0, 0, nil)=true

There are no hypotheses.





1. Step Case:
Formula:
n:sort[a0].if1'(ge(s(n), s(n)), s(n), s(n), nil)=true

Hypotheses:
n:sort[a0].if1'(ge(n, n), n, n, nil)=true






----------------------------------------

(2)
Complex Obligation (AND)

----------------------------------------

(3)
Obligation:
Formula:
if1'(ge(0, 0), 0, 0, nil)=true

There are no hypotheses.




----------------------------------------

(4) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(5)
YES

----------------------------------------

(6)
Obligation:
Formula:
n:sort[a0].if1'(ge(s(n), s(n)), s(n), s(n), nil)=true

Hypotheses:
n:sort[a0].if1'(ge(n, n), n, n, nil)=true




----------------------------------------

(7) Symbolic evaluation (EQUIVALENT)
Could be shown by simple symbolic evaluation.
----------------------------------------

(8)
Obligation:
Formula:
n:sort[a0].if1'(ge(n, n), s(n), s(n), nil)=true

Hypotheses:
n:sort[a0].if1'(ge(n, n), n, n, nil)=true




----------------------------------------

(9) Hypothesis Lifting (EQUIVALENT)
Formula could be generalised by hypothesis lifting to the following new obligation:
Formula:
n:sort[a0].(if1'(ge(n, n), n, n, nil)=true->if1'(ge(n, n), s(n), s(n), nil)=true)

There are no hypotheses.




----------------------------------------

(10)
Obligation:
Formula:
n:sort[a0].(if1'(ge(n, n), n, n, nil)=true->if1'(ge(n, n), s(n), s(n), nil)=true)

There are no hypotheses.




----------------------------------------

(11) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n':sort[a21],n:sort[a0].(if1'(n', n, n, nil)=true->if1'(n', s(n), s(n), nil)=true)

Inverse substitution used:
[ge(n, n)/n']


----------------------------------------

(12)
Obligation:
Formula:
n':sort[a21],n:sort[a0].(if1'(n', n, n, nil)=true->if1'(n', s(n), s(n), nil)=true)

There are no hypotheses.




----------------------------------------

(13) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n':sort[a21],n:sort[a0],n'':sort[a0].(if1'(n', n, n, nil)=true->if1'(n', n'', n'', nil)=true)

Inverse substitution used:
[s(n)/n'']


----------------------------------------

(14)
Obligation:
Formula:
n':sort[a21],n:sort[a0],n'':sort[a0].(if1'(n', n, n, nil)=true->if1'(n', n'', n'', nil)=true)

There are no hypotheses.




----------------------------------------

(15) Induction by data structure (EQUIVALENT)
Induction by data structure sort[a21] generates the following cases:



1. Base Case:
Formula:
n:sort[a0],n'':sort[a0].(if1'(true_renamed, n, n, nil)=true->if1'(true_renamed, n'', n'', nil)=true)

There are no hypotheses.





1. Base Case:
Formula:
n:sort[a0],n'':sort[a0].(if1'(false_renamed, n, n, nil)=true->if1'(false_renamed, n'', n'', nil)=true)

There are no hypotheses.






----------------------------------------

(16)
Complex Obligation (AND)

----------------------------------------

(17)
Obligation:
Formula:
n:sort[a0],n'':sort[a0].(if1'(true_renamed, n, n, nil)=true->if1'(true_renamed, n'', n'', nil)=true)

There are no hypotheses.




----------------------------------------

(18) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(19)
YES

----------------------------------------

(20)
Obligation:
Formula:
n:sort[a0],n'':sort[a0].(if1'(false_renamed, n, n, nil)=true->if1'(false_renamed, n'', n'', nil)=true)

There are no hypotheses.




----------------------------------------

(21) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(22)
YES

(126) Complex Obligation (AND)

(127) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(true, n, x, xs) → filterlow(n, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
ge(0, s(x)) → false
half(0) → 0

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))

We have to consider all minimal (P,Q,R)-chains.

(128) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(129) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
if1(true, n, x, xs) → filterlow(n, xs)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
ge(0, s(x)) → false

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))
half(0)
half(s(0))
half(s(s(x0)))

We have to consider all minimal (P,Q,R)-chains.

(130) QReductionProof (EQUIVALENT transformation)

We deleted the following terms from Q as each root-symbol of these terms does neither occur in P nor in R.[THIEMANN].

half(0)
half(s(0))
half(s(s(x0)))

(131) Obligation:

Q DP problem:
The TRS P consists of the following rules:

QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))

The TRS R consists of the following rules:

ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
if1(true, n, x, xs) → filterlow(n, xs)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
ge(0, s(x)) → false

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))

We have to consider all minimal (P,Q,R)-chains.

(132) Induction-Processor (SOUND transformation)


This DP could be deleted by the Induction-Processor:
QS(0, cons(x0, cons(x1, x2))) → QS(0, if1(ge(x0, x0), x0, x0, cons(x1, x2)))


This order was computed:
Polynomial interpretation [POLO]:

POL(0) = 1   
POL(QS(x1, x2)) = x2   
POL(cons(x1, x2)) = 1 + x2   
POL(false_renamed) = 1   
POL(filterlow(x1, x2)) = x2   
POL(ge(x1, x2)) = 1   
POL(if1(x1, x2, x3, x4)) = x1 + x4   
POL(nil) = 0   
POL(s(x1)) = x1   
POL(true_renamed) = 1   

At least one of these decreasing rules is always used after the deleted DP:
if1(true_renamed, n, x'', xs) → filterlow(n, xs)


The following formula is valid:
x0:sort[a0],x1:sort[a0],x2:sort[a5].if1'(ge(x0 , x0 ), x0 , x0 , cons(x1 , x2 ))=true


The transformed set:
if1'(true_renamed, n, x'', xs) → true
filterlow'(n', cons(x3, xs')) → if1'(ge(n', x3), n', x3, xs')
if1'(false_renamed, n'', x4, xs'') → filterlow'(n'', xs'')
filterlow'(n1, nil) → false
ge(x, 0) → true_renamed
ge(s(x'), s(y)) → ge(x', y)
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
filterlow(n', cons(x3, xs')) → if1(ge(n', x3), n', x3, xs')
if1(false_renamed, n'', x4, xs'') → cons(x4, filterlow(n'', xs''))
filterlow(n1, nil) → nil
ge(0, s(x5)) → false_renamed
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_true(true) → true
isa_true(false) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v13)) → false
equal_sort[a0](s(v14), 0) → false
equal_sort[a0](s(v14), s(v15)) → equal_sort[a0](v14, v15)
equal_sort[a5](cons(v16, v17), cons(v18, v19)) → and(equal_sort[a0](v16, v18), equal_sort[a5](v17, v19))
equal_sort[a5](cons(v16, v17), nil) → false
equal_sort[a5](nil, cons(v20, v21)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a19](true_renamed, true_renamed) → true
equal_sort[a19](true_renamed, false_renamed) → false
equal_sort[a19](false_renamed, true_renamed) → false
equal_sort[a19](false_renamed, false_renamed) → true
equal_sort[a39](witness_sort[a39], witness_sort[a39]) → true


The proof given by the theorem prover:
The following output was given by the internal theorem prover:
proof of internal
# AProVE Commit ID: 3a20a6ef7432c3f292db1a8838479c42bf5e3b22 root 20240618 unpublished


Partial correctness of the following Program

   [x, v13, v14, v15, v16, v17, v18, v19, v20, v21, n, x'', xs, n'', x4, x3, xs', n1, n', x', y, x5]
   equal_bool(true, false) -> false
   equal_bool(false, true) -> false
   equal_bool(true, true) -> true
   equal_bool(false, false) -> true
   true and x -> x
   false and x -> false
   true or x -> true
   false or x -> x
   not(false) -> true
   not(true) -> false
   isa_true(true) -> true
   isa_true(false) -> false
   isa_false(true) -> false
   isa_false(false) -> true
   equal_sort[a0](0, 0) -> true
   equal_sort[a0](0, s(v13)) -> false
   equal_sort[a0](s(v14), 0) -> false
   equal_sort[a0](s(v14), s(v15)) -> equal_sort[a0](v14, v15)
   equal_sort[a5](cons(v16, v17), cons(v18, v19)) -> equal_sort[a0](v16, v18) and equal_sort[a5](v17, v19)
   equal_sort[a5](cons(v16, v17), nil) -> false
   equal_sort[a5](nil, cons(v20, v21)) -> false
   equal_sort[a5](nil, nil) -> true
   equal_sort[a19](true_renamed, true_renamed) -> true
   equal_sort[a19](true_renamed, false_renamed) -> false
   equal_sort[a19](false_renamed, true_renamed) -> false
   equal_sort[a19](false_renamed, false_renamed) -> true
   equal_sort[a39](witness_sort[a39], witness_sort[a39]) -> true
   if1'(true_renamed, n, x'', xs) -> true
   if1'(false_renamed, n'', x4, cons(x3, xs')) -> if1'(ge(n'', x3), n'', x3, xs')
   if1'(false_renamed, n'', x4, nil) -> false
   filterlow'(n1, nil) -> false
   equal_sort[a19](ge(n', x3), true_renamed) -> true | filterlow'(n', cons(x3, xs')) -> true
   equal_sort[a19](ge(n', x3), true_renamed) -> false | filterlow'(n', cons(x3, xs')) -> filterlow'(n', xs')
   ge(x, 0) -> true_renamed
   ge(s(x'), s(y)) -> ge(x', y)
   ge(0, s(x5)) -> false_renamed
   filterlow(n1, nil) -> nil
   equal_sort[a19](ge(n', x3), true_renamed) -> true | filterlow(n', cons(x3, xs')) -> filterlow(n', xs')
   equal_sort[a19](ge(n', x3), true_renamed) -> false | filterlow(n', cons(x3, xs')) -> cons(x3, filterlow(n', xs'))
   if1(true_renamed, n, x'', cons(x3, xs')) -> if1(ge(n, x3), n, x3, xs')
   if1(true_renamed, n, x'', nil) -> nil
   if1(false_renamed, n'', x4, cons(x3, xs')) -> cons(x4, if1(ge(n'', x3), n'', x3, xs'))
   if1(false_renamed, n'', x4, nil) -> cons(x4, nil)

using the following formula:
x0:sort[a0],x1:sort[a0],x2:sort[a5].if1'(ge(x0, x0), x0, x0, cons(x1, x2))=true

could be successfully shown:
(0) Formula
(1) Induction by data structure [EQUIVALENT, 0 ms]
(2) AND
    (3) Formula
        (4) Symbolic evaluation [EQUIVALENT, 0 ms]
        (5) YES
    (6) Formula
        (7) Symbolic evaluation [EQUIVALENT, 0 ms]
        (8) Formula
        (9) Case Analysis [EQUIVALENT, 0 ms]
        (10) AND
            (11) Formula
                (12) Case Analysis [EQUIVALENT, 0 ms]
                (13) AND
                    (14) Formula
                        (15) Inverse Substitution [SOUND, 0 ms]
                        (16) Formula
                        (17) Induction by data structure [SOUND, 0 ms]
                        (18) AND
                            (19) Formula
                                (20) Symbolic evaluation [EQUIVALENT, 0 ms]
                                (21) YES
                            (22) Formula
                                (23) Symbolic evaluation under hypothesis [EQUIVALENT, 0 ms]
                                (24) YES
                    (25) Formula
                        (26) Inverse Substitution [SOUND, 0 ms]
                        (27) Formula
                        (28) Induction by data structure [SOUND, 0 ms]
                        (29) AND
                            (30) Formula
                                (31) Symbolic evaluation [EQUIVALENT, 0 ms]
                                (32) YES
                            (33) Formula
                                (34) Symbolic evaluation under hypothesis [EQUIVALENT, 0 ms]
                                (35) YES
            (36) Formula
                (37) Case Analysis [EQUIVALENT, 0 ms]
                (38) AND
                    (39) Formula
                        (40) Inverse Substitution [SOUND, 0 ms]
                        (41) Formula
                        (42) Induction by data structure [SOUND, 0 ms]
                        (43) AND
                            (44) Formula
                                (45) Symbolic evaluation [EQUIVALENT, 0 ms]
                                (46) YES
                            (47) Formula
                                (48) Symbolic evaluation under hypothesis [EQUIVALENT, 0 ms]
                                (49) YES
                    (50) Formula
                        (51) Inverse Substitution [SOUND, 0 ms]
                        (52) Formula
                        (53) Induction by data structure [SOUND, 0 ms]
                        (54) AND
                            (55) Formula
                                (56) Symbolic evaluation [EQUIVALENT, 0 ms]
                                (57) YES
                            (58) Formula
                                (59) Symbolic evaluation under hypothesis [EQUIVALENT, 0 ms]
                                (60) YES


----------------------------------------

(0)
Obligation:
Formula:
x0:sort[a0],x1:sort[a0],x2:sort[a5].if1'(ge(x0, x0), x0, x0, cons(x1, x2))=true

There are no hypotheses.




----------------------------------------

(1) Induction by data structure (EQUIVALENT)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
x1:sort[a0],x2:sort[a5].if1'(ge(0, 0), 0, 0, cons(x1, x2))=true

There are no hypotheses.





1. Step Case:
Formula:
n:sort[a0],x1:sort[a0],x2:sort[a5].if1'(ge(s(n), s(n)), s(n), s(n), cons(x1, x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true






----------------------------------------

(2)
Complex Obligation (AND)

----------------------------------------

(3)
Obligation:
Formula:
x1:sort[a0],x2:sort[a5].if1'(ge(0, 0), 0, 0, cons(x1, x2))=true

There are no hypotheses.




----------------------------------------

(4) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(5)
YES

----------------------------------------

(6)
Obligation:
Formula:
n:sort[a0],x1:sort[a0],x2:sort[a5].if1'(ge(s(n), s(n)), s(n), s(n), cons(x1, x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(7) Symbolic evaluation (EQUIVALENT)
Could be shown by simple symbolic evaluation.
----------------------------------------

(8)
Obligation:
Formula:
n:sort[a0],x1:sort[a0],x2:sort[a5].if1'(ge(n, n), s(n), s(n), cons(x1, x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(9) Case Analysis (EQUIVALENT)
Case analysis leads to the following new obligations:

Formula:
n:sort[a0],x2:sort[a5].if1'(ge(n, n), s(n), s(n), cons(0, x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true





Formula:
n:sort[a0],x_1:sort[a0],x2:sort[a5].if1'(ge(n, n), s(n), s(n), cons(s(x_1), x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true






----------------------------------------

(10)
Complex Obligation (AND)

----------------------------------------

(11)
Obligation:
Formula:
n:sort[a0],x2:sort[a5].if1'(ge(n, n), s(n), s(n), cons(0, x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(12) Case Analysis (EQUIVALENT)
Case analysis leads to the following new obligations:

Formula:
n:sort[a0],x_1:sort[a0],x_2:sort[a5].if1'(ge(n, n), s(n), s(n), cons(0, cons(x_1, x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true





Formula:
n:sort[a0].if1'(ge(n, n), s(n), s(n), cons(0, nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true






----------------------------------------

(13)
Complex Obligation (AND)

----------------------------------------

(14)
Obligation:
Formula:
n:sort[a0],x_1:sort[a0],x_2:sort[a5].if1'(ge(n, n), s(n), s(n), cons(0, cons(x_1, x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(15) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n:sort[a0],n':sort[a0],x_1:sort[a0],x_2:sort[a5].if1'(ge(n, n), n', n', cons(0, cons(x_1, x_2)))=true

Inverse substitution used:
[s(n)/n']


----------------------------------------

(16)
Obligation:
Formula:
n:sort[a0],n':sort[a0],x_1:sort[a0],x_2:sort[a5].if1'(ge(n, n), n', n', cons(0, cons(x_1, x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(17) Induction by data structure (SOUND)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
n':sort[a0],x_1:sort[a0],x_2:sort[a5].if1'(ge(0, 0), n', n', cons(0, cons(x_1, x_2)))=true

There are no hypotheses.





1. Step Case:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0],x_2:sort[a5].if1'(ge(s(n''), s(n'')), n', n', cons(0, cons(x_1, x_2)))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_2:sort[a5].if1'(ge(n'', n''), n', n', cons(0, cons(x_1, x_2)))=true






----------------------------------------

(18)
Complex Obligation (AND)

----------------------------------------

(19)
Obligation:
Formula:
n':sort[a0],x_1:sort[a0],x_2:sort[a5].if1'(ge(0, 0), n', n', cons(0, cons(x_1, x_2)))=true

There are no hypotheses.




----------------------------------------

(20) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(21)
YES

----------------------------------------

(22)
Obligation:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0],x_2:sort[a5].if1'(ge(s(n''), s(n'')), n', n', cons(0, cons(x_1, x_2)))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_2:sort[a5].if1'(ge(n'', n''), n', n', cons(0, cons(x_1, x_2)))=true




----------------------------------------

(23) Symbolic evaluation under hypothesis (EQUIVALENT)
Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses:

n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_2:sort[a5].if1'(ge(n'', n''), n', n', cons(0, cons(x_1, x_2)))=true

----------------------------------------

(24)
YES

----------------------------------------

(25)
Obligation:
Formula:
n:sort[a0].if1'(ge(n, n), s(n), s(n), cons(0, nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(26) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n:sort[a0],n':sort[a0].if1'(ge(n, n), n', n', cons(0, nil))=true

Inverse substitution used:
[s(n)/n']


----------------------------------------

(27)
Obligation:
Formula:
n:sort[a0],n':sort[a0].if1'(ge(n, n), n', n', cons(0, nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(28) Induction by data structure (SOUND)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
n':sort[a0].if1'(ge(0, 0), n', n', cons(0, nil))=true

There are no hypotheses.





1. Step Case:
Formula:
n'':sort[a0],n':sort[a0].if1'(ge(s(n''), s(n'')), n', n', cons(0, nil))=true

Hypotheses:
n'':sort[a0],!n':sort[a0].if1'(ge(n'', n''), n', n', cons(0, nil))=true






----------------------------------------

(29)
Complex Obligation (AND)

----------------------------------------

(30)
Obligation:
Formula:
n':sort[a0].if1'(ge(0, 0), n', n', cons(0, nil))=true

There are no hypotheses.




----------------------------------------

(31) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(32)
YES

----------------------------------------

(33)
Obligation:
Formula:
n'':sort[a0],n':sort[a0].if1'(ge(s(n''), s(n'')), n', n', cons(0, nil))=true

Hypotheses:
n'':sort[a0],!n':sort[a0].if1'(ge(n'', n''), n', n', cons(0, nil))=true




----------------------------------------

(34) Symbolic evaluation under hypothesis (EQUIVALENT)
Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses:

n'':sort[a0],!n':sort[a0].if1'(ge(n'', n''), n', n', cons(0, nil))=true

----------------------------------------

(35)
YES

----------------------------------------

(36)
Obligation:
Formula:
n:sort[a0],x_1:sort[a0],x2:sort[a5].if1'(ge(n, n), s(n), s(n), cons(s(x_1), x2))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(37) Case Analysis (EQUIVALENT)
Case analysis leads to the following new obligations:

Formula:
n:sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if1'(ge(n, n), s(n), s(n), cons(s(x_1), cons(x_1', x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true





Formula:
n:sort[a0],x_1:sort[a0].if1'(ge(n, n), s(n), s(n), cons(s(x_1), nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true






----------------------------------------

(38)
Complex Obligation (AND)

----------------------------------------

(39)
Obligation:
Formula:
n:sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if1'(ge(n, n), s(n), s(n), cons(s(x_1), cons(x_1', x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(40) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n:sort[a0],n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if1'(ge(n, n), n', n', cons(s(x_1), cons(x_1', x_2)))=true

Inverse substitution used:
[s(n)/n']


----------------------------------------

(41)
Obligation:
Formula:
n:sort[a0],n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if1'(ge(n, n), n', n', cons(s(x_1), cons(x_1', x_2)))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(42) Induction by data structure (SOUND)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if1'(ge(0, 0), n', n', cons(s(x_1), cons(x_1', x_2)))=true

There are no hypotheses.





1. Step Case:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if1'(ge(s(n''), s(n'')), n', n', cons(s(x_1), cons(x_1', x_2)))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_1':sort[a0],!x_2:sort[a5].if1'(ge(n'', n''), n', n', cons(s(x_1), cons(x_1', x_2)))=true






----------------------------------------

(43)
Complex Obligation (AND)

----------------------------------------

(44)
Obligation:
Formula:
n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if1'(ge(0, 0), n', n', cons(s(x_1), cons(x_1', x_2)))=true

There are no hypotheses.




----------------------------------------

(45) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(46)
YES

----------------------------------------

(47)
Obligation:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0],x_1':sort[a0],x_2:sort[a5].if1'(ge(s(n''), s(n'')), n', n', cons(s(x_1), cons(x_1', x_2)))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_1':sort[a0],!x_2:sort[a5].if1'(ge(n'', n''), n', n', cons(s(x_1), cons(x_1', x_2)))=true




----------------------------------------

(48) Symbolic evaluation under hypothesis (EQUIVALENT)
Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses:

n'':sort[a0],!n':sort[a0],!x_1:sort[a0],!x_1':sort[a0],!x_2:sort[a5].if1'(ge(n'', n''), n', n', cons(s(x_1), cons(x_1', x_2)))=true

----------------------------------------

(49)
YES

----------------------------------------

(50)
Obligation:
Formula:
n:sort[a0],x_1:sort[a0].if1'(ge(n, n), s(n), s(n), cons(s(x_1), nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(51) Inverse Substitution (SOUND)
The formula could be generalised by inverse substitution to:
n:sort[a0],n':sort[a0],x_1:sort[a0].if1'(ge(n, n), n', n', cons(s(x_1), nil))=true

Inverse substitution used:
[s(n)/n']


----------------------------------------

(52)
Obligation:
Formula:
n:sort[a0],n':sort[a0],x_1:sort[a0].if1'(ge(n, n), n', n', cons(s(x_1), nil))=true

Hypotheses:
n:sort[a0],!x1:sort[a0],!x2:sort[a5].if1'(ge(n, n), n, n, cons(x1, x2))=true




----------------------------------------

(53) Induction by data structure (SOUND)
Induction by data structure sort[a0] generates the following cases:



1. Base Case:
Formula:
n':sort[a0],x_1:sort[a0].if1'(ge(0, 0), n', n', cons(s(x_1), nil))=true

There are no hypotheses.





1. Step Case:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0].if1'(ge(s(n''), s(n'')), n', n', cons(s(x_1), nil))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0].if1'(ge(n'', n''), n', n', cons(s(x_1), nil))=true






----------------------------------------

(54)
Complex Obligation (AND)

----------------------------------------

(55)
Obligation:
Formula:
n':sort[a0],x_1:sort[a0].if1'(ge(0, 0), n', n', cons(s(x_1), nil))=true

There are no hypotheses.




----------------------------------------

(56) Symbolic evaluation (EQUIVALENT)
Could be reduced to the following new obligation by simple symbolic evaluation:
True
----------------------------------------

(57)
YES

----------------------------------------

(58)
Obligation:
Formula:
n'':sort[a0],n':sort[a0],x_1:sort[a0].if1'(ge(s(n''), s(n'')), n', n', cons(s(x_1), nil))=true

Hypotheses:
n'':sort[a0],!n':sort[a0],!x_1:sort[a0].if1'(ge(n'', n''), n', n', cons(s(x_1), nil))=true




----------------------------------------

(59) Symbolic evaluation under hypothesis (EQUIVALENT)
Could be shown using symbolic evaluation under hypothesis, by using the following hypotheses:

n'':sort[a0],!n':sort[a0],!x_1:sort[a0].if1'(ge(n'', n''), n', n', cons(s(x_1), nil))=true

----------------------------------------

(60)
YES

(133) Complex Obligation (AND)

(134) Obligation:

Q DP problem:
P is empty.
The TRS R consists of the following rules:

ge(x, 0) → true
ge(s(x), s(y)) → ge(x, y)
if1(true, n, x, xs) → filterlow(n, xs)
filterlow(n, cons(x, xs)) → if1(ge(n, x), n, x, xs)
if1(false, n, x, xs) → cons(x, filterlow(n, xs))
filterlow(n, nil) → nil
ge(0, s(x)) → false

The set Q consists of the following terms:

filterlow(x0, nil)
filterlow(x0, cons(x1, x2))
if1(true, x0, x1, x2)
if1(false, x0, x1, x2)
ge(x0, 0)
ge(0, s(x0))
ge(s(x0), s(x1))

We have to consider all minimal (P,Q,R)-chains.

(135) PisEmptyProof (EQUIVALENT transformation)

The TRS P is empty. Hence, there is no (P,Q,R) chain.

(136) YES

(137) Obligation:

Q restricted rewrite system:
The TRS R consists of the following rules:

if1'(true_renamed, n, x'', xs) → true
filterlow'(n', cons(x3, xs')) → if1'(ge(n', x3), n', x3, xs')
if1'(false_renamed, n'', x4, xs'') → filterlow'(n'', xs'')
filterlow'(n1, nil) → false
ge(x, 0) → true_renamed
ge(s(x'), s(y)) → ge(x', y)
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
filterlow(n', cons(x3, xs')) → if1(ge(n', x3), n', x3, xs')
if1(false_renamed, n'', x4, xs'') → cons(x4, filterlow(n'', xs''))
filterlow(n1, nil) → nil
ge(0, s(x5)) → false_renamed
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_true(true) → true
isa_true(false) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v13)) → false
equal_sort[a0](s(v14), 0) → false
equal_sort[a0](s(v14), s(v15)) → equal_sort[a0](v14, v15)
equal_sort[a5](cons(v16, v17), cons(v18, v19)) → and(equal_sort[a0](v16, v18), equal_sort[a5](v17, v19))
equal_sort[a5](cons(v16, v17), nil) → false
equal_sort[a5](nil, cons(v20, v21)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a19](true_renamed, true_renamed) → true
equal_sort[a19](true_renamed, false_renamed) → false
equal_sort[a19](false_renamed, true_renamed) → false
equal_sort[a19](false_renamed, false_renamed) → true
equal_sort[a39](witness_sort[a39], witness_sort[a39]) → true

Q is empty.

(138) QTRSRRRProof (EQUIVALENT transformation)

Used ordering:
Combined order from the following AFS and order.
if1'(x1, x2, x3, x4)  =  if1'(x1, x2, x3, x4)
true_renamed  =  true_renamed
true  =  true
filterlow'(x1, x2)  =  filterlow'(x1, x2)
cons(x1, x2)  =  cons(x1, x2)
ge(x1, x2)  =  ge(x1, x2)
false_renamed  =  false_renamed
nil  =  nil
false  =  false
0  =  0
s(x1)  =  s(x1)
if1(x1, x2, x3, x4)  =  if1(x1, x2, x3, x4)
filterlow(x1, x2)  =  filterlow(x1, x2)
equal_bool(x1, x2)  =  equal_bool(x1, x2)
and(x1, x2)  =  and(x1, x2)
or(x1, x2)  =  or(x1, x2)
not(x1)  =  not(x1)
isa_true(x1)  =  x1
isa_false(x1)  =  isa_false(x1)
equal_sort[a0](x1, x2)  =  equal_sort[a0](x1, x2)
equal_sort[a5](x1, x2)  =  equal_sort[a5](x1, x2)
equal_sort[a19](x1, x2)  =  equal_sort[a19](x1, x2)
equal_sort[a39](x1, x2)  =  equal_sort[a39](x1, x2)
witness_sort[a39]  =  witness_sort[a39]

Recursive path order with status [RPO].
Quasi-Precedence:
[truerenamed, 0] > [nil, false, if14, filterlow2, isafalse1] > [if1'4, true, filterlow'2, equalsort[a39]2, witnesssort[a39]] > ge2
[truerenamed, 0] > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > ge2
[truerenamed, 0] > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > and2
[truerenamed, 0] > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > equalsort[a0]2
s1 > ge2
s1 > equalsort[a0]2
or2 > [if1'4, true, filterlow'2, equalsort[a39]2, witnesssort[a39]] > ge2
not1 > [nil, false, if14, filterlow2, isafalse1] > [if1'4, true, filterlow'2, equalsort[a39]2, witnesssort[a39]] > ge2
not1 > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > ge2
not1 > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > and2
not1 > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > equalsort[a0]2
equalsort[a5]2 > [nil, false, if14, filterlow2, isafalse1] > [if1'4, true, filterlow'2, equalsort[a39]2, witnesssort[a39]] > ge2
equalsort[a5]2 > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > ge2
equalsort[a5]2 > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > and2
equalsort[a5]2 > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > equalsort[a0]2
equalsort[a19]2 > [nil, false, if14, filterlow2, isafalse1] > [if1'4, true, filterlow'2, equalsort[a39]2, witnesssort[a39]] > ge2
equalsort[a19]2 > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > ge2
equalsort[a19]2 > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > and2
equalsort[a19]2 > [nil, false, if14, filterlow2, isafalse1] > [cons2, falserenamed] > equalsort[a0]2

Status:
if1'4: [4,2,3,1]
truerenamed: multiset
true: multiset
filterlow'2: [2,1]
cons2: multiset
ge2: multiset
falserenamed: multiset
nil: multiset
false: multiset
0: multiset
s1: multiset
if14: [2,4,3,1]
filterlow2: [1,2]
equalbool2: [1,2]
and2: multiset
or2: multiset
not1: [1]
isafalse1: [1]
equalsort[a0]2: multiset
equalsort[a5]2: multiset
equalsort[a19]2: [1,2]
equalsort[a39]2: [1,2]
witnesssort[a39]: multiset

With this ordering the following rules can be removed by the rule removal processor [LPAR04] because they are oriented strictly:

if1'(true_renamed, n, x'', xs) → true
filterlow'(n', cons(x3, xs')) → if1'(ge(n', x3), n', x3, xs')
if1'(false_renamed, n'', x4, xs'') → filterlow'(n'', xs'')
filterlow'(n1, nil) → false
ge(x, 0) → true_renamed
ge(s(x'), s(y)) → ge(x', y)
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
filterlow(n', cons(x3, xs')) → if1(ge(n', x3), n', x3, xs')
if1(false_renamed, n'', x4, xs'') → cons(x4, filterlow(n'', xs''))
filterlow(n1, nil) → nil
ge(0, s(x5)) → false_renamed
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v13)) → false
equal_sort[a0](s(v14), 0) → false
equal_sort[a0](s(v14), s(v15)) → equal_sort[a0](v14, v15)
equal_sort[a5](cons(v16, v17), cons(v18, v19)) → and(equal_sort[a0](v16, v18), equal_sort[a5](v17, v19))
equal_sort[a5](cons(v16, v17), nil) → false
equal_sort[a5](nil, cons(v20, v21)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a19](true_renamed, true_renamed) → true
equal_sort[a19](true_renamed, false_renamed) → false
equal_sort[a19](false_renamed, true_renamed) → false
equal_sort[a19](false_renamed, false_renamed) → true
equal_sort[a39](witness_sort[a39], witness_sort[a39]) → true


(139) Obligation:

Q restricted rewrite system:
The TRS R consists of the following rules:

isa_true(true) → true
isa_true(false) → false

Q is empty.

(140) QTRSRRRProof (EQUIVALENT transformation)

Used ordering:
Knuth-Bendix order [KBO] with precedence:
isatrue1 > false > true

and weight map:

true=1
false=1
isa_true_1=0

The variable weight is 1With this ordering the following rules can be removed by the rule removal processor [LPAR04] because they are oriented strictly:

isa_true(true) → true
isa_true(false) → false


(141) Obligation:

Q restricted rewrite system:
R is empty.
Q is empty.

(142) RisEmptyProof (EQUIVALENT transformation)

The TRS R is empty. Hence, termination is trivially proven.

(143) YES

(144) Obligation:

Q restricted rewrite system:
The TRS R consists of the following rules:

if1'(true_renamed, n, x'', xs) → true
if1'(false_renamed, n', x3, xs') → filterlow'(n', xs')
filterlow'(n'', nil) → false
filterlow'(n1, cons(x5, xs'')) → if1'(ge(n1, x5), n1, x5, xs'')
ge(x, 0) → true_renamed
ge(s(x'), s(y)) → ge(x', y)
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
if1(false_renamed, n', x3, xs') → cons(x3, filterlow(n', xs'))
filterlow(n'', nil) → nil
ge(0, s(x4)) → false_renamed
half(0) → 0
filterlow(n1, cons(x5, xs'')) → if1(ge(n1, x5), n1, x5, xs'')
half(s(v14)) → 0
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_true(true) → true
isa_true(false) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v15)) → false
equal_sort[a0](s(v16), 0) → false
equal_sort[a0](s(v16), s(v17)) → equal_sort[a0](v16, v17)
equal_sort[a5](cons(v18, v19), cons(v20, v21)) → and(equal_sort[a0](v18, v20), equal_sort[a5](v19, v21))
equal_sort[a5](cons(v18, v19), nil) → false
equal_sort[a5](nil, cons(v22, v23)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a21](true_renamed, true_renamed) → true
equal_sort[a21](true_renamed, false_renamed) → false
equal_sort[a21](false_renamed, true_renamed) → false
equal_sort[a21](false_renamed, false_renamed) → true
equal_sort[a43](witness_sort[a43], witness_sort[a43]) → true

Q is empty.

(145) QTRSRRRProof (EQUIVALENT transformation)

Used ordering:
Combined order from the following AFS and order.
if1'(x1, x2, x3, x4)  =  if1'(x1, x2, x3, x4)
true_renamed  =  true_renamed
true  =  true
false_renamed  =  false_renamed
filterlow'(x1, x2)  =  filterlow'(x1, x2)
nil  =  nil
false  =  false
cons(x1, x2)  =  cons(x1, x2)
ge(x1, x2)  =  ge(x1, x2)
0  =  0
s(x1)  =  x1
if1(x1, x2, x3, x4)  =  if1(x1, x2, x3, x4)
filterlow(x1, x2)  =  filterlow(x1, x2)
half(x1)  =  half(x1)
equal_bool(x1, x2)  =  equal_bool(x1, x2)
and(x1, x2)  =  and(x1, x2)
or(x1, x2)  =  or(x1, x2)
not(x1)  =  not(x1)
isa_true(x1)  =  isa_true(x1)
isa_false(x1)  =  isa_false(x1)
equal_sort[a0](x1, x2)  =  equal_sort[a0](x1, x2)
equal_sort[a5](x1, x2)  =  equal_sort[a5](x1, x2)
equal_sort[a21](x1, x2)  =  equal_sort[a21](x1, x2)
equal_sort[a43](x1, x2)  =  equal_sort[a43](x1, x2)
witness_sort[a43]  =  witness_sort[a43]

Recursive path order with status [RPO].
Quasi-Precedence:
[if14, filterlow2] > nil > [true, not1, equalsort[a5]2] > and2 > [false, isatrue1]
[if14, filterlow2] > nil > [true, not1, equalsort[a5]2] > equalsort[a0]2 > [false, isatrue1]
[if14, filterlow2] > cons2 > [if1'4, filterlow'2] > ge2 > [falserenamed, 0] > truerenamed > [false, isatrue1]
[if14, filterlow2] > cons2 > [if1'4, filterlow'2] > ge2 > [falserenamed, 0] > [true, not1, equalsort[a5]2] > and2 > [false, isatrue1]
[if14, filterlow2] > cons2 > [if1'4, filterlow'2] > ge2 > [falserenamed, 0] > [true, not1, equalsort[a5]2] > equalsort[a0]2 > [false, isatrue1]
half1 > [falserenamed, 0] > truerenamed > [false, isatrue1]
half1 > [falserenamed, 0] > [true, not1, equalsort[a5]2] > and2 > [false, isatrue1]
half1 > [falserenamed, 0] > [true, not1, equalsort[a5]2] > equalsort[a0]2 > [false, isatrue1]
equalbool2 > [true, not1, equalsort[a5]2] > and2 > [false, isatrue1]
equalbool2 > [true, not1, equalsort[a5]2] > equalsort[a0]2 > [false, isatrue1]
or2 > [true, not1, equalsort[a5]2] > and2 > [false, isatrue1]
or2 > [true, not1, equalsort[a5]2] > equalsort[a0]2 > [false, isatrue1]
isafalse1 > [true, not1, equalsort[a5]2] > and2 > [false, isatrue1]
isafalse1 > [true, not1, equalsort[a5]2] > equalsort[a0]2 > [false, isatrue1]
equalsort[a21]2 > [true, not1, equalsort[a5]2] > and2 > [false, isatrue1]
equalsort[a21]2 > [true, not1, equalsort[a5]2] > equalsort[a0]2 > [false, isatrue1]
equalsort[a43]2 > [false, isatrue1]
witnesssort[a43] > [true, not1, equalsort[a5]2] > and2 > [false, isatrue1]
witnesssort[a43] > [true, not1, equalsort[a5]2] > equalsort[a0]2 > [false, isatrue1]

Status:
if1'4: [2,4,1,3]
truerenamed: multiset
true: multiset
falserenamed: multiset
filterlow'2: [1,2]
nil: multiset
false: multiset
cons2: multiset
ge2: multiset
0: multiset
if14: [4,2,1,3]
filterlow2: [2,1]
half1: multiset
equalbool2: [1,2]
and2: multiset
or2: multiset
not1: multiset
isatrue1: [1]
isafalse1: [1]
equalsort[a0]2: multiset
equalsort[a5]2: [1,2]
equalsort[a21]2: [1,2]
equalsort[a43]2: [1,2]
witnesssort[a43]: multiset

With this ordering the following rules can be removed by the rule removal processor [LPAR04] because they are oriented strictly:

if1'(true_renamed, n, x'', xs) → true
if1'(false_renamed, n', x3, xs') → filterlow'(n', xs')
filterlow'(n'', nil) → false
filterlow'(n1, cons(x5, xs'')) → if1'(ge(n1, x5), n1, x5, xs'')
ge(x, 0) → true_renamed
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
if1(false_renamed, n', x3, xs') → cons(x3, filterlow(n', xs'))
filterlow(n'', nil) → nil
ge(0, s(x4)) → false_renamed
half(0) → 0
filterlow(n1, cons(x5, xs'')) → if1(ge(n1, x5), n1, x5, xs'')
half(s(v14)) → 0
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_true(true) → true
isa_true(false) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v15)) → false
equal_sort[a0](s(v16), 0) → false
equal_sort[a5](cons(v18, v19), cons(v20, v21)) → and(equal_sort[a0](v18, v20), equal_sort[a5](v19, v21))
equal_sort[a5](cons(v18, v19), nil) → false
equal_sort[a5](nil, cons(v22, v23)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a21](true_renamed, true_renamed) → true
equal_sort[a21](true_renamed, false_renamed) → false
equal_sort[a21](false_renamed, true_renamed) → false
equal_sort[a21](false_renamed, false_renamed) → true
equal_sort[a43](witness_sort[a43], witness_sort[a43]) → true


(146) Obligation:

Q restricted rewrite system:
The TRS R consists of the following rules:

ge(s(x'), s(y)) → ge(x', y)
equal_sort[a0](s(v16), s(v17)) → equal_sort[a0](v16, v17)

Q is empty.

(147) QTRSRRRProof (EQUIVALENT transformation)

Used ordering:
Knuth-Bendix order [KBO] with precedence:
s1 > equalsort[a0]2 > ge2

and weight map:

s_1=0
ge_2=0
equal_sort[a0]_2=0

The variable weight is 1With this ordering the following rules can be removed by the rule removal processor [LPAR04] because they are oriented strictly:

ge(s(x'), s(y)) → ge(x', y)
equal_sort[a0](s(v16), s(v17)) → equal_sort[a0](v16, v17)


(148) Obligation:

Q restricted rewrite system:
R is empty.
Q is empty.

(149) RisEmptyProof (EQUIVALENT transformation)

The TRS R is empty. Hence, termination is trivially proven.

(150) YES

(151) Obligation:

Q restricted rewrite system:
The TRS R consists of the following rules:

if2'(true_renamed, n2, x6, xs1) → true
filterhigh'(n3, cons(x7, xs2)) → if2'(ge(x7, n3), n3, x7, xs2)
if2'(false_renamed, n4, x8, xs3) → filterhigh'(n4, xs3)
filterhigh'(n5, nil) → false
ge(x, 0) → true_renamed
ge(s(x'), s(y)) → ge(x', y)
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
filterlow(n', cons(x3, xs')) → if1(ge(n', x3), n', x3, xs')
if1(false_renamed, n'', x4, xs'') → cons(x4, filterlow(n'', xs''))
filterlow(n1, nil) → nil
ge(0, s(x5)) → false_renamed
half(0) → 0
if2(true_renamed, n2, x6, xs1) → filterhigh(n2, xs1)
filterhigh(n3, cons(x7, xs2)) → if2(ge(x7, n3), n3, x7, xs2)
if2(false_renamed, n4, x8, xs3) → cons(x8, filterhigh(n4, xs3))
filterhigh(n5, nil) → nil
half(s(v14)) → 0
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_true(true) → true
isa_true(false) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v23)) → false
equal_sort[a0](s(v24), 0) → false
equal_sort[a0](s(v24), s(v25)) → equal_sort[a0](v24, v25)
equal_sort[a5](cons(v26, v27), cons(v28, v29)) → and(equal_sort[a0](v26, v28), equal_sort[a5](v27, v29))
equal_sort[a5](cons(v26, v27), nil) → false
equal_sort[a5](nil, cons(v30, v31)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a34](true_renamed, true_renamed) → true
equal_sort[a34](true_renamed, false_renamed) → false
equal_sort[a34](false_renamed, true_renamed) → false
equal_sort[a34](false_renamed, false_renamed) → true
equal_sort[a64](witness_sort[a64], witness_sort[a64]) → true

Q is empty.

(152) QTRSRRRProof (EQUIVALENT transformation)

Used ordering:
Combined order from the following AFS and order.
if2'(x1, x2, x3, x4)  =  if2'(x1, x2, x3, x4)
true_renamed  =  true_renamed
true  =  true
filterhigh'(x1, x2)  =  filterhigh'(x1, x2)
cons(x1, x2)  =  cons(x1, x2)
ge(x1, x2)  =  ge(x1, x2)
false_renamed  =  false_renamed
nil  =  nil
false  =  false
0  =  0
s(x1)  =  x1
if1(x1, x2, x3, x4)  =  if1(x1, x2, x3, x4)
filterlow(x1, x2)  =  filterlow(x1, x2)
half(x1)  =  half(x1)
if2(x1, x2, x3, x4)  =  if2(x1, x2, x3, x4)
filterhigh(x1, x2)  =  filterhigh(x1, x2)
equal_bool(x1, x2)  =  equal_bool(x1, x2)
and(x1, x2)  =  and(x1, x2)
or(x1, x2)  =  or(x1, x2)
not(x1)  =  not(x1)
isa_true(x1)  =  x1
isa_false(x1)  =  isa_false(x1)
equal_sort[a0](x1, x2)  =  equal_sort[a0](x1, x2)
equal_sort[a5](x1, x2)  =  equal_sort[a5](x1, x2)
equal_sort[a34](x1, x2)  =  equal_sort[a34](x1, x2)
equal_sort[a64](x1, x2)  =  equal_sort[a64](x1, x2)
witness_sort[a64]  =  witness_sort[a64]

Recursive path order with status [RPO].
Quasi-Precedence:
nil > [if2'4, true, filterhigh'2, equalsort[a64]2] > [truerenamed, falserenamed, false] > [if24, filterhigh2] > ge2 > cons2
[if14, filterlow2] > ge2 > cons2
half1 > 0 > [truerenamed, falserenamed, false] > [if24, filterhigh2] > ge2 > cons2
equalbool2 > [if2'4, true, filterhigh'2, equalsort[a64]2] > [truerenamed, falserenamed, false] > [if24, filterhigh2] > ge2 > cons2
or2 > cons2
not1 > [if2'4, true, filterhigh'2, equalsort[a64]2] > [truerenamed, falserenamed, false] > [if24, filterhigh2] > ge2 > cons2
isafalse1 > [if2'4, true, filterhigh'2, equalsort[a64]2] > [truerenamed, falserenamed, false] > [if24, filterhigh2] > ge2 > cons2
equalsort[a5]2 > and2 > [truerenamed, falserenamed, false] > [if24, filterhigh2] > ge2 > cons2
equalsort[a5]2 > equalsort[a0]2 > [if2'4, true, filterhigh'2, equalsort[a64]2] > [truerenamed, falserenamed, false] > [if24, filterhigh2] > ge2 > cons2
equalsort[a34]2 > [if2'4, true, filterhigh'2, equalsort[a64]2] > [truerenamed, falserenamed, false] > [if24, filterhigh2] > ge2 > cons2
witnesssort[a64] > cons2

Status:
if2'4: [2,4,3,1]
truerenamed: multiset
true: multiset
filterhigh'2: [1,2]
cons2: [1,2]
ge2: [1,2]
falserenamed: multiset
nil: multiset
false: multiset
0: multiset
if14: [4,2,3,1]
filterlow2: [2,1]
half1: multiset
if24: [2,4,3,1]
filterhigh2: [1,2]
equalbool2: multiset
and2: multiset
or2: multiset
not1: multiset
isafalse1: multiset
equalsort[a0]2: [1,2]
equalsort[a5]2: multiset
equalsort[a34]2: multiset
equalsort[a64]2: [1,2]
witnesssort[a64]: multiset

With this ordering the following rules can be removed by the rule removal processor [LPAR04] because they are oriented strictly:

if2'(true_renamed, n2, x6, xs1) → true
filterhigh'(n3, cons(x7, xs2)) → if2'(ge(x7, n3), n3, x7, xs2)
if2'(false_renamed, n4, x8, xs3) → filterhigh'(n4, xs3)
filterhigh'(n5, nil) → false
ge(x, 0) → true_renamed
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
filterlow(n', cons(x3, xs')) → if1(ge(n', x3), n', x3, xs')
if1(false_renamed, n'', x4, xs'') → cons(x4, filterlow(n'', xs''))
filterlow(n1, nil) → nil
ge(0, s(x5)) → false_renamed
half(0) → 0
if2(true_renamed, n2, x6, xs1) → filterhigh(n2, xs1)
filterhigh(n3, cons(x7, xs2)) → if2(ge(x7, n3), n3, x7, xs2)
if2(false_renamed, n4, x8, xs3) → cons(x8, filterhigh(n4, xs3))
filterhigh(n5, nil) → nil
half(s(v14)) → 0
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v23)) → false
equal_sort[a0](s(v24), 0) → false
equal_sort[a5](cons(v26, v27), cons(v28, v29)) → and(equal_sort[a0](v26, v28), equal_sort[a5](v27, v29))
equal_sort[a5](cons(v26, v27), nil) → false
equal_sort[a5](nil, cons(v30, v31)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a34](true_renamed, true_renamed) → true
equal_sort[a34](true_renamed, false_renamed) → false
equal_sort[a34](false_renamed, true_renamed) → false
equal_sort[a34](false_renamed, false_renamed) → true
equal_sort[a64](witness_sort[a64], witness_sort[a64]) → true


(153) Obligation:

Q restricted rewrite system:
The TRS R consists of the following rules:

ge(s(x'), s(y)) → ge(x', y)
isa_true(true) → true
isa_true(false) → false
equal_sort[a0](s(v24), s(v25)) → equal_sort[a0](v24, v25)

Q is empty.

(154) QTRSRRRProof (EQUIVALENT transformation)

Used ordering:
Knuth-Bendix order [KBO] with precedence:
s1 > equalsort[a0]2 > false > true > isatrue1 > ge2

and weight map:

true=1
false=1
s_1=0
isa_true_1=1
ge_2=0
equal_sort[a0]_2=0

The variable weight is 1With this ordering the following rules can be removed by the rule removal processor [LPAR04] because they are oriented strictly:

ge(s(x'), s(y)) → ge(x', y)
isa_true(true) → true
isa_true(false) → false
equal_sort[a0](s(v24), s(v25)) → equal_sort[a0](v24, v25)


(155) Obligation:

Q restricted rewrite system:
R is empty.
Q is empty.

(156) RisEmptyProof (EQUIVALENT transformation)

The TRS R is empty. Hence, termination is trivially proven.

(157) YES

(158) Obligation:

Q restricted rewrite system:
The TRS R consists of the following rules:

if2'(true_renamed, n2, x6, xs1) → true
filterhigh'(n3, cons(x7, xs2)) → if2'(ge(x7, n3), n3, x7, xs2)
if2'(false_renamed, n4, x8, xs3) → filterhigh'(n4, xs3)
filterhigh'(n5, nil) → false
ge(x, 0) → true_renamed
ge(s(x'), s(y)) → ge(x', y)
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
filterlow(n', cons(x3, xs')) → if1(ge(n', x3), n', x3, xs')
if1(false_renamed, n'', x4, xs'') → cons(x4, filterlow(n'', xs''))
filterlow(n1, nil) → nil
ge(0, s(x5)) → false_renamed
half(0) → 0
if2(true_renamed, n2, x6, xs1) → filterhigh(n2, xs1)
filterhigh(n3, cons(x7, xs2)) → if2(ge(x7, n3), n3, x7, xs2)
if2(false_renamed, n4, x8, xs3) → cons(x8, filterhigh(n4, xs3))
filterhigh(n5, nil) → nil
half(s(v14)) → 0
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_true(true) → true
isa_true(false) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v23)) → false
equal_sort[a0](s(v24), 0) → false
equal_sort[a0](s(v24), s(v25)) → equal_sort[a0](v24, v25)
equal_sort[a5](cons(v26, v27), cons(v28, v29)) → and(equal_sort[a0](v26, v28), equal_sort[a5](v27, v29))
equal_sort[a5](cons(v26, v27), nil) → false
equal_sort[a5](nil, cons(v30, v31)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a36](true_renamed, true_renamed) → true
equal_sort[a36](true_renamed, false_renamed) → false
equal_sort[a36](false_renamed, true_renamed) → false
equal_sort[a36](false_renamed, false_renamed) → true
equal_sort[a66](witness_sort[a66], witness_sort[a66]) → true

Q is empty.

(159) QTRSRRRProof (EQUIVALENT transformation)

Used ordering:
Combined order from the following AFS and order.
if2'(x1, x2, x3, x4)  =  if2'(x1, x2, x3, x4)
true_renamed  =  true_renamed
true  =  true
filterhigh'(x1, x2)  =  filterhigh'(x1, x2)
cons(x1, x2)  =  cons(x1, x2)
ge(x1, x2)  =  ge(x1, x2)
false_renamed  =  false_renamed
nil  =  nil
false  =  false
0  =  0
s(x1)  =  s(x1)
if1(x1, x2, x3, x4)  =  if1(x1, x2, x3, x4)
filterlow(x1, x2)  =  filterlow(x1, x2)
half(x1)  =  x1
if2(x1, x2, x3, x4)  =  if2(x1, x2, x3, x4)
filterhigh(x1, x2)  =  filterhigh(x1, x2)
equal_bool(x1, x2)  =  equal_bool(x1, x2)
and(x1, x2)  =  and(x1, x2)
or(x1, x2)  =  or(x1, x2)
not(x1)  =  not(x1)
isa_true(x1)  =  x1
isa_false(x1)  =  isa_false(x1)
equal_sort[a0](x1, x2)  =  equal_sort[a0](x1, x2)
equal_sort[a5](x1, x2)  =  equal_sort[a5](x1, x2)
equal_sort[a36](x1, x2)  =  equal_sort[a36](x1, x2)
equal_sort[a66](x1, x2)  =  equal_sort[a66](x1, x2)
witness_sort[a66]  =  witness_sort[a66]

Recursive path order with status [RPO].
Quasi-Precedence:
[if2'4, filterhigh'2] > [false, not1] > true > [cons2, ge2, equalsort[a0]2]
s1 > [false, not1] > true > [cons2, ge2, equalsort[a0]2]
s1 > 0 > truerenamed > [falserenamed, if14, filterlow2] > [cons2, ge2, equalsort[a0]2]
s1 > 0 > true > [cons2, ge2, equalsort[a0]2]
[if24, filterhigh2] > nil > [cons2, ge2, equalsort[a0]2]
equalbool2 > true > [cons2, ge2, equalsort[a0]2]
or2 > true > [cons2, ge2, equalsort[a0]2]
isafalse1 > [false, not1] > true > [cons2, ge2, equalsort[a0]2]
equalsort[a5]2 > [false, not1] > true > [cons2, ge2, equalsort[a0]2]
equalsort[a5]2 > and2 > [cons2, ge2, equalsort[a0]2]
equalsort[a36]2 > [false, not1] > true > [cons2, ge2, equalsort[a0]2]
equalsort[a66]2 > true > [cons2, ge2, equalsort[a0]2]
witnesssort[a66] > [cons2, ge2, equalsort[a0]2]

Status:
if2'4: [2,4,1,3]
truerenamed: multiset
true: multiset
filterhigh'2: [1,2]
cons2: multiset
ge2: multiset
falserenamed: multiset
nil: multiset
false: multiset
0: multiset
s1: multiset
if14: [2,4,3,1]
filterlow2: [1,2]
if24: [4,2,3,1]
filterhigh2: [2,1]
equalbool2: multiset
and2: multiset
or2: multiset
not1: multiset
isafalse1: multiset
equalsort[a0]2: multiset
equalsort[a5]2: multiset
equalsort[a36]2: [1,2]
equalsort[a66]2: multiset
witnesssort[a66]: multiset

With this ordering the following rules can be removed by the rule removal processor [LPAR04] because they are oriented strictly:

if2'(true_renamed, n2, x6, xs1) → true
filterhigh'(n3, cons(x7, xs2)) → if2'(ge(x7, n3), n3, x7, xs2)
if2'(false_renamed, n4, x8, xs3) → filterhigh'(n4, xs3)
filterhigh'(n5, nil) → false
ge(x, 0) → true_renamed
ge(s(x'), s(y)) → ge(x', y)
if1(true_renamed, n, x'', xs) → filterlow(n, xs)
filterlow(n', cons(x3, xs')) → if1(ge(n', x3), n', x3, xs')
if1(false_renamed, n'', x4, xs'') → cons(x4, filterlow(n'', xs''))
filterlow(n1, nil) → nil
ge(0, s(x5)) → false_renamed
if2(true_renamed, n2, x6, xs1) → filterhigh(n2, xs1)
filterhigh(n3, cons(x7, xs2)) → if2(ge(x7, n3), n3, x7, xs2)
if2(false_renamed, n4, x8, xs3) → cons(x8, filterhigh(n4, xs3))
filterhigh(n5, nil) → nil
half(s(v14)) → 0
equal_bool(true, false) → false
equal_bool(false, true) → false
equal_bool(true, true) → true
equal_bool(false, false) → true
and(true, x) → x
and(false, x) → false
or(true, x) → true
or(false, x) → x
not(false) → true
not(true) → false
isa_false(true) → false
isa_false(false) → true
equal_sort[a0](0, 0) → true
equal_sort[a0](0, s(v23)) → false
equal_sort[a0](s(v24), 0) → false
equal_sort[a0](s(v24), s(v25)) → equal_sort[a0](v24, v25)
equal_sort[a5](cons(v26, v27), cons(v28, v29)) → and(equal_sort[a0](v26, v28), equal_sort[a5](v27, v29))
equal_sort[a5](cons(v26, v27), nil) → false
equal_sort[a5](nil, cons(v30, v31)) → false
equal_sort[a5](nil, nil) → true
equal_sort[a36](true_renamed, true_renamed) → true
equal_sort[a36](true_renamed, false_renamed) → false
equal_sort[a36](false_renamed, true_renamed) → false
equal_sort[a36](false_renamed, false_renamed) → true
equal_sort[a66](witness_sort[a66], witness_sort[a66]) → true


(160) Obligation:

Q restricted rewrite system:
The TRS R consists of the following rules:

half(0) → 0
isa_true(true) → true
isa_true(false) → false

Q is empty.

(161) QTRSRRRProof (EQUIVALENT transformation)

Used ordering:
Knuth-Bendix order [KBO] with precedence:
isatrue1 > false > true > 0 > half1

and weight map:

0=1
true=1
false=1
half_1=1
isa_true_1=0

The variable weight is 1With this ordering the following rules can be removed by the rule removal processor [LPAR04] because they are oriented strictly:

half(0) → 0
isa_true(true) → true
isa_true(false) → false


(162) Obligation:

Q restricted rewrite system:
R is empty.
Q is empty.

(163) RisEmptyProof (EQUIVALENT transformation)

The TRS R is empty. Hence, termination is trivially proven.

(164) YES