We consider the system 02Ackermann. Alphabet: ack : [N * N] --> N s : [N] --> N z : [] --> N Rules: ack(z, x) => s(x) ack(s(x), z) => ack(x, s(z)) ack(s(x), s(y)) => ack(x, ack(s(x), 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]): ack(z, X) >? s(X) ack(s(X), z) >? ack(X, s(z)) ack(s(X), s(Y)) >? ack(X, ack(s(X), Y)) We use a recursive path ordering as defined in [Kop12, Chapter 5]. We choose Lex = {ack} and Mul = {s, z}, and the following precedence: z > ack > s With these choices, we have: 1] ack(z, X) >= s(X) because [2], by (Star) 2] ack*(z, X) >= s(X) because ack > s and [3], by (Copy) 3] ack*(z, X) >= X because [4], by (Select) 4] X >= X by (Meta) 5] ack(s(X), z) > ack(X, s(z)) because [6], by definition 6] ack*(s(X), z) >= ack(X, s(z)) because [7], [10] and [12], by (Stat) 7] s(X) > X because [8], by definition 8] s*(X) >= X because [9], by (Select) 9] X >= X by (Meta) 10] ack*(s(X), z) >= X because [11], by (Select) 11] s(X) >= X because [8], by (Star) 12] ack*(s(X), z) >= s(z) because ack > s and [13], by (Copy) 13] ack*(s(X), z) >= z because [14], by (Select) 14] z >= z by (Fun) 15] ack(s(X), s(Y)) >= ack(X, ack(s(X), Y)) because [16], by (Star) 16] ack*(s(X), s(Y)) >= ack(X, ack(s(X), Y)) because [17], [20] and [22], by (Stat) 17] s(X) > X because [18], by definition 18] s*(X) >= X because [19], by (Select) 19] X >= X by (Meta) 20] ack*(s(X), s(Y)) >= X because [21], by (Select) 21] s(X) >= X because [18], by (Star) 22] ack*(s(X), s(Y)) >= ack(s(X), Y) because [23], [25], [28] and [29], by (Stat) 23] s(X) >= s(X) because s in Mul and [24], by (Fun) 24] X >= X by (Meta) 25] s(Y) > Y because [26], by definition 26] s*(Y) >= Y because [27], by (Select) 27] Y >= Y by (Meta) 28] ack*(s(X), s(Y)) >= s(X) because [23], by (Select) 29] ack*(s(X), s(Y)) >= Y because [30], by (Select) 30] s(Y) >= Y because [26], by (Star) We can thus remove the following rules: ack(s(X), z) => ack(X, s(z)) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): ack(z, X) >? s(X) ack(s(X), s(Y)) >? ack(X, ack(s(X), Y)) We use a recursive path ordering as defined in [Kop12, Chapter 5]. We choose Lex = {ack, s, z} and Mul = {}, and the following precedence: ack > s > z With these choices, we have: 1] ack(z, X) > s(X) because [2], by definition 2] ack*(z, X) >= s(X) because ack > s and [3], by (Copy) 3] ack*(z, X) >= X because [4], by (Select) 4] X >= X by (Meta) 5] ack(s(X), s(Y)) >= ack(X, ack(s(X), Y)) because [6], by (Star) 6] ack*(s(X), s(Y)) >= ack(X, ack(s(X), Y)) because [7], [10] and [12], by (Stat) 7] s(X) > X because [8], by definition 8] s*(X) >= X because [9], by (Select) 9] X >= X by (Meta) 10] ack*(s(X), s(Y)) >= X because [11], by (Select) 11] s(X) >= X because [8], by (Star) 12] ack*(s(X), s(Y)) >= ack(s(X), Y) because [13], [15], [18] and [19], by (Stat) 13] s(X) >= s(X) because [14], by (Fun) 14] X >= X by (Meta) 15] s(Y) > Y because [16], by definition 16] s*(Y) >= Y because [17], by (Select) 17] Y >= Y by (Meta) 18] ack*(s(X), s(Y)) >= s(X) because [13], by (Select) 19] ack*(s(X), s(Y)) >= Y because [20], by (Select) 20] s(Y) >= Y because [16], by (Star) We can thus remove the following rules: ack(z, X) => s(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]): ack(s(X), s(Y)) >? ack(X, ack(s(X), Y)) We use a recursive path ordering as defined in [Kop12, Chapter 5]. We choose Lex = {ack, s} and Mul = {}, and the following precedence: ack = s With these choices, we have: 1] ack(s(X), s(Y)) > ack(X, ack(s(X), Y)) because [2], by definition 2] ack*(s(X), s(Y)) >= ack(X, ack(s(X), Y)) because [3], [6] and [8], by (Stat) 3] s(X) > X because [4], by definition 4] s*(X) >= X because [5], by (Select) 5] X >= X by (Meta) 6] ack*(s(X), s(Y)) >= X because [7], by (Select) 7] s(X) >= X because [4], by (Star) 8] ack*(s(X), s(Y)) >= ack(s(X), Y) because [9], [11], [14] and [15], by (Stat) 9] s(X) >= s(X) because [10], by (Fun) 10] X >= X by (Meta) 11] s(Y) > Y because [12], by definition 12] s*(Y) >= Y because [13], by (Select) 13] Y >= Y by (Meta) 14] ack*(s(X), s(Y)) >= s(X) because [9], by (Select) 15] ack*(s(X), s(Y)) >= Y because [16], by (Select) 16] s(Y) >= Y because [12], by (Star) We can thus remove the following rules: ack(s(X), s(Y)) => ack(X, ack(s(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.