We consider the system h13. Alphabet: 0 : [] --> a rec : [a -> b -> b * b * a] --> b s : [a] --> a xap : [a -> b -> b * a] --> b -> b yap : [b -> b * b] --> b Rules: rec(/\x./\y.yap(xap(f, x), y), z, 0) => z rec(/\x./\y.yap(xap(f, x), y), z, s(u)) => yap(xap(f, s(u)), rec(/\v./\w.yap(xap(f, v), w), z, u)) xap(f, x) => f x yap(f, x) => f x This AFS is converted to an AFSM simply by replacing all free variables by meta-variables (with arity 0). Symbol xap is an encoding for application that is only used in innocuous ways. We can simplify the program (without losing non-termination) by removing it. This gives: Alphabet: 0 : [] --> a rec : [a -> b -> b * b * a] --> b s : [a] --> a yap : [b -> b * b] --> b Rules: rec(/\x./\y.yap(F(x), y), X, 0) => X rec(/\x./\y.yap(F(x), y), X, s(Y)) => yap(F(s(Y)), rec(/\z./\u.yap(F(z), u), X, Y)) yap(F, X) => F 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]): rec(/\x./\y.yap(F(x), y), X, 0) >? X rec(/\x./\y.yap(F(x), y), X, s(Y)) >? yap(F(s(Y)), rec(/\z./\u.yap(F(z), u), X, Y)) yap(F, X) >? F X We use a recursive path ordering as defined in [Kop12, Chapter 5]. We choose Lex = {} and Mul = {0, @_{o -> o}, rec, s, yap}, and the following precedence: s > rec > 0 > yap > @_{o -> o} With these choices, we have: 1] rec(/\x./\y.yap(F(x), y), X, 0) > X because [2], by definition 2] rec*(/\x./\y.yap(F(x), y), X, 0) >= X because [3], by (Select) 3] X >= X by (Meta) 4] rec(/\x./\y.yap(F(x), y), X, s(Y)) >= yap(F(s(Y)), rec(/\x./\y.yap(F(x), y), X, Y)) because [5], by (Star) 5] rec*(/\x./\y.yap(F(x), y), X, s(Y)) >= yap(F(s(Y)), rec(/\x./\y.yap(F(x), y), X, Y)) because [6], by (Select) 6] yap(F(rec*(/\x./\y.yap(F(x), y), X, s(Y))), rec*(/\z./\u.yap(F(z), u), X, s(Y))) >= yap(F(s(Y)), rec(/\x./\y.yap(F(x), y), X, Y)) because yap in Mul, [7] and [11], by (Fun) 7] F(rec*(/\x./\y.yap(F(x), y), X, s(Y))) >= F(s(Y)) because [8], by (Meta) 8] rec*(/\x./\y.yap(F(x), y), X, s(Y)) >= s(Y) because [9], by (Select) 9] s(Y) >= s(Y) because s in Mul and [10], by (Fun) 10] Y >= Y by (Meta) 11] rec*(/\x./\y.yap(F(x), y), X, s(Y)) >= rec(/\x./\y.yap(F(x), y), X, Y) because rec in Mul, [12], [18] and [19], by (Stat) 12] /\x./\z.yap(F(x), z) >= /\x./\z.yap(F(x), z) because [13], by (Abs) 13] /\z.yap(F(y), z) >= /\z.yap(F(y), z) because [14], by (Abs) 14] yap(F(y), x) >= yap(F(y), x) because yap in Mul, [15] and [17], by (Fun) 15] F(y) >= F(y) because [16], by (Meta) 16] y >= y by (Var) 17] x >= x by (Var) 18] X >= X by (Meta) 19] s(Y) > Y because [20], by definition 20] s*(Y) >= Y because [10], by (Select) 21] yap(F, X) > @_{o -> o}(F, X) because [22], by definition 22] yap*(F, X) >= @_{o -> o}(F, X) because yap > @_{o -> o}, [23] and [25], by (Copy) 23] yap*(F, X) >= F because [24], by (Select) 24] F >= F by (Meta) 25] yap*(F, X) >= X because [26], by (Select) 26] X >= X by (Meta) We can thus remove the following rules: rec(/\x./\y.yap(F(x), y), X, 0) => X yap(F, X) => F 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]): rec(/\x./\y.yap(F(x), y), X, s(Y)) >? yap(F(s(Y)), rec(/\z./\u.yap(F(z), u), X, Y)) We use a recursive path ordering as defined in [Kop12, Chapter 5]. We choose Lex = {} and Mul = {rec, s, yap}, and the following precedence: rec > s > yap With these choices, we have: 1] rec(/\x./\y.yap(F(x), y), X, s(Y)) > yap(F(s(Y)), rec(/\x./\y.yap(F(x), y), X, Y)) because [2], by definition 2] rec*(/\x./\y.yap(F(x), y), X, s(Y)) >= yap(F(s(Y)), rec(/\x./\y.yap(F(x), y), X, Y)) because rec > yap, [3] and [11], by (Copy) 3] rec*(/\x./\y.yap(F(x), y), X, s(Y)) >= F(s(Y)) because [4], by (Select) 4] /\x.yap(F(rec*(/\y./\z.yap(F(y), z), X, s(Y))), x) >= F(s(Y)) because [5], by (Eta)[Kop13:2] 5] F(rec*(/\x./\y.yap(F(x), y), X, s(Y))) >= F(s(Y)) because [6], by (Meta) 6] rec*(/\x./\y.yap(F(x), y), X, s(Y)) >= s(Y) because rec > s and [7], by (Copy) 7] rec*(/\x./\y.yap(F(x), y), X, s(Y)) >= Y because [8], by (Select) 8] s(Y) >= Y because [9], by (Star) 9] s*(Y) >= Y because [10], by (Select) 10] Y >= Y by (Meta) 11] rec*(/\x./\y.yap(F(x), y), X, s(Y)) >= rec(/\x./\y.yap(F(x), y), X, Y) because rec in Mul, [12], [18] and [19], by (Stat) 12] /\x./\z.yap(F(x), z) >= /\x./\z.yap(F(x), z) because [13], by (Abs) 13] /\z.yap(F(y), z) >= /\z.yap(F(y), z) because [14], by (Abs) 14] yap(F(y), x) >= yap(F(y), x) because yap in Mul, [15] and [17], by (Fun) 15] F(y) >= F(y) because [16], by (Meta) 16] y >= y by (Var) 17] x >= x by (Var) 18] X >= X by (Meta) 19] s(Y) > Y because [20], by definition 20] s*(Y) >= Y because [10], by (Select) We can thus remove the following rules: rec(/\x./\y.yap(F(x), y), X, s(Y)) => yap(F(s(Y)), rec(/\z./\u.yap(F(z), u), 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. [Kop13:2] C. Kop. StarHorpo with an Eta-Rule. Unpublished manuscript, http://cl-informatik.uibk.ac.at/users/kop/etahorpo.pdf, 2013.