0.00/0.43 YES 0.00/0.45 We consider the system theBenchmark. 0.00/0.45 0.00/0.45 Alphabet: 0.00/0.45 0.00/0.45 cons : [nat * list] --> list 0.00/0.45 explode : [list * nat -> nat * nat] --> nat 0.00/0.45 implode : [list * nat -> nat * nat] --> nat 0.00/0.45 nil : [] --> list 0.00/0.45 op : [nat -> nat * nat -> nat] --> nat -> nat 0.00/0.45 0.00/0.45 Rules: 0.00/0.45 0.00/0.45 op(f, g) x => f (g x) 0.00/0.45 implode(nil, f, x) => x 0.00/0.45 implode(cons(x, y), f, z) => implode(y, f, f z) 0.00/0.45 explode(nil, f, x) => x 0.00/0.45 explode(cons(x, y), f, z) => explode(y, op(f, f), f z) 0.00/0.45 0.00/0.45 This AFS is converted to an AFSM simply by replacing all free variables by meta-variables (with arity 0). 0.00/0.45 0.00/0.45 We use rule removal, following [Kop12, Theorem 2.23]. 0.00/0.45 0.00/0.45 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 0.00/0.45 0.00/0.45 op(F, G) X >? F (G X) 0.00/0.45 implode(nil, F, X) >? X 0.00/0.45 implode(cons(X, Y), F, Z) >? implode(Y, F, F Z) 0.00/0.45 explode(nil, F, X) >? X 0.00/0.45 explode(cons(X, Y), F, Z) >? explode(Y, op(F, F), F Z) 0.00/0.45 0.00/0.45 We use a recursive path ordering as defined in [Kop12, Chapter 5]. 0.00/0.45 0.00/0.45 Argument functions: 0.00/0.45 0.00/0.45 [[explode(x_1, x_2, x_3)]] = explode(x_1, x_3, x_2) 0.00/0.45 0.00/0.45 We choose Lex = {explode, implode} and Mul = {@_{o -> o}, cons, nil, op}, and the following precedence: cons > explode > nil > implode > op > @_{o -> o} 0.00/0.45 0.00/0.45 Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: 0.00/0.45 0.00/0.45 @_{o -> o}(op(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) 0.00/0.45 implode(nil, F, X) >= X 0.00/0.45 implode(cons(X, Y), F, Z) >= implode(Y, F, @_{o -> o}(F, Z)) 0.00/0.45 explode(nil, F, X) > X 0.00/0.45 explode(cons(X, Y), F, Z) > explode(Y, op(F, F), @_{o -> o}(F, Z)) 0.00/0.45 0.00/0.45 With these choices, we have: 0.00/0.45 0.00/0.45 1] @_{o -> o}(op(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because [2], by (Star) 0.00/0.45 2] @_{o -> o}*(op(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because [3], by (Select) 0.00/0.45 3] op(F, G) @_{o -> o}*(op(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because [4] 0.00/0.45 4] op*(F, G, @_{o -> o}*(op(F, G), X)) >= @_{o -> o}(F, @_{o -> o}(G, X)) because op > @_{o -> o}, [5] and [7], by (Copy) 0.00/0.45 5] op*(F, G, @_{o -> o}*(op(F, G), X)) >= F because [6], by (Select) 0.00/0.45 6] F >= F by (Meta) 0.00/0.45 7] op*(F, G, @_{o -> o}*(op(F, G), X)) >= @_{o -> o}(G, X) because op > @_{o -> o}, [8] and [10], by (Copy) 0.00/0.45 8] op*(F, G, @_{o -> o}*(op(F, G), X)) >= G because [9], by (Select) 0.00/0.45 9] G >= G by (Meta) 0.00/0.45 10] op*(F, G, @_{o -> o}*(op(F, G), X)) >= X because [11], by (Select) 0.00/0.45 11] @_{o -> o}*(op(F, G), X) >= X because [12], by (Select) 0.00/0.45 12] op(F, G) @_{o -> o}*(op(F, G), X) >= X because [13] 0.00/0.45 13] op*(F, G, @_{o -> o}*(op(F, G), X)) >= X because [14], by (Select) 0.00/0.45 14] @_{o -> o}*(op(F, G), X) >= X because [15], by (Select) 0.00/0.45 15] X >= X by (Meta) 0.00/0.45 0.00/0.45 16] implode(nil, F, X) >= X because [17], by (Star) 0.00/0.45 17] implode*(nil, F, X) >= X because [18], by (Select) 0.00/0.45 18] X >= X by (Meta) 0.00/0.45 0.00/0.45 19] implode(cons(X, Y), F, Z) >= implode(Y, F, @_{o -> o}(F, Z)) because [20], by (Star) 0.00/0.45 20] implode*(cons(X, Y), F, Z) >= implode(Y, F, @_{o -> o}(F, Z)) because [21], [24], [26] and [28], by (Stat) 0.00/0.45 21] cons(X, Y) > Y because [22], by definition 0.00/0.45 22] cons*(X, Y) >= Y because [23], by (Select) 0.00/0.45 23] Y >= Y by (Meta) 0.00/0.45 24] implode*(cons(X, Y), F, Z) >= Y because [25], by (Select) 0.00/0.45 25] cons(X, Y) >= Y because [22], by (Star) 0.00/0.45 26] implode*(cons(X, Y), F, Z) >= F because [27], by (Select) 0.00/0.45 27] F >= F by (Meta) 0.00/0.45 28] implode*(cons(X, Y), F, Z) >= @_{o -> o}(F, Z) because implode > @_{o -> o}, [26] and [29], by (Copy) 0.00/0.45 29] implode*(cons(X, Y), F, Z) >= Z because [30], by (Select) 0.00/0.45 30] Z >= Z by (Meta) 0.00/0.45 0.00/0.45 31] explode(nil, F, X) > X because [32], by definition 0.00/0.45 32] explode*(nil, F, X) >= X because [33], by (Select) 0.00/0.45 33] X >= X by (Meta) 0.00/0.45 0.00/0.45 34] explode(cons(X, Y), F, Z) > explode(Y, op(F, F), @_{o -> o}(F, Z)) because [35], by definition 0.00/0.45 35] explode*(cons(X, Y), F, Z) >= explode(Y, op(F, F), @_{o -> o}(F, Z)) because [36], [39], [41] and [44], by (Stat) 0.00/0.45 36] cons(X, Y) > Y because [37], by definition 0.00/0.45 37] cons*(X, Y) >= Y because [38], by (Select) 0.00/0.45 38] Y >= Y by (Meta) 0.00/0.45 39] explode*(cons(X, Y), F, Z) >= Y because [40], by (Select) 0.00/0.45 40] cons(X, Y) >= Y because [37], by (Star) 0.00/0.45 41] explode*(cons(X, Y), F, Z) >= op(F, F) because explode > op, [42] and [42], by (Copy) 0.00/0.45 42] explode*(cons(X, Y), F, Z) >= F because [43], by (Select) 0.00/0.45 43] F >= F by (Meta) 0.00/0.45 44] explode*(cons(X, Y), F, Z) >= @_{o -> o}(F, Z) because explode > @_{o -> o}, [42] and [45], by (Copy) 0.00/0.45 45] explode*(cons(X, Y), F, Z) >= Z because [46], by (Select) 0.00/0.45 46] Z >= Z by (Meta) 0.00/0.45 0.00/0.45 We can thus remove the following rules: 0.00/0.45 0.00/0.45 explode(nil, F, X) => X 0.00/0.45 explode(cons(X, Y), F, Z) => explode(Y, op(F, F), F Z) 0.00/0.45 0.00/0.45 We use rule removal, following [Kop12, Theorem 2.23]. 0.00/0.45 0.00/0.45 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 0.00/0.45 0.00/0.45 op(F, G, X) >? F (G X) 0.00/0.45 implode(nil, F, X) >? X 0.00/0.45 implode(cons(X, Y), F, Z) >? implode(Y, F, F Z) 0.00/0.45 0.00/0.45 We use a recursive path ordering as defined in [Kop12, Chapter 5]. 0.00/0.45 0.00/0.45 Argument functions: 0.00/0.45 0.00/0.45 [[implode(x_1, x_2, x_3)]] = implode(x_1, x_3, x_2) 0.00/0.45 0.00/0.45 We choose Lex = {implode} and Mul = {@_{o -> o}, cons, nil, op}, and the following precedence: op > nil > implode > cons > @_{o -> o} 0.00/0.45 0.00/0.45 Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: 0.00/0.45 0.00/0.45 op(F, G, X) > @_{o -> o}(F, @_{o -> o}(G, X)) 0.00/0.45 implode(nil, F, X) >= X 0.00/0.45 implode(cons(X, Y), F, Z) > implode(Y, F, @_{o -> o}(F, Z)) 0.00/0.45 0.00/0.45 With these choices, we have: 0.00/0.45 0.00/0.45 1] op(F, G, X) > @_{o -> o}(F, @_{o -> o}(G, X)) because [2], by definition 0.00/0.45 2] op*(F, G, X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because op > @_{o -> o}, [3] and [5], by (Copy) 0.00/0.45 3] op*(F, G, X) >= F because [4], by (Select) 0.00/0.45 4] F >= F by (Meta) 0.00/0.45 5] op*(F, G, X) >= @_{o -> o}(G, X) because op > @_{o -> o}, [6] and [8], by (Copy) 0.00/0.45 6] op*(F, G, X) >= G because [7], by (Select) 0.00/0.45 7] G >= G by (Meta) 0.00/0.45 8] op*(F, G, X) >= X because [9], by (Select) 0.00/0.45 9] X >= X by (Meta) 0.00/0.45 0.00/0.45 10] implode(nil, F, X) >= X because [11], by (Star) 0.00/0.45 11] implode*(nil, F, X) >= X because [12], by (Select) 0.00/0.45 12] X >= X by (Meta) 0.00/0.45 0.00/0.45 13] implode(cons(X, Y), F, Z) > implode(Y, F, @_{o -> o}(F, Z)) because [14], by definition 0.00/0.45 14] implode*(cons(X, Y), F, Z) >= implode(Y, F, @_{o -> o}(F, Z)) because [15], [18], [20] and [22], by (Stat) 0.00/0.45 15] cons(X, Y) > Y because [16], by definition 0.00/0.45 16] cons*(X, Y) >= Y because [17], by (Select) 0.00/0.45 17] Y >= Y by (Meta) 0.00/0.45 18] implode*(cons(X, Y), F, Z) >= Y because [19], by (Select) 0.00/0.45 19] cons(X, Y) >= Y because [16], by (Star) 0.00/0.45 20] implode*(cons(X, Y), F, Z) >= F because [21], by (Select) 0.00/0.45 21] F >= F by (Meta) 0.00/0.45 22] implode*(cons(X, Y), F, Z) >= @_{o -> o}(F, Z) because implode > @_{o -> o}, [20] and [23], by (Copy) 0.00/0.45 23] implode*(cons(X, Y), F, Z) >= Z because [24], by (Select) 0.00/0.45 24] Z >= Z by (Meta) 0.00/0.45 0.00/0.45 We can thus remove the following rules: 0.00/0.45 0.00/0.45 op(F, G, X) => F (G X) 0.00/0.45 implode(cons(X, Y), F, Z) => implode(Y, F, F Z) 0.00/0.45 0.00/0.45 We use rule removal, following [Kop12, Theorem 2.23]. 0.00/0.45 0.00/0.45 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 0.00/0.45 0.00/0.45 implode(nil, F, X) >? X 0.00/0.45 0.00/0.45 We orient these requirements with a polynomial interpretation in the natural numbers. 0.00/0.45 0.00/0.45 The following interpretation satisfies the requirements: 0.00/0.45 0.00/0.45 implode = \y0G1y2.3 + y0 + y2 + G1(0) 0.00/0.45 nil = 3 0.00/0.45 0.00/0.45 Using this interpretation, the requirements translate to: 0.00/0.45 0.00/0.45 [[implode(nil, _F0, _x1)]] = 6 + x1 + F0(0) > x1 = [[_x1]] 0.00/0.45 0.00/0.45 We can thus remove the following rules: 0.00/0.45 0.00/0.45 implode(nil, F, X) => X 0.00/0.45 0.00/0.45 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. 0.00/0.45 0.00/0.45 0.00/0.45 +++ Citations +++ 0.00/0.45 0.00/0.45 [Kop12] C. Kop. Higher Order Termination. PhD Thesis, 2012. 0.00/0.45 EOF