YES
The TRS could be proven terminating. The proof took 861 ms.
The following DP Processors were used
Problem 1 was processed with processor DependencyGraph (16ms).
| Problem 2 was processed with processor SubtermCriterion (1ms).
| Problem 3 was processed with processor PolynomialLinearRange4iUR (771ms).
Problem 1: DependencyGraph
Dependency Pair Problem
Dependency Pairs
rev#(++(x, y)) | → | rev1#(x, y) | | rev2#(x, ++(y, z)) | → | rev2#(y, z) |
rev#(++(x, y)) | → | rev2#(x, y) | | rev2#(x, ++(y, z)) | → | rev#(++(x, rev(rev2(y, z)))) |
rev1#(x, ++(y, z)) | → | rev1#(y, z) | | rev2#(x, ++(y, z)) | → | rev#(rev2(y, z)) |
Rewrite Rules
rev(nil) | → | nil | | rev(++(x, y)) | → | ++(rev1(x, y), rev2(x, y)) |
rev1(x, nil) | → | x | | rev1(x, ++(y, z)) | → | rev1(y, z) |
rev2(x, nil) | → | nil | | rev2(x, ++(y, z)) | → | rev(++(x, rev(rev2(y, z)))) |
Original Signature
Termination of terms over the following signature is verified: rev, rev1, rev2, ++, nil
Strategy
The following SCCs where found
rev2#(x, ++(y, z)) → rev2#(y, z) | rev#(++(x, y)) → rev2#(x, y) |
rev2#(x, ++(y, z)) → rev#(++(x, rev(rev2(y, z)))) | rev2#(x, ++(y, z)) → rev#(rev2(y, z)) |
rev1#(x, ++(y, z)) → rev1#(y, z) |
Problem 2: SubtermCriterion
Dependency Pair Problem
Dependency Pairs
rev1#(x, ++(y, z)) | → | rev1#(y, z) |
Rewrite Rules
rev(nil) | → | nil | | rev(++(x, y)) | → | ++(rev1(x, y), rev2(x, y)) |
rev1(x, nil) | → | x | | rev1(x, ++(y, z)) | → | rev1(y, z) |
rev2(x, nil) | → | nil | | rev2(x, ++(y, z)) | → | rev(++(x, rev(rev2(y, z)))) |
Original Signature
Termination of terms over the following signature is verified: rev, rev1, rev2, ++, nil
Strategy
Projection
The following projection was used:
Thus, the following dependency pairs are removed:
rev1#(x, ++(y, z)) | → | rev1#(y, z) |
Problem 3: PolynomialLinearRange4iUR
Dependency Pair Problem
Dependency Pairs
rev2#(x, ++(y, z)) | → | rev2#(y, z) | | rev#(++(x, y)) | → | rev2#(x, y) |
rev2#(x, ++(y, z)) | → | rev#(++(x, rev(rev2(y, z)))) | | rev2#(x, ++(y, z)) | → | rev#(rev2(y, z)) |
Rewrite Rules
rev(nil) | → | nil | | rev(++(x, y)) | → | ++(rev1(x, y), rev2(x, y)) |
rev1(x, nil) | → | x | | rev1(x, ++(y, z)) | → | rev1(y, z) |
rev2(x, nil) | → | nil | | rev2(x, ++(y, z)) | → | rev(++(x, rev(rev2(y, z)))) |
Original Signature
Termination of terms over the following signature is verified: rev, rev1, rev2, ++, nil
Strategy
Polynomial Interpretation
- ++(x,y): 2y + 1
- nil: 0
- rev(x): x
- rev#(x): 2x
- rev1(x,y): x
- rev2(x,y): y
- rev2#(x,y): 3y
Improved Usable rules
rev2(x, nil) | → | nil | | rev2(x, ++(y, z)) | → | rev(++(x, rev(rev2(y, z)))) |
rev(nil) | → | nil | | rev(++(x, y)) | → | ++(rev1(x, y), rev2(x, y)) |
The following dependency pairs are strictly oriented by an ordering on the given polynomial interpretation, thus they are removed:
rev2#(x, ++(y, z)) | → | rev2#(y, z) | | rev#(++(x, y)) | → | rev2#(x, y) |
rev2#(x, ++(y, z)) | → | rev#(++(x, rev(rev2(y, z)))) | | rev2#(x, ++(y, z)) | → | rev#(rev2(y, z)) |