We consider the system AotoYamada_05__027. Alphabet: 0 : [] --> a cons : [a * b] --> b inc : [b] --> b map : [a -> a * b] --> b nil : [] --> b plus : [a] --> a -> a s : [a] --> a Rules: plus(0) x => x plus(s(x)) y => s(plus(x) y) inc(x) => map(plus(s(0)), x) map(f, nil) => nil map(f, cons(x, y)) => cons(f x, map(f, y)) 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]): plus(0) X >? X plus(s(X)) Y >? s(plus(X) Y) inc(X) >? map(plus(s(0)), X) map(F, nil) >? nil map(F, cons(X, Y)) >? cons(F X, map(F, Y)) We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[0]] = _|_ [[nil]] = _|_ We choose Lex = {} and Mul = {@_{o -> o}, cons, inc, map, plus, s}, and the following precedence: inc > map > cons > plus > @_{o -> o} > s Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: @_{o -> o}(plus(_|_), X) >= X @_{o -> o}(plus(s(X)), Y) >= s(@_{o -> o}(plus(X), Y)) inc(X) >= map(plus(s(_|_)), X) map(F, _|_) >= _|_ map(F, cons(X, Y)) > cons(@_{o -> o}(F, X), map(F, Y)) With these choices, we have: 1] @_{o -> o}(plus(_|_), X) >= X because [2], by (Star) 2] @_{o -> o}*(plus(_|_), X) >= X because [3], by (Select) 3] X >= X by (Meta) 4] @_{o -> o}(plus(s(X)), Y) >= s(@_{o -> o}(plus(X), Y)) because [5], by (Star) 5] @_{o -> o}*(plus(s(X)), Y) >= s(@_{o -> o}(plus(X), Y)) because @_{o -> o} > s and [6], by (Copy) 6] @_{o -> o}*(plus(s(X)), Y) >= @_{o -> o}(plus(X), Y) because [7], by (Select) 7] plus(s(X)) @_{o -> o}*(plus(s(X)), Y) >= @_{o -> o}(plus(X), Y) because [8] 8] plus*(s(X), @_{o -> o}*(plus(s(X)), Y)) >= @_{o -> o}(plus(X), Y) because plus > @_{o -> o}, [9] and [13], by (Copy) 9] plus*(s(X), @_{o -> o}*(plus(s(X)), Y)) >= plus(X) because plus in Mul and [10], by (Stat) 10] s(X) > X because [11], by definition 11] s*(X) >= X because [12], by (Select) 12] X >= X by (Meta) 13] plus*(s(X), @_{o -> o}*(plus(s(X)), Y)) >= Y because [14], by (Select) 14] @_{o -> o}*(plus(s(X)), Y) >= Y because [15], by (Select) 15] Y >= Y by (Meta) 16] inc(X) >= map(plus(s(_|_)), X) because [17], by (Star) 17] inc*(X) >= map(plus(s(_|_)), X) because inc > map, [18] and [21], by (Copy) 18] inc*(X) >= plus(s(_|_)) because inc > plus and [19], by (Copy) 19] inc*(X) >= s(_|_) because inc > s and [20], by (Copy) 20] inc*(X) >= _|_ by (Bot) 21] inc*(X) >= X because [22], by (Select) 22] X >= X by (Meta) 23] map(F, _|_) >= _|_ by (Bot) 24] map(F, cons(X, Y)) > cons(@_{o -> o}(F, X), map(F, Y)) because [25], by definition 25] map*(F, cons(X, Y)) >= cons(@_{o -> o}(F, X), map(F, Y)) because map > cons, [26] and [33], by (Copy) 26] map*(F, cons(X, Y)) >= @_{o -> o}(F, X) because map > @_{o -> o}, [27] and [29], by (Copy) 27] map*(F, cons(X, Y)) >= F because [28], by (Select) 28] F >= F by (Meta) 29] map*(F, cons(X, Y)) >= X because [30], by (Select) 30] cons(X, Y) >= X because [31], by (Star) 31] cons*(X, Y) >= X because [32], by (Select) 32] X >= X by (Meta) 33] map*(F, cons(X, Y)) >= map(F, Y) because map in Mul, [34] and [35], by (Stat) 34] F >= F by (Meta) 35] cons(X, Y) > Y because [36], by definition 36] cons*(X, Y) >= Y because [37], by (Select) 37] Y >= Y by (Meta) We can thus remove the following rules: map(F, cons(X, Y)) => cons(F X, map(F, Y)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): plus(0) X >? X plus(s(X)) Y >? s(plus(X) Y) inc(X) >? map(plus(s(0)), X) map(F, nil) >? nil We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[0]] = _|_ [[s(x_1)]] = x_1 We choose Lex = {} and Mul = {@_{o -> o}, inc, map, nil, plus}, and the following precedence: inc > plus > map > @_{o -> o} > nil Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: @_{o -> o}(plus(_|_), X) > X @_{o -> o}(plus(X), Y) >= @_{o -> o}(plus(X), Y) inc(X) >= map(plus(_|_), X) map(F, nil) > nil With these choices, we have: 1] @_{o -> o}(plus(_|_), X) > X because [2], by definition 2] @_{o -> o}*(plus(_|_), X) >= X because [3], by (Select) 3] X >= X by (Meta) 4] @_{o -> o}(plus(X), Y) >= @_{o -> o}(plus(X), Y) because @_{o -> o} in Mul, [5] and [7], by (Fun) 5] plus(X) >= plus(X) because plus in Mul and [6], by (Fun) 6] X >= X by (Meta) 7] Y >= Y by (Meta) 8] inc(X) >= map(plus(_|_), X) because [9], by (Star) 9] inc*(X) >= map(plus(_|_), X) because inc > map, [10] and [12], by (Copy) 10] inc*(X) >= plus(_|_) because inc > plus and [11], by (Copy) 11] inc*(X) >= _|_ by (Bot) 12] inc*(X) >= X because [13], by (Select) 13] X >= X by (Meta) 14] map(F, nil) > nil because [15], by definition 15] map*(F, nil) >= nil because [16], by (Select) 16] nil >= nil by (Fun) We can thus remove the following rules: plus(0) X => X 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]): plus(s(X)) Y >? s(plus(X) Y) inc(X) >? map(plus(s(0)), X) We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[0]] = _|_ We choose Lex = {} and Mul = {@_{o -> o}, inc, map, plus, s}, and the following precedence: inc > plus > s > map > @_{o -> o} Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: @_{o -> o}(plus(s(X)), Y) >= s(@_{o -> o}(plus(X), Y)) inc(X) > map(plus(s(_|_)), X) With these choices, we have: 1] @_{o -> o}(plus(s(X)), Y) >= s(@_{o -> o}(plus(X), Y)) because [2], by (Star) 2] @_{o -> o}*(plus(s(X)), Y) >= s(@_{o -> o}(plus(X), Y)) because [3], by (Select) 3] plus(s(X)) @_{o -> o}*(plus(s(X)), Y) >= s(@_{o -> o}(plus(X), Y)) because [4] 4] plus*(s(X), @_{o -> o}*(plus(s(X)), Y)) >= s(@_{o -> o}(plus(X), Y)) because plus > s and [5], by (Copy) 5] plus*(s(X), @_{o -> o}*(plus(s(X)), Y)) >= @_{o -> o}(plus(X), Y) because plus > @_{o -> o}, [6] and [10], by (Copy) 6] plus*(s(X), @_{o -> o}*(plus(s(X)), Y)) >= plus(X) because plus in Mul and [7], by (Stat) 7] s(X) > X because [8], by definition 8] s*(X) >= X because [9], by (Select) 9] X >= X by (Meta) 10] plus*(s(X), @_{o -> o}*(plus(s(X)), Y)) >= Y because [11], by (Select) 11] @_{o -> o}*(plus(s(X)), Y) >= Y because [12], by (Select) 12] Y >= Y by (Meta) 13] inc(X) > map(plus(s(_|_)), X) because [14], by definition 14] inc*(X) >= map(plus(s(_|_)), X) because inc > map, [15] and [18], by (Copy) 15] inc*(X) >= plus(s(_|_)) because inc > plus and [16], by (Copy) 16] inc*(X) >= s(_|_) because inc > s and [17], by (Copy) 17] inc*(X) >= _|_ by (Bot) 18] inc*(X) >= X because [19], by (Select) 19] X >= X by (Meta) We can thus remove the following rules: inc(X) => map(plus(s(0)), X) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): plus(s(X), Y) >? s(plus(X, Y)) We use a recursive path ordering as defined in [Kop12, Chapter 5]. We choose Lex = {} and Mul = {plus, s}, and the following precedence: plus > s With these choices, we have: 1] plus(s(X), Y) > s(plus(X, Y)) because [2], by definition 2] plus*(s(X), Y) >= s(plus(X, Y)) because plus > s and [3], by (Copy) 3] plus*(s(X), Y) >= plus(X, Y) because plus in Mul, [4] and [7], by (Stat) 4] s(X) > X because [5], by definition 5] s*(X) >= X because [6], by (Select) 6] X >= X by (Meta) 7] Y >= Y by (Meta) We can thus remove the following rules: plus(s(X), Y) => s(plus(X, Y)) 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.