YES
The TRS could be proven terminating. The proof took 740 ms.
The following DP Processors were used
Problem 1 was processed with processor DependencyGraph (187ms).
| Problem 2 was processed with processor PolynomialLinearRange4iUR (352ms).
| | Problem 4 was processed with processor DependencyGraph (2ms).
| Problem 3 was processed with processor SubtermCriterion (1ms).
Problem 1: DependencyGraph
Dependency Pair Problem
Dependency Pairs
and#(tt, X) | → | activate#(X) | | splitAt#(s(N), cons(X, XS)) | → | activate#(XS) |
activate#(n__natsFrom(X)) | → | activate#(X) | | activate#(n__natsFrom(X)) | → | natsFrom#(activate(X)) |
afterNth#(N, XS) | → | snd#(splitAt(N, XS)) | | activate#(n__s(X)) | → | activate#(X) |
tail#(cons(N, XS)) | → | activate#(XS) | | U11#(tt, N, X, XS) | → | U12#(splitAt(activate(N), activate(XS)), activate(X)) |
sel#(N, XS) | → | afterNth#(N, XS) | | U11#(tt, N, X, XS) | → | activate#(N) |
take#(N, XS) | → | splitAt#(N, XS) | | sel#(N, XS) | → | head#(afterNth(N, XS)) |
take#(N, XS) | → | fst#(splitAt(N, XS)) | | afterNth#(N, XS) | → | splitAt#(N, XS) |
U12#(pair(YS, ZS), X) | → | activate#(X) | | U11#(tt, N, X, XS) | → | activate#(X) |
splitAt#(s(N), cons(X, XS)) | → | U11#(tt, N, X, activate(XS)) | | U11#(tt, N, X, XS) | → | splitAt#(activate(N), activate(XS)) |
U11#(tt, N, X, XS) | → | activate#(XS) | | activate#(n__s(X)) | → | s#(activate(X)) |
Rewrite Rules
U11(tt, N, X, XS) | → | U12(splitAt(activate(N), activate(XS)), activate(X)) | | U12(pair(YS, ZS), X) | → | pair(cons(activate(X), YS), ZS) |
afterNth(N, XS) | → | snd(splitAt(N, XS)) | | and(tt, X) | → | activate(X) |
fst(pair(X, Y)) | → | X | | head(cons(N, XS)) | → | N |
natsFrom(N) | → | cons(N, n__natsFrom(n__s(N))) | | sel(N, XS) | → | head(afterNth(N, XS)) |
snd(pair(X, Y)) | → | Y | | splitAt(0, XS) | → | pair(nil, XS) |
splitAt(s(N), cons(X, XS)) | → | U11(tt, N, X, activate(XS)) | | tail(cons(N, XS)) | → | activate(XS) |
take(N, XS) | → | fst(splitAt(N, XS)) | | natsFrom(X) | → | n__natsFrom(X) |
s(X) | → | n__s(X) | | activate(n__natsFrom(X)) | → | natsFrom(activate(X)) |
activate(n__s(X)) | → | s(activate(X)) | | activate(X) | → | X |
Original Signature
Termination of terms over the following signature is verified: pair, natsFrom, tail, n__natsFrom, splitAt, and, activate, fst, n__s, 0, s, tt, take, U11, U12, afterNth, head, sel, snd, cons, nil
Strategy
The following SCCs where found
splitAt#(s(N), cons(X, XS)) → U11#(tt, N, X, activate(XS)) | U11#(tt, N, X, XS) → splitAt#(activate(N), activate(XS)) |
activate#(n__natsFrom(X)) → activate#(X) | activate#(n__s(X)) → activate#(X) |
Problem 2: PolynomialLinearRange4iUR
Dependency Pair Problem
Dependency Pairs
splitAt#(s(N), cons(X, XS)) | → | U11#(tt, N, X, activate(XS)) | | U11#(tt, N, X, XS) | → | splitAt#(activate(N), activate(XS)) |
Rewrite Rules
U11(tt, N, X, XS) | → | U12(splitAt(activate(N), activate(XS)), activate(X)) | | U12(pair(YS, ZS), X) | → | pair(cons(activate(X), YS), ZS) |
afterNth(N, XS) | → | snd(splitAt(N, XS)) | | and(tt, X) | → | activate(X) |
fst(pair(X, Y)) | → | X | | head(cons(N, XS)) | → | N |
natsFrom(N) | → | cons(N, n__natsFrom(n__s(N))) | | sel(N, XS) | → | head(afterNth(N, XS)) |
snd(pair(X, Y)) | → | Y | | splitAt(0, XS) | → | pair(nil, XS) |
splitAt(s(N), cons(X, XS)) | → | U11(tt, N, X, activate(XS)) | | tail(cons(N, XS)) | → | activate(XS) |
take(N, XS) | → | fst(splitAt(N, XS)) | | natsFrom(X) | → | n__natsFrom(X) |
s(X) | → | n__s(X) | | activate(n__natsFrom(X)) | → | natsFrom(activate(X)) |
activate(n__s(X)) | → | s(activate(X)) | | activate(X) | → | X |
Original Signature
Termination of terms over the following signature is verified: pair, natsFrom, tail, n__natsFrom, splitAt, and, activate, fst, n__s, 0, s, tt, take, U11, U12, afterNth, head, sel, snd, cons, nil
Strategy
Polynomial Interpretation
- 0: 0
- U11(x1,x2,x3,x4): 0
- U11#(x1,x2,x3,x4): 2x2 + 1
- U12(x,y): 0
- activate(x): 2x
- afterNth(x,y): 0
- and(x,y): 0
- cons(x,y): 0
- fst(x): 0
- head(x): 0
- n__natsFrom(x): 1
- n__s(x): 3x + 1
- natsFrom(x): 1
- nil: 0
- pair(x,y): 0
- s(x): 3x + 1
- sel(x,y): 0
- snd(x): 0
- splitAt(x,y): 0
- splitAt#(x,y): x + 1
- tail(x): 0
- take(x,y): 0
- tt: 0
Improved Usable rules
s(X) | → | n__s(X) | | activate(X) | → | X |
activate(n__natsFrom(X)) | → | natsFrom(activate(X)) | | natsFrom(X) | → | n__natsFrom(X) |
activate(n__s(X)) | → | s(activate(X)) | | natsFrom(N) | → | cons(N, n__natsFrom(n__s(N))) |
The following dependency pairs are strictly oriented by an ordering on the given polynomial interpretation, thus they are removed:
splitAt#(s(N), cons(X, XS)) | → | U11#(tt, N, X, activate(XS)) |
Problem 4: DependencyGraph
Dependency Pair Problem
Dependency Pairs
U11#(tt, N, X, XS) | → | splitAt#(activate(N), activate(XS)) |
Rewrite Rules
U11(tt, N, X, XS) | → | U12(splitAt(activate(N), activate(XS)), activate(X)) | | U12(pair(YS, ZS), X) | → | pair(cons(activate(X), YS), ZS) |
afterNth(N, XS) | → | snd(splitAt(N, XS)) | | and(tt, X) | → | activate(X) |
fst(pair(X, Y)) | → | X | | head(cons(N, XS)) | → | N |
natsFrom(N) | → | cons(N, n__natsFrom(n__s(N))) | | sel(N, XS) | → | head(afterNth(N, XS)) |
snd(pair(X, Y)) | → | Y | | splitAt(0, XS) | → | pair(nil, XS) |
splitAt(s(N), cons(X, XS)) | → | U11(tt, N, X, activate(XS)) | | tail(cons(N, XS)) | → | activate(XS) |
take(N, XS) | → | fst(splitAt(N, XS)) | | natsFrom(X) | → | n__natsFrom(X) |
s(X) | → | n__s(X) | | activate(n__natsFrom(X)) | → | natsFrom(activate(X)) |
activate(n__s(X)) | → | s(activate(X)) | | activate(X) | → | X |
Original Signature
Termination of terms over the following signature is verified: pair, natsFrom, tail, n__natsFrom, splitAt, and, activate, fst, n__s, 0, s, tt, take, U11, U12, afterNth, head, sel, nil, cons, snd
Strategy
There are no SCCs!
Problem 3: SubtermCriterion
Dependency Pair Problem
Dependency Pairs
activate#(n__natsFrom(X)) | → | activate#(X) | | activate#(n__s(X)) | → | activate#(X) |
Rewrite Rules
U11(tt, N, X, XS) | → | U12(splitAt(activate(N), activate(XS)), activate(X)) | | U12(pair(YS, ZS), X) | → | pair(cons(activate(X), YS), ZS) |
afterNth(N, XS) | → | snd(splitAt(N, XS)) | | and(tt, X) | → | activate(X) |
fst(pair(X, Y)) | → | X | | head(cons(N, XS)) | → | N |
natsFrom(N) | → | cons(N, n__natsFrom(n__s(N))) | | sel(N, XS) | → | head(afterNth(N, XS)) |
snd(pair(X, Y)) | → | Y | | splitAt(0, XS) | → | pair(nil, XS) |
splitAt(s(N), cons(X, XS)) | → | U11(tt, N, X, activate(XS)) | | tail(cons(N, XS)) | → | activate(XS) |
take(N, XS) | → | fst(splitAt(N, XS)) | | natsFrom(X) | → | n__natsFrom(X) |
s(X) | → | n__s(X) | | activate(n__natsFrom(X)) | → | natsFrom(activate(X)) |
activate(n__s(X)) | → | s(activate(X)) | | activate(X) | → | X |
Original Signature
Termination of terms over the following signature is verified: pair, natsFrom, tail, n__natsFrom, splitAt, and, activate, fst, n__s, 0, s, tt, take, U11, U12, afterNth, head, sel, snd, cons, nil
Strategy
Projection
The following projection was used:
Thus, the following dependency pairs are removed:
activate#(n__natsFrom(X)) | → | activate#(X) | | activate#(n__s(X)) | → | activate#(X) |