We consider the system AotoYamada_05__026. Alphabet: comp : [c -> c * c -> c] --> c -> c cons : [a * b] --> b map : [a -> a * b] --> b nil : [] --> b twice : [c -> c] --> c -> c Rules: map(f, nil) => nil map(f, cons(x, y)) => cons(f x, map(f, y)) comp(f, g) x => f (g x) twice(f) => comp(f, f) This AFS is converted to an AFSM simply by replacing all free variables by meta-variables (with arity 0). We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): map(F, nil) >? nil map(F, cons(X, Y)) >? cons(F X, map(F, Y)) comp(F, G) X >? F (G X) twice(F) >? comp(F, F) We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[nil]] = _|_ We choose Lex = {} and Mul = {@_{o -> o}, comp, cons, map, twice}, and the following precedence: map > cons > twice > comp > @_{o -> o} Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: map(F, _|_) > _|_ map(F, cons(X, Y)) >= cons(@_{o -> o}(F, X), map(F, Y)) @_{o -> o}(comp(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) twice(F) >= comp(F, F) With these choices, we have: 1] map(F, _|_) > _|_ because [2], by definition 2] map*(F, _|_) >= _|_ by (Bot) 3] map(F, cons(X, Y)) >= cons(@_{o -> o}(F, X), map(F, Y)) because [4], by (Star) 4] map*(F, cons(X, Y)) >= cons(@_{o -> o}(F, X), map(F, Y)) because map > cons, [5] and [12], by (Copy) 5] map*(F, cons(X, Y)) >= @_{o -> o}(F, X) because map > @_{o -> o}, [6] and [8], by (Copy) 6] map*(F, cons(X, Y)) >= F because [7], by (Select) 7] F >= F by (Meta) 8] map*(F, cons(X, Y)) >= X because [9], by (Select) 9] cons(X, Y) >= X because [10], by (Star) 10] cons*(X, Y) >= X because [11], by (Select) 11] X >= X by (Meta) 12] map*(F, cons(X, Y)) >= map(F, Y) because map in Mul, [13] and [14], by (Stat) 13] F >= F by (Meta) 14] cons(X, Y) > Y because [15], by definition 15] cons*(X, Y) >= Y because [16], by (Select) 16] Y >= Y by (Meta) 17] @_{o -> o}(comp(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because [18], by (Star) 18] @_{o -> o}*(comp(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because [19], by (Select) 19] comp(F, G) @_{o -> o}*(comp(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because [20] 20] comp*(F, G, @_{o -> o}*(comp(F, G), X)) >= @_{o -> o}(F, @_{o -> o}(G, X)) because comp > @_{o -> o}, [21] and [23], by (Copy) 21] comp*(F, G, @_{o -> o}*(comp(F, G), X)) >= F because [22], by (Select) 22] F >= F by (Meta) 23] comp*(F, G, @_{o -> o}*(comp(F, G), X)) >= @_{o -> o}(G, X) because comp > @_{o -> o}, [24] and [26], by (Copy) 24] comp*(F, G, @_{o -> o}*(comp(F, G), X)) >= G because [25], by (Select) 25] G >= G by (Meta) 26] comp*(F, G, @_{o -> o}*(comp(F, G), X)) >= X because [27], by (Select) 27] @_{o -> o}*(comp(F, G), X) >= X because [28], by (Select) 28] X >= X by (Meta) 29] twice(F) >= comp(F, F) because [30], by (Star) 30] twice*(F) >= comp(F, F) because twice > comp, [31] and [31], by (Copy) 31] twice*(F) >= F because [32], by (Select) 32] F >= F by (Meta) We can thus remove the following rules: map(F, nil) => nil We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): map(F, cons(X, Y)) >? cons(F X, map(F, Y)) comp(F, G) X >? F (G X) twice(F) >? comp(F, F) We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[map(x_1, x_2)]] = map(x_2, x_1) We choose Lex = {cons, map} and Mul = {@_{o -> o}, comp, twice}, and the following precedence: map > cons > twice > comp > @_{o -> o} Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: map(F, cons(X, Y)) > cons(@_{o -> o}(F, X), map(F, Y)) @_{o -> o}(comp(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) twice(F) > comp(F, F) With these choices, we have: 1] map(F, cons(X, Y)) > cons(@_{o -> o}(F, X), map(F, Y)) because [2], by definition 2] map*(F, cons(X, Y)) >= cons(@_{o -> o}(F, X), map(F, Y)) because map > cons, [3] and [10], by (Copy) 3] map*(F, cons(X, Y)) >= @_{o -> o}(F, X) because map > @_{o -> o}, [4] and [6], by (Copy) 4] map*(F, cons(X, Y)) >= F because [5], by (Select) 5] F >= F by (Meta) 6] map*(F, cons(X, Y)) >= X because [7], by (Select) 7] cons(X, Y) >= X because [8], by (Star) 8] cons*(X, Y) >= X because [9], by (Select) 9] X >= X by (Meta) 10] map*(F, cons(X, Y)) >= map(F, Y) because [11], [4], [14], [16] and [11], by (Stat) 11] cons(X, Y) > Y because [12], by definition 12] cons*(X, Y) >= Y because [13], by (Select) 13] Y >= Y by (Meta) 14] map*(F, cons(X, Y)) >= Y because [15], by (Select) 15] cons(X, Y) >= Y because [12], by (Star) 16] F >= F by (Meta) 17] @_{o -> o}(comp(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because [18], by (Star) 18] @_{o -> o}*(comp(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because [19], by (Select) 19] comp(F, G) @_{o -> o}*(comp(F, G), X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because [20] 20] comp*(F, G, @_{o -> o}*(comp(F, G), X)) >= @_{o -> o}(F, @_{o -> o}(G, X)) because comp > @_{o -> o}, [21] and [23], by (Copy) 21] comp*(F, G, @_{o -> o}*(comp(F, G), X)) >= F because [22], by (Select) 22] F >= F by (Meta) 23] comp*(F, G, @_{o -> o}*(comp(F, G), X)) >= @_{o -> o}(G, X) because comp > @_{o -> o}, [24] and [26], by (Copy) 24] comp*(F, G, @_{o -> o}*(comp(F, G), X)) >= G because [25], by (Select) 25] G >= G by (Meta) 26] comp*(F, G, @_{o -> o}*(comp(F, G), X)) >= X because [27], by (Select) 27] @_{o -> o}*(comp(F, G), X) >= X because [28], by (Select) 28] X >= X by (Meta) 29] twice(F) > comp(F, F) because [30], by definition 30] twice*(F) >= comp(F, F) because twice > comp, [31] and [31], by (Copy) 31] twice*(F) >= F because [32], by (Select) 32] F >= F by (Meta) We can thus remove the following rules: map(F, cons(X, Y)) => cons(F X, map(F, Y)) twice(F) => comp(F, F) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): comp(F, G, X) >? F (G X) We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[comp(x_1, x_2, x_3)]] = comp(x_2, x_3, x_1) We choose Lex = {comp} and Mul = {@_{o -> o}}, and the following precedence: comp > @_{o -> o} Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: comp(F, G, X) > @_{o -> o}(F, @_{o -> o}(G, X)) With these choices, we have: 1] comp(F, G, X) > @_{o -> o}(F, @_{o -> o}(G, X)) because [2], by definition 2] comp*(F, G, X) >= @_{o -> o}(F, @_{o -> o}(G, X)) because comp > @_{o -> o}, [3] and [5], by (Copy) 3] comp*(F, G, X) >= F because [4], by (Select) 4] F >= F by (Meta) 5] comp*(F, G, X) >= @_{o -> o}(G, X) because comp > @_{o -> o}, [6] and [8], by (Copy) 6] comp*(F, G, X) >= G because [7], by (Select) 7] G >= G by (Meta) 8] comp*(F, G, X) >= X because [9], by (Select) 9] X >= X by (Meta) We can thus remove the following rules: comp(F, G, X) => F (G X) 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. +++ Citations +++ [Kop12] C. Kop. Higher Order Termination. PhD Thesis, 2012.