We consider the system map. Alphabet: cons : [a * list] --> list map : [list * a -> a] --> list nil : [] --> list Rules: map(nil, f) => nil map(cons(x, y), f) => cons(f x, map(y, 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(nil, F) >? nil map(cons(X, Y), F) >? cons(F X, map(Y, F)) We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[nil]] = _|_ We choose Lex = {} and Mul = {@_{o -> o}, cons, map}, and the following precedence: map > @_{o -> o} > cons Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: map(_|_, F) > _|_ map(cons(X, Y), F) >= cons(@_{o -> o}(F, X), map(Y, F)) With these choices, we have: 1] map(_|_, F) > _|_ because [2], by definition 2] map*(_|_, F) >= _|_ by (Bot) 3] map(cons(X, Y), F) >= cons(@_{o -> o}(F, X), map(Y, F)) because [4], by (Star) 4] map*(cons(X, Y), F) >= cons(@_{o -> o}(F, X), map(Y, F)) because map > cons, [5] and [12], by (Copy) 5] map*(cons(X, Y), F) >= @_{o -> o}(F, X) because map > @_{o -> o}, [6] and [8], by (Copy) 6] map*(cons(X, Y), F) >= F because [7], by (Select) 7] F >= F by (Meta) 8] map*(cons(X, Y), F) >= 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*(cons(X, Y), F) >= map(Y, F) because map in Mul, [13] and [16], by (Stat) 13] cons(X, Y) > Y because [14], by definition 14] cons*(X, Y) >= Y because [15], by (Select) 15] Y >= Y by (Meta) 16] F >= F by (Meta) We can thus remove the following rules: map(nil, F) => 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(cons(X, Y), F) >? cons(F X, map(Y, F)) We use a recursive path ordering as defined in [Kop12, Chapter 5]. We choose Lex = {} and Mul = {@_{o -> o}, cons, map}, and the following precedence: map > cons > @_{o -> o} With these choices, we have: 1] map(cons(X, Y), F) > cons(@_{o -> o}(F, X), map(Y, F)) because [2], by definition 2] map*(cons(X, Y), F) >= cons(@_{o -> o}(F, X), map(Y, F)) because map > cons, [3] and [10], by (Copy) 3] map*(cons(X, Y), F) >= @_{o -> o}(F, X) because map > @_{o -> o}, [4] and [6], by (Copy) 4] map*(cons(X, Y), F) >= F because [5], by (Select) 5] F >= F by (Meta) 6] map*(cons(X, Y), F) >= 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*(cons(X, Y), F) >= map(Y, F) because map in Mul, [11] and [14], 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] F >= F by (Meta) We can thus remove the following rules: map(cons(X, Y), F) => cons(F X, map(Y, F)) 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.