1.82/1.91 YES 2.22/2.24 We consider the system theBenchmark. 2.22/2.24 2.22/2.24 Alphabet: 2.22/2.24 2.22/2.24 0 : [] --> R 2.22/2.24 1 : [] --> R 2.22/2.24 cos : [] --> R -> R 2.22/2.24 d : [] --> (R -> R) -> R -> R 2.22/2.24 minus : [] --> R -> R 2.22/2.24 mul : [] --> R -> R -> R 2.22/2.24 pls : [] --> R -> R -> R 2.22/2.24 sin : [] --> R -> R 2.22/2.24 2.22/2.24 Rules: 2.22/2.24 2.22/2.24 d (/\x.y) z => 0 2.22/2.24 d (/\x.x) y => 1 2.22/2.24 d (/\x.minus (f x)) y => minus (d (/\z.f z) y) 2.22/2.24 d (/\x.pls (f x) (g x)) y => pls (d (/\z.f z) y) (d (/\u.g u) y) 2.22/2.24 d (/\x.mul (f x) (g x)) y => pls (mul (d (/\z.f z) y) (g y)) (mul (f y) (d (/\u.g u) y)) 2.22/2.24 d (/\x.sin (f x)) y => mul (cos y) (d (/\z.f z) y) 2.22/2.24 d (/\x.cos (f x)) y => mul (minus (sin y)) (d (/\z.f z) y) 2.22/2.24 minus 0 => 0 2.22/2.24 mul 0 x => 0 2.22/2.24 mul x 0 => 0 2.22/2.24 pls 0 x => x 2.22/2.24 2.22/2.24 Using the transformations described in [Kop11], this system can be brought in a form without leading free variables in the left-hand side, and where the left-hand side of a variable is always a functional term or application headed by a functional term. 2.22/2.24 2.22/2.24 We now transform the resulting AFS into an AFSM by replacing all free variables by meta-variables (with arity 0). This leads to the following AFSM: 2.22/2.24 2.22/2.24 Alphabet: 2.22/2.24 2.22/2.24 0 : [] --> R 2.22/2.24 1 : [] --> R 2.22/2.24 cos : [R] --> R 2.22/2.24 d : [R -> R * R] --> R 2.22/2.24 minus : [R] --> R 2.22/2.24 mul : [R * R] --> R 2.22/2.24 pls : [R * R] --> R 2.22/2.24 sin : [R] --> R 2.22/2.24 ~AP1 : [R -> R * R] --> R 2.22/2.24 2.22/2.24 Rules: 2.22/2.24 2.22/2.24 d(/\x.X, Y) => 0 2.22/2.24 d(/\x.x, X) => 1 2.22/2.24 d(/\x.minus(~AP1(F, x)), X) => minus(d(/\y.~AP1(F, y), X)) 2.22/2.24 d(/\x.pls(~AP1(F, x), ~AP1(G, x)), X) => pls(d(/\y.~AP1(F, y), X), d(/\z.~AP1(G, z), X)) 2.22/2.24 d(/\x.mul(~AP1(F, x), ~AP1(G, x)), X) => pls(mul(d(/\y.~AP1(F, y), X), ~AP1(G, X)), mul(~AP1(F, X), d(/\z.~AP1(G, z), X))) 2.22/2.24 d(/\x.sin(~AP1(F, x)), X) => mul(cos(X), d(/\y.~AP1(F, y), X)) 2.22/2.24 d(/\x.cos(~AP1(F, x)), X) => mul(minus(sin(X)), d(/\y.~AP1(F, y), X)) 2.22/2.24 minus(0) => 0 2.22/2.24 mul(0, X) => 0 2.22/2.24 mul(X, 0) => 0 2.22/2.24 pls(0, X) => X 2.22/2.24 d(/\x.minus(cos(x)), X) => minus(d(/\y.cos(y), X)) 2.22/2.24 d(/\x.minus(d(F, x)), X) => minus(d(/\y.d(F, y), X)) 2.22/2.24 d(/\x.minus(minus(x)), X) => minus(d(/\y.minus(y), X)) 2.22/2.24 d(/\x.minus(mul(X, x)), Y) => minus(d(/\y.mul(X, y), Y)) 2.22/2.24 d(/\x.minus(pls(X, x)), Y) => minus(d(/\y.pls(X, y), Y)) 2.22/2.24 d(/\x.minus(sin(x)), X) => minus(d(/\y.sin(y), X)) 2.22/2.24 d(/\x.pls(cos(x), ~AP1(F, x)), X) => pls(d(/\y.cos(y), X), d(/\z.~AP1(F, z), X)) 2.22/2.24 d(/\x.pls(d(F, x), ~AP1(G, x)), X) => pls(d(/\y.d(F, y), X), d(/\z.~AP1(G, z), X)) 2.22/2.24 d(/\x.pls(minus(x), ~AP1(F, x)), X) => pls(d(/\y.minus(y), X), d(/\z.~AP1(F, z), X)) 2.22/2.24 d(/\x.pls(mul(X, x), ~AP1(F, x)), Y) => pls(d(/\y.mul(X, y), Y), d(/\z.~AP1(F, z), Y)) 2.22/2.24 d(/\x.pls(pls(X, x), ~AP1(F, x)), Y) => pls(d(/\y.pls(X, y), Y), d(/\z.~AP1(F, z), Y)) 2.22/2.24 d(/\x.pls(sin(x), ~AP1(F, x)), X) => pls(d(/\y.sin(y), X), d(/\z.~AP1(F, z), X)) 2.22/2.24 d(/\x.pls(~AP1(F, x), cos(x)), X) => pls(d(/\y.~AP1(F, y), X), d(/\z.cos(z), X)) 2.22/2.24 d(/\x.pls(~AP1(F, x), d(G, x)), X) => pls(d(/\y.~AP1(F, y), X), d(/\z.d(G, z), X)) 2.22/2.24 d(/\x.pls(~AP1(F, x), minus(x)), X) => pls(d(/\y.~AP1(F, y), X), d(/\z.minus(z), X)) 2.22/2.24 d(/\x.pls(~AP1(F, x), mul(X, x)), Y) => pls(d(/\y.~AP1(F, y), Y), d(/\z.mul(X, z), Y)) 2.22/2.24 d(/\x.pls(~AP1(F, x), pls(X, x)), Y) => pls(d(/\y.~AP1(F, y), Y), d(/\z.pls(X, z), Y)) 2.22/2.24 d(/\x.pls(~AP1(F, x), sin(x)), X) => pls(d(/\y.~AP1(F, y), X), d(/\z.sin(z), X)) 2.22/2.24 d(/\x.mul(cos(x), ~AP1(F, x)), X) => pls(mul(d(/\y.cos(y), X), ~AP1(F, X)), mul(cos(X), d(/\z.~AP1(F, z), X))) 2.22/2.24 d(/\x.mul(d(F, x), ~AP1(G, x)), X) => pls(mul(d(/\y.d(F, y), X), ~AP1(G, X)), mul(d(F, X), d(/\z.~AP1(G, z), X))) 2.22/2.24 d(/\x.mul(minus(x), ~AP1(F, x)), X) => pls(mul(d(/\y.minus(y), X), ~AP1(F, X)), mul(minus(X), d(/\z.~AP1(F, z), X))) 2.22/2.24 d(/\x.mul(mul(X, x), ~AP1(F, x)), Y) => pls(mul(d(/\y.mul(X, y), Y), ~AP1(F, Y)), mul(mul(X, Y), d(/\z.~AP1(F, z), Y))) 2.22/2.24 d(/\x.mul(pls(X, x), ~AP1(F, x)), Y) => pls(mul(d(/\y.pls(X, y), Y), ~AP1(F, Y)), mul(pls(X, Y), d(/\z.~AP1(F, z), Y))) 2.22/2.24 d(/\x.mul(sin(x), ~AP1(F, x)), X) => pls(mul(d(/\y.sin(y), X), ~AP1(F, X)), mul(sin(X), d(/\z.~AP1(F, z), X))) 2.22/2.24 d(/\x.mul(~AP1(F, x), cos(x)), X) => pls(mul(d(/\y.~AP1(F, y), X), cos(X)), mul(~AP1(F, X), d(/\z.cos(z), X))) 2.22/2.24 d(/\x.mul(~AP1(F, x), d(G, x)), X) => pls(mul(d(/\y.~AP1(F, y), X), d(G, X)), mul(~AP1(F, X), d(/\z.d(G, z), X))) 2.22/2.24 d(/\x.mul(~AP1(F, x), minus(x)), X) => pls(mul(d(/\y.~AP1(F, y), X), minus(X)), mul(~AP1(F, X), d(/\z.minus(z), X))) 2.22/2.24 d(/\x.mul(~AP1(F, x), mul(X, x)), Y) => pls(mul(d(/\y.~AP1(F, y), Y), mul(X, Y)), mul(~AP1(F, Y), d(/\z.mul(X, z), Y))) 2.22/2.24 d(/\x.mul(~AP1(F, x), pls(X, x)), Y) => pls(mul(d(/\y.~AP1(F, y), Y), pls(X, Y)), mul(~AP1(F, Y), d(/\z.pls(X, z), Y))) 2.22/2.24 d(/\x.mul(~AP1(F, x), sin(x)), X) => pls(mul(d(/\y.~AP1(F, y), X), sin(X)), mul(~AP1(F, X), d(/\z.sin(z), X))) 2.22/2.24 d(/\x.sin(cos(x)), X) => mul(cos(X), d(/\y.cos(y), X)) 2.22/2.24 d(/\x.sin(d(F, x)), X) => mul(cos(X), d(/\y.d(F, y), X)) 2.22/2.24 d(/\x.sin(minus(x)), X) => mul(cos(X), d(/\y.minus(y), X)) 2.22/2.24 d(/\x.sin(mul(X, x)), Y) => mul(cos(Y), d(/\y.mul(X, y), Y)) 2.22/2.24 d(/\x.sin(pls(X, x)), Y) => mul(cos(Y), d(/\y.pls(X, y), Y)) 2.22/2.24 d(/\x.sin(sin(x)), X) => mul(cos(X), d(/\y.sin(y), X)) 2.22/2.24 d(/\x.cos(cos(x)), X) => mul(minus(sin(X)), d(/\y.cos(y), X)) 2.22/2.24 d(/\x.cos(d(F, x)), X) => mul(minus(sin(X)), d(/\y.d(F, y), X)) 2.22/2.24 d(/\x.cos(minus(x)), X) => mul(minus(sin(X)), d(/\y.minus(y), X)) 2.22/2.24 d(/\x.cos(mul(X, x)), Y) => mul(minus(sin(Y)), d(/\y.mul(X, y), Y)) 2.22/2.24 d(/\x.cos(pls(X, x)), Y) => mul(minus(sin(Y)), d(/\y.pls(X, y), Y)) 2.22/2.24 d(/\x.cos(sin(x)), X) => mul(minus(sin(X)), d(/\y.sin(y), X)) 2.22/2.24 d(/\x.pls(cos(x), cos(x)), X) => pls(d(/\y.cos(y), X), d(/\z.cos(z), X)) 2.22/2.24 d(/\x.pls(cos(x), d(F, x)), X) => pls(d(/\y.cos(y), X), d(/\z.d(F, z), X)) 2.22/2.24 d(/\x.pls(cos(x), minus(x)), X) => pls(d(/\y.cos(y), X), d(/\z.minus(z), X)) 2.22/2.24 d(/\x.pls(cos(x), mul(X, x)), Y) => pls(d(/\y.cos(y), Y), d(/\z.mul(X, z), Y)) 2.22/2.24 d(/\x.pls(cos(x), pls(X, x)), Y) => pls(d(/\y.cos(y), Y), d(/\z.pls(X, z), Y)) 2.22/2.24 d(/\x.pls(cos(x), sin(x)), X) => pls(d(/\y.cos(y), X), d(/\z.sin(z), X)) 2.22/2.24 d(/\x.pls(d(F, x), cos(x)), X) => pls(d(/\y.d(F, y), X), d(/\z.cos(z), X)) 2.22/2.24 d(/\x.pls(d(F, x), d(G, x)), X) => pls(d(/\y.d(F, y), X), d(/\z.d(G, z), X)) 2.22/2.24 d(/\x.pls(d(F, x), minus(x)), X) => pls(d(/\y.d(F, y), X), d(/\z.minus(z), X)) 2.22/2.24 d(/\x.pls(d(F, x), mul(X, x)), Y) => pls(d(/\y.d(F, y), Y), d(/\z.mul(X, z), Y)) 2.22/2.24 d(/\x.pls(d(F, x), pls(X, x)), Y) => pls(d(/\y.d(F, y), Y), d(/\z.pls(X, z), Y)) 2.22/2.24 d(/\x.pls(d(F, x), sin(x)), X) => pls(d(/\y.d(F, y), X), d(/\z.sin(z), X)) 2.22/2.24 d(/\x.pls(minus(x), cos(x)), X) => pls(d(/\y.minus(y), X), d(/\z.cos(z), X)) 2.22/2.24 d(/\x.pls(minus(x), d(F, x)), X) => pls(d(/\y.minus(y), X), d(/\z.d(F, z), X)) 2.22/2.24 d(/\x.pls(minus(x), minus(x)), X) => pls(d(/\y.minus(y), X), d(/\z.minus(z), X)) 2.22/2.24 d(/\x.pls(minus(x), mul(X, x)), Y) => pls(d(/\y.minus(y), Y), d(/\z.mul(X, z), Y)) 2.22/2.24 d(/\x.pls(minus(x), pls(X, x)), Y) => pls(d(/\y.minus(y), Y), d(/\z.pls(X, z), Y)) 2.22/2.24 d(/\x.pls(minus(x), sin(x)), X) => pls(d(/\y.minus(y), X), d(/\z.sin(z), X)) 2.22/2.24 d(/\x.pls(mul(X, x), cos(x)), Y) => pls(d(/\y.mul(X, y), Y), d(/\z.cos(z), Y)) 2.22/2.24 d(/\x.pls(mul(X, x), d(F, x)), Y) => pls(d(/\y.mul(X, y), Y), d(/\z.d(F, z), Y)) 2.22/2.25 d(/\x.pls(mul(X, x), minus(x)), Y) => pls(d(/\y.mul(X, y), Y), d(/\z.minus(z), Y)) 2.22/2.25 d(/\x.pls(mul(X, x), mul(Y, x)), Z) => pls(d(/\y.mul(X, y), Z), d(/\z.mul(Y, z), Z)) 2.22/2.25 d(/\x.pls(mul(X, x), pls(Y, x)), Z) => pls(d(/\y.mul(X, y), Z), d(/\z.pls(Y, z), Z)) 2.22/2.25 d(/\x.pls(mul(X, x), sin(x)), Y) => pls(d(/\y.mul(X, y), Y), d(/\z.sin(z), Y)) 2.22/2.25 d(/\x.pls(pls(X, x), cos(x)), Y) => pls(d(/\y.pls(X, y), Y), d(/\z.cos(z), Y)) 2.22/2.25 d(/\x.pls(pls(X, x), d(F, x)), Y) => pls(d(/\y.pls(X, y), Y), d(/\z.d(F, z), Y)) 2.22/2.25 d(/\x.pls(pls(X, x), minus(x)), Y) => pls(d(/\y.pls(X, y), Y), d(/\z.minus(z), Y)) 2.22/2.25 d(/\x.pls(pls(X, x), mul(Y, x)), Z) => pls(d(/\y.pls(X, y), Z), d(/\z.mul(Y, z), Z)) 2.22/2.25 d(/\x.pls(pls(X, x), pls(Y, x)), Z) => pls(d(/\y.pls(X, y), Z), d(/\z.pls(Y, z), Z)) 2.22/2.25 d(/\x.pls(pls(X, x), sin(x)), Y) => pls(d(/\y.pls(X, y), Y), d(/\z.sin(z), Y)) 2.22/2.25 d(/\x.pls(sin(x), cos(x)), X) => pls(d(/\y.sin(y), X), d(/\z.cos(z), X)) 2.22/2.25 d(/\x.pls(sin(x), d(F, x)), X) => pls(d(/\y.sin(y), X), d(/\z.d(F, z), X)) 2.22/2.25 d(/\x.pls(sin(x), minus(x)), X) => pls(d(/\y.sin(y), X), d(/\z.minus(z), X)) 2.22/2.25 d(/\x.pls(sin(x), mul(X, x)), Y) => pls(d(/\y.sin(y), Y), d(/\z.mul(X, z), Y)) 2.22/2.25 d(/\x.pls(sin(x), pls(X, x)), Y) => pls(d(/\y.sin(y), Y), d(/\z.pls(X, z), Y)) 2.22/2.25 d(/\x.pls(sin(x), sin(x)), X) => pls(d(/\y.sin(y), X), d(/\z.sin(z), X)) 2.22/2.25 d(/\x.mul(cos(x), cos(x)), X) => pls(mul(d(/\y.cos(y), X), cos(X)), mul(cos(X), d(/\z.cos(z), X))) 2.22/2.25 d(/\x.mul(cos(x), d(F, x)), X) => pls(mul(d(/\y.cos(y), X), d(F, X)), mul(cos(X), d(/\z.d(F, z), X))) 2.22/2.25 d(/\x.mul(cos(x), minus(x)), X) => pls(mul(d(/\y.cos(y), X), minus(X)), mul(cos(X), d(/\z.minus(z), X))) 2.22/2.25 d(/\x.mul(cos(x), mul(X, x)), Y) => pls(mul(d(/\y.cos(y), Y), mul(X, Y)), mul(cos(Y), d(/\z.mul(X, z), Y))) 2.22/2.25 d(/\x.mul(cos(x), pls(X, x)), Y) => pls(mul(d(/\y.cos(y), Y), pls(X, Y)), mul(cos(Y), d(/\z.pls(X, z), Y))) 2.22/2.25 d(/\x.mul(cos(x), sin(x)), X) => pls(mul(d(/\y.cos(y), X), sin(X)), mul(cos(X), d(/\z.sin(z), X))) 2.22/2.25 d(/\x.mul(d(F, x), cos(x)), X) => pls(mul(d(/\y.d(F, y), X), cos(X)), mul(d(F, X), d(/\z.cos(z), X))) 2.22/2.25 d(/\x.mul(d(F, x), d(G, x)), X) => pls(mul(d(/\y.d(F, y), X), d(G, X)), mul(d(F, X), d(/\z.d(G, z), X))) 2.22/2.25 d(/\x.mul(d(F, x), minus(x)), X) => pls(mul(d(/\y.d(F, y), X), minus(X)), mul(d(F, X), d(/\z.minus(z), X))) 2.22/2.25 d(/\x.mul(d(F, x), mul(X, x)), Y) => pls(mul(d(/\y.d(F, y), Y), mul(X, Y)), mul(d(F, Y), d(/\z.mul(X, z), Y))) 2.22/2.25 d(/\x.mul(d(F, x), pls(X, x)), Y) => pls(mul(d(/\y.d(F, y), Y), pls(X, Y)), mul(d(F, Y), d(/\z.pls(X, z), Y))) 2.22/2.25 d(/\x.mul(d(F, x), sin(x)), X) => pls(mul(d(/\y.d(F, y), X), sin(X)), mul(d(F, X), d(/\z.sin(z), X))) 2.22/2.25 d(/\x.mul(minus(x), cos(x)), X) => pls(mul(d(/\y.minus(y), X), cos(X)), mul(minus(X), d(/\z.cos(z), X))) 2.22/2.25 d(/\x.mul(minus(x), d(F, x)), X) => pls(mul(d(/\y.minus(y), X), d(F, X)), mul(minus(X), d(/\z.d(F, z), X))) 2.22/2.25 d(/\x.mul(minus(x), minus(x)), X) => pls(mul(d(/\y.minus(y), X), minus(X)), mul(minus(X), d(/\z.minus(z), X))) 2.22/2.25 d(/\x.mul(minus(x), mul(X, x)), Y) => pls(mul(d(/\y.minus(y), Y), mul(X, Y)), mul(minus(Y), d(/\z.mul(X, z), Y))) 2.22/2.25 d(/\x.mul(minus(x), pls(X, x)), Y) => pls(mul(d(/\y.minus(y), Y), pls(X, Y)), mul(minus(Y), d(/\z.pls(X, z), Y))) 2.22/2.25 d(/\x.mul(minus(x), sin(x)), X) => pls(mul(d(/\y.minus(y), X), sin(X)), mul(minus(X), d(/\z.sin(z), X))) 2.22/2.25 d(/\x.mul(mul(X, x), cos(x)), Y) => pls(mul(d(/\y.mul(X, y), Y), cos(Y)), mul(mul(X, Y), d(/\z.cos(z), Y))) 2.22/2.25 d(/\x.mul(mul(X, x), d(F, x)), Y) => pls(mul(d(/\y.mul(X, y), Y), d(F, Y)), mul(mul(X, Y), d(/\z.d(F, z), Y))) 2.22/2.25 d(/\x.mul(mul(X, x), minus(x)), Y) => pls(mul(d(/\y.mul(X, y), Y), minus(Y)), mul(mul(X, Y), d(/\z.minus(z), Y))) 2.22/2.25 d(/\x.mul(mul(X, x), mul(Y, x)), Z) => pls(mul(d(/\y.mul(X, y), Z), mul(Y, Z)), mul(mul(X, Z), d(/\z.mul(Y, z), Z))) 2.22/2.25 d(/\x.mul(mul(X, x), pls(Y, x)), Z) => pls(mul(d(/\y.mul(X, y), Z), pls(Y, Z)), mul(mul(X, Z), d(/\z.pls(Y, z), Z))) 2.22/2.25 d(/\x.mul(mul(X, x), sin(x)), Y) => pls(mul(d(/\y.mul(X, y), Y), sin(Y)), mul(mul(X, Y), d(/\z.sin(z), Y))) 2.22/2.25 d(/\x.mul(pls(X, x), cos(x)), Y) => pls(mul(d(/\y.pls(X, y), Y), cos(Y)), mul(pls(X, Y), d(/\z.cos(z), Y))) 2.22/2.25 d(/\x.mul(pls(X, x), d(F, x)), Y) => pls(mul(d(/\y.pls(X, y), Y), d(F, Y)), mul(pls(X, Y), d(/\z.d(F, z), Y))) 2.22/2.25 d(/\x.mul(pls(X, x), minus(x)), Y) => pls(mul(d(/\y.pls(X, y), Y), minus(Y)), mul(pls(X, Y), d(/\z.minus(z), Y))) 2.22/2.25 d(/\x.mul(pls(X, x), mul(Y, x)), Z) => pls(mul(d(/\y.pls(X, y), Z), mul(Y, Z)), mul(pls(X, Z), d(/\z.mul(Y, z), Z))) 2.22/2.25 d(/\x.mul(pls(X, x), pls(Y, x)), Z) => pls(mul(d(/\y.pls(X, y), Z), pls(Y, Z)), mul(pls(X, Z), d(/\z.pls(Y, z), Z))) 2.22/2.25 d(/\x.mul(pls(X, x), sin(x)), Y) => pls(mul(d(/\y.pls(X, y), Y), sin(Y)), mul(pls(X, Y), d(/\z.sin(z), Y))) 2.22/2.25 d(/\x.mul(sin(x), cos(x)), X) => pls(mul(d(/\y.sin(y), X), cos(X)), mul(sin(X), d(/\z.cos(z), X))) 2.22/2.25 d(/\x.mul(sin(x), d(F, x)), X) => pls(mul(d(/\y.sin(y), X), d(F, X)), mul(sin(X), d(/\z.d(F, z), X))) 2.22/2.25 d(/\x.mul(sin(x), minus(x)), X) => pls(mul(d(/\y.sin(y), X), minus(X)), mul(sin(X), d(/\z.minus(z), X))) 2.22/2.25 d(/\x.mul(sin(x), mul(X, x)), Y) => pls(mul(d(/\y.sin(y), Y), mul(X, Y)), mul(sin(Y), d(/\z.mul(X, z), Y))) 2.22/2.25 d(/\x.mul(sin(x), pls(X, x)), Y) => pls(mul(d(/\y.sin(y), Y), pls(X, Y)), mul(sin(Y), d(/\z.pls(X, z), Y))) 2.22/2.25 d(/\x.mul(sin(x), sin(x)), X) => pls(mul(d(/\y.sin(y), X), sin(X)), mul(sin(X), d(/\z.sin(z), X))) 2.22/2.25 ~AP1(F, X) => F X 2.22/2.25 2.22/2.25 Symbol ~AP1 is an encoding for application that is only used in innocuous ways. We can simplify the program (without losing non-termination) by removing it. Additionally, we can remove some (now-)redundant rules. This gives: 2.22/2.25 2.22/2.25 Alphabet: 2.22/2.25 2.22/2.25 0 : [] --> R 2.22/2.25 1 : [] --> R 2.22/2.25 cos : [R] --> R 2.22/2.25 d : [R -> R * R] --> R 2.22/2.25 minus : [R] --> R 2.22/2.25 mul : [R * R] --> R 2.22/2.25 pls : [R * R] --> R 2.22/2.25 sin : [R] --> R 2.22/2.25 2.22/2.25 Rules: 2.22/2.25 2.22/2.25 d(/\x.X, Y) => 0 2.22/2.25 d(/\x.x, X) => 1 2.22/2.25 d(/\x.minus(X(x)), Y) => minus(d(/\y.X(y), Y)) 2.22/2.25 d(/\x.pls(X(x), Y(x)), Z) => pls(d(/\y.X(y), Z), d(/\z.Y(z), Z)) 2.22/2.25 d(/\x.mul(X(x), Y(x)), Z) => pls(mul(d(/\y.X(y), Z), Y(Z)), mul(X(Z), d(/\z.Y(z), Z))) 2.22/2.25 d(/\x.sin(X(x)), Y) => mul(cos(Y), d(/\y.X(y), Y)) 2.22/2.25 d(/\x.cos(X(x)), Y) => mul(minus(sin(Y)), d(/\y.X(y), Y)) 2.22/2.25 minus(0) => 0 2.22/2.25 mul(0, X) => 0 2.22/2.25 mul(X, 0) => 0 2.22/2.25 pls(0, X) => X 2.22/2.25 2.22/2.25 We use rule removal, following [Kop12, Theorem 2.23]. 2.22/2.25 2.22/2.25 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 2.22/2.25 2.22/2.25 d(/\x.X, Y) >? 0 2.22/2.25 d(/\x.x, X) >? 1 2.22/2.25 d(/\x.minus(X(x)), Y) >? minus(d(/\y.X(y), Y)) 2.22/2.25 d(/\x.pls(X(x), Y(x)), Z) >? pls(d(/\y.X(y), Z), d(/\z.Y(z), Z)) 2.22/2.25 d(/\x.mul(X(x), Y(x)), Z) >? pls(mul(d(/\y.X(y), Z), Y(Z)), mul(X(Z), d(/\z.Y(z), Z))) 2.22/2.25 d(/\x.sin(X(x)), Y) >? mul(cos(Y), d(/\y.X(y), Y)) 2.22/2.25 d(/\x.cos(X(x)), Y) >? mul(minus(sin(Y)), d(/\y.X(y), Y)) 2.22/2.25 minus(0) >? 0 2.22/2.25 mul(0, X) >? 0 2.22/2.25 mul(X, 0) >? 0 2.22/2.25 pls(0, X) >? X 2.22/2.25 2.22/2.25 We use a recursive path ordering as defined in [Kop12, Chapter 5]. 2.22/2.25 2.22/2.25 Argument functions: 2.22/2.25 2.22/2.25 [[0]] = _|_ 2.22/2.25 [[1]] = _|_ 2.22/2.25 2.22/2.25 We choose Lex = {} and Mul = {cos, d, minus, mul, pls, sin}, and the following precedence: d > cos > minus > mul > pls > sin 2.22/2.25 2.22/2.25 Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: 2.22/2.25 2.22/2.25 d(/\x.X, Y) >= _|_ 2.22/2.25 d(/\x.x, X) >= _|_ 2.22/2.25 d(/\x.minus(X(x)), Y) > minus(d(/\x.X(x), Y)) 2.22/2.25 d(/\x.pls(X(x), Y(x)), Z) >= pls(d(/\x.X(x), Z), d(/\y.Y(y), Z)) 2.22/2.25 d(/\x.mul(X(x), Y(x)), Z) > pls(mul(d(/\x.X(x), Z), Y(Z)), mul(X(Z), d(/\y.Y(y), Z))) 2.22/2.25 d(/\x.sin(X(x)), Y) >= mul(cos(Y), d(/\x.X(x), Y)) 2.22/2.25 d(/\x.cos(X(x)), Y) >= mul(minus(sin(Y)), d(/\x.X(x), Y)) 2.22/2.25 minus(_|_) >= _|_ 2.22/2.25 mul(_|_, X) >= _|_ 2.22/2.25 mul(X, _|_) >= _|_ 2.22/2.25 pls(_|_, X) >= X 2.22/2.25 2.22/2.25 With these choices, we have: 2.22/2.25 2.22/2.25 1] d(/\x.X, Y) >= _|_ by (Bot) 2.22/2.25 2.22/2.25 2] d(/\x.x, X) >= _|_ by (Bot) 2.22/2.25 2.22/2.25 3] d(/\x.minus(X(x)), Y) > minus(d(/\x.X(x), Y)) because [4], by definition 2.22/2.25 4] d*(/\x.minus(X(x)), Y) >= minus(d(/\x.X(x), Y)) because d > minus and [5], by (Copy) 2.22/2.25 5] d*(/\x.minus(X(x)), Y) >= d(/\x.X(x), Y) because d in Mul, [6] and [11], by (Stat) 2.22/2.25 6] /\x.minus(X(x)) > /\x.X(x) because [7], by definition 2.22/2.25 7] /\y.minus*(X(y)) >= /\y.X(y) because [8], by (Abs) 2.22/2.25 8] minus*(X(x)) >= X(x) because [9], by (Select) 2.22/2.25 9] X(x) >= X(x) because [10], by (Meta) 2.22/2.25 10] x >= x by (Var) 2.22/2.25 11] Y >= Y by (Meta) 2.22/2.25 2.22/2.25 12] d(/\x.pls(X(x), Y(x)), Z) >= pls(d(/\x.X(x), Z), d(/\y.Y(y), Z)) because [13], by (Star) 2.22/2.25 13] d*(/\x.pls(X(x), Y(x)), Z) >= pls(d(/\x.X(x), Z), d(/\y.Y(y), Z)) because d > pls, [14] and [21], by (Copy) 2.22/2.25 14] d*(/\x.pls(X(x), Y(x)), Z) >= d(/\x.X(x), Z) because d in Mul, [15] and [20], by (Stat) 2.22/2.25 15] /\x.pls(X(x), Y(x)) > /\x.X(x) because [16], by definition 2.22/2.25 16] /\y.pls*(X(y), Y(y)) >= /\y.X(y) because [17], by (Abs) 2.22/2.25 17] pls*(X(x), Y(x)) >= X(x) because [18], by (Select) 2.22/2.25 18] X(x) >= X(x) because [19], by (Meta) 2.22/2.25 19] x >= x by (Var) 2.22/2.25 20] Z >= Z by (Meta) 2.22/2.25 21] d*(/\y.pls(X(y), Y(y)), Z) >= d(/\y.Y(y), Z) because d in Mul, [22] and [20], by (Stat) 2.22/2.25 22] /\y.pls(X(y), Y(y)) > /\y.Y(y) because [23], by definition 2.22/2.25 23] /\z.pls*(X(z), Y(z)) >= /\z.Y(z) because [24], by (Abs) 2.22/2.25 24] pls*(X(y), Y(y)) >= Y(y) because [25], by (Select) 2.22/2.25 25] Y(y) >= Y(y) because [26], by (Meta) 2.22/2.25 26] y >= y by (Var) 2.22/2.25 2.22/2.25 27] d(/\x.mul(X(x), Y(x)), Z) > pls(mul(d(/\x.X(x), Z), Y(Z)), mul(X(Z), d(/\y.Y(y), Z))) because [28], by definition 2.22/2.25 28] d*(/\x.mul(X(x), Y(x)), Z) >= pls(mul(d(/\x.X(x), Z), Y(Z)), mul(X(Z), d(/\y.Y(y), Z))) because d > pls, [29] and [42], by (Copy) 2.22/2.25 29] d*(/\x.mul(X(x), Y(x)), Z) >= mul(d(/\x.X(x), Z), Y(Z)) because d > mul, [30] and [37], by (Copy) 2.22/2.25 30] d*(/\x.mul(X(x), Y(x)), Z) >= d(/\x.X(x), Z) because d in Mul, [31] and [36], by (Stat) 2.22/2.25 31] /\x.mul(X(x), Y(x)) > /\x.X(x) because [32], by definition 2.22/2.25 32] /\y.mul*(X(y), Y(y)) >= /\y.X(y) because [33], by (Abs) 2.22/2.25 33] mul*(X(x), Y(x)) >= X(x) because [34], by (Select) 2.22/2.25 34] X(x) >= X(x) because [35], by (Meta) 2.22/2.25 35] x >= x by (Var) 2.22/2.25 36] Z >= Z by (Meta) 2.22/2.25 37] d*(/\y.mul(X(y), Y(y)), Z) >= Y(Z) because [38], by (Select) 2.22/2.25 38] mul(X(d*(/\y.mul(X(y), Y(y)), Z)), Y(d*(/\z.mul(X(z), Y(z)), Z))) >= Y(Z) because [39], by (Star) 2.22/2.25 39] mul*(X(d*(/\y.mul(X(y), Y(y)), Z)), Y(d*(/\z.mul(X(z), Y(z)), Z))) >= Y(Z) because [40], by (Select) 2.22/2.25 40] Y(d*(/\y.mul(X(y), Y(y)), Z)) >= Y(Z) because [41], by (Meta) 2.22/2.25 41] d*(/\y.mul(X(y), Y(y)), Z) >= Z because [36], by (Select) 2.22/2.25 42] d*(/\y.mul(X(y), Y(y)), Z) >= mul(X(Z), d(/\y.Y(y), Z)) because d > mul, [43] and [47], by (Copy) 2.22/2.25 43] d*(/\y.mul(X(y), Y(y)), Z) >= X(Z) because [44], by (Select) 2.22/2.25 44] mul(X(d*(/\y.mul(X(y), Y(y)), Z)), Y(d*(/\z.mul(X(z), Y(z)), Z))) >= X(Z) because [45], by (Star) 2.22/2.25 45] mul*(X(d*(/\y.mul(X(y), Y(y)), Z)), Y(d*(/\z.mul(X(z), Y(z)), Z))) >= X(Z) because [46], by (Select) 2.22/2.25 46] X(d*(/\y.mul(X(y), Y(y)), Z)) >= X(Z) because [41], by (Meta) 2.22/2.25 47] d*(/\y.mul(X(y), Y(y)), Z) >= d(/\y.Y(y), Z) because d in Mul, [48] and [36], by (Stat) 2.22/2.25 48] /\y.mul(X(y), Y(y)) > /\y.Y(y) because [49], by definition 2.22/2.25 49] /\z.mul*(X(z), Y(z)) >= /\z.Y(z) because [50], by (Abs) 2.22/2.25 50] mul*(X(y), Y(y)) >= Y(y) because [51], by (Select) 2.22/2.25 51] Y(y) >= Y(y) because [52], by (Meta) 2.22/2.25 52] y >= y by (Var) 2.22/2.25 2.22/2.25 53] d(/\x.sin(X(x)), Y) >= mul(cos(Y), d(/\x.X(x), Y)) because [54], by (Star) 2.22/2.25 54] d*(/\x.sin(X(x)), Y) >= mul(cos(Y), d(/\x.X(x), Y)) because d > mul, [55] and [58], by (Copy) 2.22/2.25 55] d*(/\x.sin(X(x)), Y) >= cos(Y) because d > cos and [56], by (Copy) 2.22/2.25 56] d*(/\x.sin(X(x)), Y) >= Y because [57], by (Select) 2.22/2.25 57] Y >= Y by (Meta) 2.22/2.25 58] d*(/\x.sin(X(x)), Y) >= d(/\x.X(x), Y) because d in Mul, [59] and [64], by (Stat) 2.22/2.25 59] /\x.sin(X(x)) > /\x.X(x) because [60], by definition 2.22/2.25 60] /\y.sin*(X(y)) >= /\y.X(y) because [61], by (Abs) 2.22/2.25 61] sin*(X(x)) >= X(x) because [62], by (Select) 2.22/2.25 62] X(x) >= X(x) because [63], by (Meta) 2.22/2.25 63] x >= x by (Var) 2.22/2.25 64] Y >= Y by (Meta) 2.22/2.25 2.22/2.25 65] d(/\x.cos(X(x)), Y) >= mul(minus(sin(Y)), d(/\x.X(x), Y)) because [66], by (Star) 2.22/2.25 66] d*(/\x.cos(X(x)), Y) >= mul(minus(sin(Y)), d(/\x.X(x), Y)) because d > mul, [67] and [71], by (Copy) 2.22/2.25 67] d*(/\x.cos(X(x)), Y) >= minus(sin(Y)) because d > minus and [68], by (Copy) 2.22/2.25 68] d*(/\x.cos(X(x)), Y) >= sin(Y) because d > sin and [69], by (Copy) 2.22/2.25 69] d*(/\x.cos(X(x)), Y) >= Y because [70], by (Select) 2.22/2.25 70] Y >= Y by (Meta) 2.22/2.25 71] d*(/\x.cos(X(x)), Y) >= d(/\x.X(x), Y) because d in Mul, [72] and [77], by (Stat) 2.22/2.25 72] /\x.cos(X(x)) > /\x.X(x) because [73], by definition 2.22/2.25 73] /\y.cos*(X(y)) >= /\y.X(y) because [74], by (Abs) 2.22/2.25 74] cos*(X(x)) >= X(x) because [75], by (Select) 2.22/2.25 75] X(x) >= X(x) because [76], by (Meta) 2.22/2.25 76] x >= x by (Var) 2.22/2.25 77] Y >= Y by (Meta) 2.22/2.25 2.22/2.25 78] minus(_|_) >= _|_ by (Bot) 2.22/2.25 2.22/2.25 79] mul(_|_, X) >= _|_ by (Bot) 2.22/2.25 2.22/2.25 80] mul(X, _|_) >= _|_ by (Bot) 2.22/2.25 2.22/2.25 81] pls(_|_, X) >= X because [82], by (Star) 2.22/2.25 82] pls*(_|_, X) >= X because [83], by (Select) 2.22/2.25 83] X >= X by (Meta) 2.22/2.25 2.22/2.25 We can thus remove the following rules: 2.22/2.25 2.22/2.25 d(/\x.minus(X(x)), Y) => minus(d(/\y.X(y), Y)) 2.22/2.25 d(/\x.mul(X(x), Y(x)), Z) => pls(mul(d(/\y.X(y), Z), Y(Z)), mul(X(Z), d(/\z.Y(z), Z))) 2.22/2.25 2.22/2.25 We use rule removal, following [Kop12, Theorem 2.23]. 2.22/2.25 2.22/2.25 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 2.22/2.25 2.22/2.25 d(/\x.X, Y) >? 0 2.22/2.25 d(/\x.x, X) >? 1 2.22/2.25 d(/\x.pls(X(x), Y(x)), Z) >? pls(d(/\y.X(y), Z), d(/\z.Y(z), Z)) 2.22/2.25 d(/\x.sin(X(x)), Y) >? mul(cos(Y), d(/\y.X(y), Y)) 2.22/2.25 d(/\x.cos(X(x)), Y) >? mul(minus(sin(Y)), d(/\y.X(y), Y)) 2.22/2.25 minus(0) >? 0 2.22/2.25 mul(0, X) >? 0 2.22/2.25 mul(X, 0) >? 0 2.22/2.25 pls(0, X) >? X 2.22/2.25 2.22/2.25 We orient these requirements with a polynomial interpretation in the natural numbers. 2.22/2.25 2.22/2.25 The following interpretation satisfies the requirements: 2.22/2.25 2.22/2.25 0 = 0 2.22/2.25 1 = 0 2.22/2.25 cos = \y0.1 + y0 2.22/2.25 d = \G0y1.y1 + G0(0) + G0(y1) + y1G0(y1) 2.22/2.25 minus = \y0.y0 2.22/2.25 mul = \y0y1.y0 + y1 2.22/2.25 pls = \y0y1.1 + y0 + y1 2.22/2.25 sin = \y0.2 + y0 2.22/2.25 2.22/2.25 Using this interpretation, the requirements translate to: 2.22/2.25 2.22/2.25 [[d(/\x._x0, _x1)]] = x1 + 2x0 + x0x1 >= 0 = [[0]] 2.22/2.25 [[d(/\x.x, _x0)]] = 2x0 + x0x0 >= 0 = [[1]] 2.22/2.25 [[d(/\x.pls(_x0(x), _x1(x)), _x2)]] = 2 + 2x2 + F0(0) + F0(x2) + F1(0) + F1(x2) + x2F0(x2) + x2F1(x2) > 1 + 2x2 + F0(0) + F0(x2) + F1(0) + F1(x2) + x2F0(x2) + x2F1(x2) = [[pls(d(/\x._x0(x), _x2), d(/\y._x1(y), _x2))]] 2.22/2.25 [[d(/\x.sin(_x0(x)), _x1)]] = 4 + 3x1 + F0(0) + F0(x1) + x1F0(x1) > 1 + 2x1 + F0(0) + F0(x1) + x1F0(x1) = [[mul(cos(_x1), d(/\x._x0(x), _x1))]] 2.22/2.25 [[d(/\x.cos(_x0(x)), _x1)]] = 2 + 2x1 + F0(0) + F0(x1) + x1F0(x1) >= 2 + 2x1 + F0(0) + F0(x1) + x1F0(x1) = [[mul(minus(sin(_x1)), d(/\x._x0(x), _x1))]] 2.22/2.25 [[minus(0)]] = 0 >= 0 = [[0]] 2.22/2.25 [[mul(0, _x0)]] = x0 >= 0 = [[0]] 2.22/2.25 [[mul(_x0, 0)]] = x0 >= 0 = [[0]] 2.22/2.25 [[pls(0, _x0)]] = 1 + x0 > x0 = [[_x0]] 2.22/2.25 2.22/2.25 We can thus remove the following rules: 2.22/2.25 2.22/2.25 d(/\x.pls(X(x), Y(x)), Z) => pls(d(/\y.X(y), Z), d(/\z.Y(z), Z)) 2.22/2.25 d(/\x.sin(X(x)), Y) => mul(cos(Y), d(/\y.X(y), Y)) 2.22/2.25 pls(0, X) => X 2.22/2.25 2.22/2.25 We use rule removal, following [Kop12, Theorem 2.23]. 2.22/2.25 2.22/2.25 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 2.22/2.25 2.22/2.25 d(/\x.X, Y) >? 0 2.22/2.25 d(/\x.x, X) >? 1 2.22/2.25 d(/\x.cos(X(x)), Y) >? mul(minus(sin(Y)), d(/\y.X(y), Y)) 2.22/2.25 minus(0) >? 0 2.22/2.25 mul(0, X) >? 0 2.22/2.25 mul(X, 0) >? 0 2.22/2.25 2.22/2.25 We orient these requirements with a polynomial interpretation in the natural numbers. 2.22/2.25 2.22/2.25 The following interpretation satisfies the requirements: 2.22/2.25 2.22/2.25 0 = 0 2.22/2.25 1 = 0 2.22/2.25 cos = \y0.3 + 3y0 2.22/2.25 d = \G0y1.2y1 + 3y1G0(y1) + 3G0(0) + 3G0(y1) 2.22/2.25 minus = \y0.1 + y0 2.22/2.25 mul = \y0y1.2 + y0 + y1 2.22/2.25 sin = \y0.y0 2.22/2.25 2.22/2.25 Using this interpretation, the requirements translate to: 2.22/2.25 2.22/2.25 [[d(/\x._x0, _x1)]] = 2x1 + 3x0x1 + 6x0 >= 0 = [[0]] 2.22/2.25 [[d(/\x.x, _x0)]] = 3x0x0 + 5x0 >= 0 = [[1]] 2.22/2.25 [[d(/\x.cos(_x0(x)), _x1)]] = 18 + 11x1 + 9x1F0(x1) + 9F0(0) + 9F0(x1) > 3 + 3x1 + 3x1F0(x1) + 3F0(0) + 3F0(x1) = [[mul(minus(sin(_x1)), d(/\x._x0(x), _x1))]] 2.22/2.25 [[minus(0)]] = 1 > 0 = [[0]] 2.22/2.25 [[mul(0, _x0)]] = 2 + x0 > 0 = [[0]] 2.22/2.25 [[mul(_x0, 0)]] = 2 + x0 > 0 = [[0]] 2.22/2.25 2.22/2.25 We can thus remove the following rules: 2.22/2.25 2.22/2.25 d(/\x.cos(X(x)), Y) => mul(minus(sin(Y)), d(/\y.X(y), Y)) 2.22/2.25 minus(0) => 0 2.22/2.25 mul(0, X) => 0 2.22/2.25 mul(X, 0) => 0 2.22/2.25 2.22/2.25 We use rule removal, following [Kop12, Theorem 2.23]. 2.22/2.25 2.22/2.25 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 2.22/2.25 2.22/2.25 d(/\x.X, Y) >? 0 2.22/2.25 d(/\x.x, X) >? 1 2.22/2.25 2.22/2.25 We orient these requirements with a polynomial interpretation in the natural numbers. 2.22/2.25 2.22/2.25 The following interpretation satisfies the requirements: 2.22/2.25 2.22/2.25 0 = 0 2.22/2.25 1 = 0 2.22/2.25 d = \G0y1.3 + y1 + G0(0) 2.22/2.25 2.22/2.25 Using this interpretation, the requirements translate to: 2.22/2.25 2.22/2.25 [[d(/\x._x0, _x1)]] = 3 + x0 + x1 > 0 = [[0]] 2.22/2.25 [[d(/\x.x, _x0)]] = 3 + x0 > 0 = [[1]] 2.22/2.25 2.22/2.25 We can thus remove the following rules: 2.22/2.25 2.22/2.25 d(/\x.X, Y) => 0 2.22/2.25 d(/\x.x, X) => 1 2.22/2.25 2.22/2.25 All rules were succesfully removed. Thus, termination of the original system has been reduced to termination of the beta-rule, which is well-known to hold. 2.22/2.25 2.22/2.25 2.22/2.25 +++ Citations +++ 2.22/2.25 2.22/2.25 [Kop11] C. Kop. Simplifying Algebraic Functional Systems. In Proceedings of CAI 2011, volume 6742 of LNCS. 201--215, Springer, 2011. 2.22/2.25 [Kop12] C. Kop. Higher Order Termination. PhD Thesis, 2012. 2.22/2.25 EOF