YES
The TRS could be proven terminating. The proof took 2100 ms.
Problem 1 was processed with processor DependencyGraph (232ms). | Problem 2 was processed with processor PolynomialLinearRange4iUR (1676ms). | | Problem 4 was processed with processor PolynomialLinearRange4iUR (20ms). | Problem 3 was processed with processor SubtermCriterion (26ms).
eq#(apply(T, S), apply(Tp, Sp)) | → | eq#(T, Tp) | eq#(lambda(X, T), lambda(Xp, Tp)) | → | and#(eq(T, Tp), eq(X, Xp)) | |
ren#(var(L), var(K), var(Lp)) | → | if#(eq(L, Lp), var(K), var(Lp)) | eq#(var(L), var(Lp)) | → | eq#(L, Lp) | |
eq#(cons(T, L), cons(Tp, Lp)) | → | eq#(T, Tp) | eq#(apply(T, S), apply(Tp, Sp)) | → | and#(eq(T, Tp), eq(S, Sp)) | |
eq#(cons(T, L), cons(Tp, Lp)) | → | and#(eq(T, Tp), eq(L, Lp)) | eq#(lambda(X, T), lambda(Xp, Tp)) | → | eq#(T, Tp) | |
eq#(cons(T, L), cons(Tp, Lp)) | → | eq#(L, Lp) | eq#(lambda(X, T), lambda(Xp, Tp)) | → | eq#(X, Xp) | |
ren#(X, Y, lambda(Z, T)) | → | ren#(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T) | ren#(var(L), var(K), var(Lp)) | → | eq#(L, Lp) | |
ren#(X, Y, apply(T, S)) | → | ren#(X, Y, T) | ren#(X, Y, apply(T, S)) | → | ren#(X, Y, S) | |
eq#(apply(T, S), apply(Tp, Sp)) | → | eq#(S, Sp) | ren#(X, Y, lambda(Z, T)) | → | ren#(X, Y, ren(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T)) |
and(false, false) | → | false | and(true, false) | → | false | |
and(false, true) | → | false | and(true, true) | → | true | |
eq(nil, nil) | → | true | eq(cons(T, L), nil) | → | false | |
eq(nil, cons(T, L)) | → | false | eq(cons(T, L), cons(Tp, Lp)) | → | and(eq(T, Tp), eq(L, Lp)) | |
eq(var(L), var(Lp)) | → | eq(L, Lp) | eq(var(L), apply(T, S)) | → | false | |
eq(var(L), lambda(X, T)) | → | false | eq(apply(T, S), var(L)) | → | false | |
eq(apply(T, S), apply(Tp, Sp)) | → | and(eq(T, Tp), eq(S, Sp)) | eq(apply(T, S), lambda(X, Tp)) | → | false | |
eq(lambda(X, T), var(L)) | → | false | eq(lambda(X, T), apply(Tp, Sp)) | → | false | |
eq(lambda(X, T), lambda(Xp, Tp)) | → | and(eq(T, Tp), eq(X, Xp)) | if(true, var(K), var(L)) | → | var(K) | |
if(false, var(K), var(L)) | → | var(L) | ren(var(L), var(K), var(Lp)) | → | if(eq(L, Lp), var(K), var(Lp)) | |
ren(X, Y, apply(T, S)) | → | apply(ren(X, Y, T), ren(X, Y, S)) | ren(X, Y, lambda(Z, T)) | → | lambda(var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), ren(X, Y, ren(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T))) |
Termination of terms over the following signature is verified: apply, lambda, var, if, false, true, ren, and, eq, nil, cons
eq#(lambda(X, T), lambda(Xp, Tp)) → eq#(T, Tp) | eq#(apply(T, S), apply(Tp, Sp)) → eq#(T, Tp) |
eq#(cons(T, L), cons(Tp, Lp)) → eq#(L, Lp) | eq#(lambda(X, T), lambda(Xp, Tp)) → eq#(X, Xp) |
eq#(var(L), var(Lp)) → eq#(L, Lp) | eq#(cons(T, L), cons(Tp, Lp)) → eq#(T, Tp) |
eq#(apply(T, S), apply(Tp, Sp)) → eq#(S, Sp) |
ren#(X, Y, lambda(Z, T)) → ren#(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T) | ren#(X, Y, apply(T, S)) → ren#(X, Y, T) |
ren#(X, Y, apply(T, S)) → ren#(X, Y, S) | ren#(X, Y, lambda(Z, T)) → ren#(X, Y, ren(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T)) |
ren#(X, Y, lambda(Z, T)) | → | ren#(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T) | ren#(X, Y, apply(T, S)) | → | ren#(X, Y, T) | |
ren#(X, Y, apply(T, S)) | → | ren#(X, Y, S) | ren#(X, Y, lambda(Z, T)) | → | ren#(X, Y, ren(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T)) |
and(false, false) | → | false | and(true, false) | → | false | |
and(false, true) | → | false | and(true, true) | → | true | |
eq(nil, nil) | → | true | eq(cons(T, L), nil) | → | false | |
eq(nil, cons(T, L)) | → | false | eq(cons(T, L), cons(Tp, Lp)) | → | and(eq(T, Tp), eq(L, Lp)) | |
eq(var(L), var(Lp)) | → | eq(L, Lp) | eq(var(L), apply(T, S)) | → | false | |
eq(var(L), lambda(X, T)) | → | false | eq(apply(T, S), var(L)) | → | false | |
eq(apply(T, S), apply(Tp, Sp)) | → | and(eq(T, Tp), eq(S, Sp)) | eq(apply(T, S), lambda(X, Tp)) | → | false | |
eq(lambda(X, T), var(L)) | → | false | eq(lambda(X, T), apply(Tp, Sp)) | → | false | |
eq(lambda(X, T), lambda(Xp, Tp)) | → | and(eq(T, Tp), eq(X, Xp)) | if(true, var(K), var(L)) | → | var(K) | |
if(false, var(K), var(L)) | → | var(L) | ren(var(L), var(K), var(Lp)) | → | if(eq(L, Lp), var(K), var(Lp)) | |
ren(X, Y, apply(T, S)) | → | apply(ren(X, Y, T), ren(X, Y, S)) | ren(X, Y, lambda(Z, T)) | → | lambda(var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), ren(X, Y, ren(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T))) |
Termination of terms over the following signature is verified: apply, lambda, var, if, false, true, ren, and, eq, nil, cons
if(true, var(K), var(L)) | → | var(K) | if(false, var(K), var(L)) | → | var(L) | |
ren(X, Y, apply(T, S)) | → | apply(ren(X, Y, T), ren(X, Y, S)) | ren(X, Y, lambda(Z, T)) | → | lambda(var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), ren(X, Y, ren(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T))) | |
ren(var(L), var(K), var(Lp)) | → | if(eq(L, Lp), var(K), var(Lp)) |
The following dependency pairs are strictly oriented by an ordering on the given polynomial interpretation, thus they are removed:
ren#(X, Y, lambda(Z, T)) | → | ren#(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T) | ren#(X, Y, lambda(Z, T)) | → | ren#(X, Y, ren(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T)) |
ren#(X, Y, apply(T, S)) | → | ren#(X, Y, T) | ren#(X, Y, apply(T, S)) | → | ren#(X, Y, S) |
and(false, false) | → | false | and(true, false) | → | false | |
and(false, true) | → | false | and(true, true) | → | true | |
eq(nil, nil) | → | true | eq(cons(T, L), nil) | → | false | |
eq(nil, cons(T, L)) | → | false | eq(cons(T, L), cons(Tp, Lp)) | → | and(eq(T, Tp), eq(L, Lp)) | |
eq(var(L), var(Lp)) | → | eq(L, Lp) | eq(var(L), apply(T, S)) | → | false | |
eq(var(L), lambda(X, T)) | → | false | eq(apply(T, S), var(L)) | → | false | |
eq(apply(T, S), apply(Tp, Sp)) | → | and(eq(T, Tp), eq(S, Sp)) | eq(apply(T, S), lambda(X, Tp)) | → | false | |
eq(lambda(X, T), var(L)) | → | false | eq(lambda(X, T), apply(Tp, Sp)) | → | false | |
eq(lambda(X, T), lambda(Xp, Tp)) | → | and(eq(T, Tp), eq(X, Xp)) | if(true, var(K), var(L)) | → | var(K) | |
if(false, var(K), var(L)) | → | var(L) | ren(var(L), var(K), var(Lp)) | → | if(eq(L, Lp), var(K), var(Lp)) | |
ren(X, Y, apply(T, S)) | → | apply(ren(X, Y, T), ren(X, Y, S)) | ren(X, Y, lambda(Z, T)) | → | lambda(var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), ren(X, Y, ren(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T))) |
Termination of terms over the following signature is verified: lambda, apply, if, var, ren, true, false, cons, nil, eq, and
There are no usable rules
The following dependency pairs are strictly oriented by an ordering on the given polynomial interpretation, thus they are removed:
ren#(X, Y, apply(T, S)) | → | ren#(X, Y, T) | ren#(X, Y, apply(T, S)) | → | ren#(X, Y, S) |
eq#(lambda(X, T), lambda(Xp, Tp)) | → | eq#(T, Tp) | eq#(apply(T, S), apply(Tp, Sp)) | → | eq#(T, Tp) | |
eq#(cons(T, L), cons(Tp, Lp)) | → | eq#(L, Lp) | eq#(lambda(X, T), lambda(Xp, Tp)) | → | eq#(X, Xp) | |
eq#(var(L), var(Lp)) | → | eq#(L, Lp) | eq#(cons(T, L), cons(Tp, Lp)) | → | eq#(T, Tp) | |
eq#(apply(T, S), apply(Tp, Sp)) | → | eq#(S, Sp) |
and(false, false) | → | false | and(true, false) | → | false | |
and(false, true) | → | false | and(true, true) | → | true | |
eq(nil, nil) | → | true | eq(cons(T, L), nil) | → | false | |
eq(nil, cons(T, L)) | → | false | eq(cons(T, L), cons(Tp, Lp)) | → | and(eq(T, Tp), eq(L, Lp)) | |
eq(var(L), var(Lp)) | → | eq(L, Lp) | eq(var(L), apply(T, S)) | → | false | |
eq(var(L), lambda(X, T)) | → | false | eq(apply(T, S), var(L)) | → | false | |
eq(apply(T, S), apply(Tp, Sp)) | → | and(eq(T, Tp), eq(S, Sp)) | eq(apply(T, S), lambda(X, Tp)) | → | false | |
eq(lambda(X, T), var(L)) | → | false | eq(lambda(X, T), apply(Tp, Sp)) | → | false | |
eq(lambda(X, T), lambda(Xp, Tp)) | → | and(eq(T, Tp), eq(X, Xp)) | if(true, var(K), var(L)) | → | var(K) | |
if(false, var(K), var(L)) | → | var(L) | ren(var(L), var(K), var(Lp)) | → | if(eq(L, Lp), var(K), var(Lp)) | |
ren(X, Y, apply(T, S)) | → | apply(ren(X, Y, T), ren(X, Y, S)) | ren(X, Y, lambda(Z, T)) | → | lambda(var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), ren(X, Y, ren(Z, var(cons(X, cons(Y, cons(lambda(Z, T), nil)))), T))) |
Termination of terms over the following signature is verified: apply, lambda, var, if, false, true, ren, and, eq, nil, cons
The following projection was used:
Thus, the following dependency pairs are removed:
eq#(apply(T, S), apply(Tp, Sp)) | → | eq#(T, Tp) | eq#(lambda(X, T), lambda(Xp, Tp)) | → | eq#(T, Tp) | |
eq#(lambda(X, T), lambda(Xp, Tp)) | → | eq#(X, Xp) | eq#(cons(T, L), cons(Tp, Lp)) | → | eq#(L, Lp) | |
eq#(var(L), var(Lp)) | → | eq#(L, Lp) | eq#(cons(T, L), cons(Tp, Lp)) | → | eq#(T, Tp) | |
eq#(apply(T, S), apply(Tp, Sp)) | → | eq#(S, Sp) |