We consider the system h62. Alphabet: app : [list * list] --> list cons : [nat * list] --> list foldl : [list -> nat -> list * list * list] --> list iconsc : [] --> list -> nat -> list nil : [] --> list reverse : [list] --> list reverse1 : [list] --> list xap : [list -> nat -> list * list] --> nat -> list yap : [nat -> list * nat] --> list Rules: app(nil, x) => x app(cons(x, y), z) => cons(x, app(y, z)) foldl(/\x./\y.yap(xap(f, x), y), z, nil) => z foldl(/\x./\y.yap(xap(f, x), y), z, cons(u, v)) => foldl(/\w./\x'.yap(xap(f, w), x'), yap(xap(f, z), u), v) iconsc x y => cons(y, x) reverse(x) => foldl(/\y./\z.yap(xap(iconsc, y), z), nil, x) reverse1(x) => foldl(/\y./\z.app(cons(z, nil), y), nil, x) 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: app : [list * list] --> list cons : [nat * list] --> list foldl : [list -> nat -> list * list * list] --> list iconsc : [list] --> nat -> list nil : [] --> list reverse : [list] --> list reverse1 : [list] --> list yap : [nat -> list * nat] --> list Rules: app(nil, X) => X app(cons(X, Y), Z) => cons(X, app(Y, Z)) foldl(/\x./\y.yap(F(x), y), X, nil) => X foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) => foldl(/\z./\u.yap(F(z), u), yap(F(X), Y), Z) iconsc(X) Y => cons(Y, X) reverse(X) => foldl(/\x./\y.yap(iconsc(x), y), nil, X) reverse1(X) => foldl(/\x./\y.app(cons(y, nil), x), nil, 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]): app(nil, X) >? X app(cons(X, Y), Z) >? cons(X, app(Y, Z)) foldl(/\x./\y.yap(F(x), y), X, nil) >? X foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >? foldl(/\z./\u.yap(F(z), u), yap(F(X), Y), Z) iconsc(X) Y >? cons(Y, X) reverse(X) >? foldl(/\x./\y.yap(iconsc(x), y), nil, X) reverse1(X) >? foldl(/\x./\y.app(cons(y, nil), x), nil, X) yap(F, X) >? F X We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[foldl(x_1, x_2, x_3)]] = foldl(x_3, x_1, x_2) [[nil]] = _|_ We choose Lex = {foldl} and Mul = {@_{o -> o}, app, cons, iconsc, reverse, reverse1, yap}, and the following precedence: reverse1 > reverse > foldl > @_{o -> o} = yap > app > cons > iconsc Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: app(_|_, X) > X app(cons(X, Y), Z) >= cons(X, app(Y, Z)) foldl(/\x./\y.yap(F(x), y), X, _|_) > X foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) @_{o -> o}(iconsc(X), Y) >= cons(Y, X) reverse(X) > foldl(/\x./\y.yap(iconsc(x), y), _|_, X) reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) yap(F, X) >= @_{o -> o}(F, X) With these choices, we have: 1] app(_|_, X) > X because [2], by definition 2] app*(_|_, X) >= X because [3], by (Select) 3] X >= X by (Meta) 4] app(cons(X, Y), Z) >= cons(X, app(Y, Z)) because [5], by (Star) 5] app*(cons(X, Y), Z) >= cons(X, app(Y, Z)) because app > cons, [6] and [10], by (Copy) 6] app*(cons(X, Y), Z) >= 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] app*(cons(X, Y), Z) >= app(Y, Z) because app 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] Z >= Z by (Meta) 15] foldl(/\x./\y.yap(F(x), y), X, _|_) > X because [16], by definition 16] foldl*(/\x./\y.yap(F(x), y), X, _|_) >= X because [17], by (Select) 17] X >= X by (Meta) 18] foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [19], by (Star) 19] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [20], by (Select) 20] yap(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [21], by (Star) 21] yap*(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [22], by (Select) 22] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [23], [26], [34] and [47], by (Stat) 23] cons(Y, Z) > Z because [24], by definition 24] cons*(Y, Z) >= Z because [25], by (Select) 25] Z >= Z by (Meta) 26] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= /\x./\y.yap(F(x), y) because [27], by (F-Abs) 27] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z) >= /\x.yap(F(z), x) because [28], by (Select) 28] /\x.yap(F(foldl*(/\y./\v.yap(F(y), v), X, cons(Y, Z), z)), x) >= /\x.yap(F(z), x) because [29], by (Abs) 29] yap(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z)), u) >= yap(F(z), u) because yap in Mul, [30] and [33], by (Fun) 30] F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z)) >= F(z) because [31], by (Meta) 31] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z) >= z because [32], by (Select) 32] z >= z by (Var) 33] u >= u by (Var) 34] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= yap(F(X), Y) because [35], by (Select) 35] yap(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\v./\w.yap(F(v), w), X, cons(Y, Z))) >= yap(F(X), Y) because [36], by (Star) 36] yap*(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\v./\w.yap(F(v), w), X, cons(Y, Z))) >= yap(F(X), Y) because [37], by (Select) 37] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= yap(F(X), Y) because foldl > yap, [38] and [43], by (Copy) 38] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= F(X) because [39], by (Select) 39] /\x.yap(F(foldl*(/\y./\v.yap(F(y), v), X, cons(Y, Z))), x) >= F(X) because [40], by (Eta)[Kop13:2] 40] F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))) >= F(X) because [41], by (Meta) 41] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= X because [42], by (Select) 42] X >= X by (Meta) 43] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Y because [44], by (Select) 44] cons(Y, Z) >= Y because [45], by (Star) 45] cons*(Y, Z) >= Y because [46], by (Select) 46] Y >= Y by (Meta) 47] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Z because [48], by (Select) 48] yap(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\v./\w.yap(F(v), w), X, cons(Y, Z))) >= Z because [49], by (Star) 49] yap*(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\v./\w.yap(F(v), w), X, cons(Y, Z))) >= Z because [50], by (Select) 50] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Z because [51], by (Select) 51] cons(Y, Z) >= Z because [24], by (Star) 52] @_{o -> o}(iconsc(X), Y) >= cons(Y, X) because [53], by (Star) 53] @_{o -> o}*(iconsc(X), Y) >= cons(Y, X) because @_{o -> o} > cons, [54] and [56], by (Copy) 54] @_{o -> o}*(iconsc(X), Y) >= Y because [55], by (Select) 55] Y >= Y by (Meta) 56] @_{o -> o}*(iconsc(X), Y) >= X because [57], by (Select) 57] iconsc(X) @_{o -> o}*(iconsc(X), Y) >= X because [58] 58] iconsc*(X, @_{o -> o}*(iconsc(X), Y)) >= X because [59], by (Select) 59] X >= X by (Meta) 60] reverse(X) > foldl(/\x./\y.yap(iconsc(x), y), _|_, X) because [61], by definition 61] reverse*(X) >= foldl(/\x./\y.yap(iconsc(x), y), _|_, X) because reverse > foldl, [62], [70] and [71], by (Copy) 62] reverse*(X) >= /\y./\z.yap(iconsc(y), z) because [63], by (F-Abs) 63] reverse*(X, x) >= /\z.yap(iconsc(x), z) because [64], by (F-Abs) 64] reverse*(X, x, y) >= yap(iconsc(x), y) because reverse > yap, [65] and [68], by (Copy) 65] reverse*(X, x, y) >= iconsc(x) because reverse > iconsc and [66], by (Copy) 66] reverse*(X, x, y) >= x because [67], by (Select) 67] x >= x by (Var) 68] reverse*(X, x, y) >= y because [69], by (Select) 69] y >= y by (Var) 70] reverse*(X) >= _|_ by (Bot) 71] reverse*(X) >= X because [72], by (Select) 72] X >= X by (Meta) 73] reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because [74], by (Star) 74] reverse1*(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because reverse1 > foldl, [75], [84] and [85], by (Copy) 75] reverse1*(X) >= /\y./\z.app(cons(z, _|_), y) because [76], by (F-Abs) 76] reverse1*(X, x) >= /\z.app(cons(z, _|_), x) because [77], by (F-Abs) 77] reverse1*(X, x, y) >= app(cons(y, _|_), x) because reverse1 > app, [78] and [82], by (Copy) 78] reverse1*(X, x, y) >= cons(y, _|_) because reverse1 > cons, [79] and [81], by (Copy) 79] reverse1*(X, x, y) >= y because [80], by (Select) 80] y >= y by (Var) 81] reverse1*(X, x, y) >= _|_ by (Bot) 82] reverse1*(X, x, y) >= x because [83], by (Select) 83] x >= x by (Var) 84] reverse1*(X) >= _|_ by (Bot) 85] reverse1*(X) >= X because [86], by (Select) 86] X >= X by (Meta) 87] yap(F, X) >= @_{o -> o}(F, X) because yap = @_{o -> o}, yap in Mul, [88] and [89], by (Fun) 88] F >= F by (Meta) 89] X >= X by (Meta) We can thus remove the following rules: app(nil, X) => X foldl(/\x./\y.yap(F(x), y), X, nil) => X reverse(X) => foldl(/\x./\y.yap(iconsc(x), y), nil, 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]): app(cons(X, Y), Z) >? cons(X, app(Y, Z)) foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >? foldl(/\z./\u.yap(F(z), u), yap(F(X), Y), Z) iconsc(X, Y) >? cons(Y, X) reverse1(X) >? foldl(/\x./\y.app(cons(y, nil), x), nil, X) yap(F, X) >? F X We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[foldl(x_1, x_2, x_3)]] = foldl(x_3, x_1, x_2) [[nil]] = _|_ We choose Lex = {foldl} and Mul = {@_{o -> o}, app, cons, iconsc, reverse1, yap}, and the following precedence: reverse1 > foldl > app > cons = iconsc > @_{o -> o} = yap Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: app(cons(X, Y), Z) >= cons(X, app(Y, Z)) foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) > foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) iconsc(X, Y) >= cons(Y, X) reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) yap(F, X) >= @_{o -> o}(F, X) With these choices, we have: 1] app(cons(X, Y), Z) >= cons(X, app(Y, Z)) because [2], by (Star) 2] app*(cons(X, Y), Z) >= cons(X, app(Y, Z)) because app > cons, [3] and [7], by (Copy) 3] app*(cons(X, Y), Z) >= X because [4], by (Select) 4] cons(X, Y) >= X because [5], by (Star) 5] cons*(X, Y) >= X because [6], by (Select) 6] X >= X by (Meta) 7] app*(cons(X, Y), Z) >= app(Y, Z) because app in Mul, [8] and [11], by (Stat) 8] cons(X, Y) > Y because [9], by definition 9] cons*(X, Y) >= Y because [10], by (Select) 10] Y >= Y by (Meta) 11] Z >= Z by (Meta) 12] foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) > foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [13], by definition 13] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [14], [17], [33] and [43], by (Stat) 14] cons(Y, Z) > Z because [15], by definition 15] cons*(Y, Z) >= Z because [16], by (Select) 16] Z >= Z by (Meta) 17] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= /\x./\y.yap(F(x), y) because [18], by (F-Abs) 18] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z) >= /\x.yap(F(z), x) because [19], by (F-Abs) 19] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u) >= yap(F(z), u) because foldl > yap, [20] and [31], by (Copy) 20] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u) >= F(z) because [21], by (Select) 21] /\x.yap(F(foldl*(/\y./\v.yap(F(y), v), X, cons(Y, Z), z, u)), x) >= F(z) because [22], by (Eta)[Kop13:2] 22] F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u)) >= F(z) because [23], by (Meta) 23] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u) >= z because [24], by (Select) 24] yap(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u)), foldl*(/\v./\w.yap(F(v), w), X, cons(Y, Z), z, u)) >= z because [25], by (Star) 25] yap*(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u)), foldl*(/\v./\w.yap(F(v), w), X, cons(Y, Z), z, u)) >= z because [26], by (Select) 26] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u) >= z because [27], by (Select) 27] yap(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u)), foldl*(/\v./\w.yap(F(v), w), X, cons(Y, Z), z, u)) >= z because [28], by (Star) 28] yap*(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u)), foldl*(/\v./\w.yap(F(v), w), X, cons(Y, Z), z, u)) >= z because [29], by (Select) 29] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u) >= z because [30], by (Select) 30] z >= z by (Var) 31] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z), z, u) >= u because [32], by (Select) 32] u >= u by (Var) 33] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= yap(F(X), Y) because foldl > yap, [34] and [39], by (Copy) 34] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= F(X) because [35], by (Select) 35] /\x.yap(F(foldl*(/\y./\v.yap(F(y), v), X, cons(Y, Z))), x) >= F(X) because [36], by (Eta)[Kop13:2] 36] F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))) >= F(X) because [37], by (Meta) 37] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= X because [38], by (Select) 38] X >= X by (Meta) 39] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Y because [40], by (Select) 40] cons(Y, Z) >= Y because [41], by (Star) 41] cons*(Y, Z) >= Y because [42], by (Select) 42] Y >= Y by (Meta) 43] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Z because [44], by (Select) 44] cons(Y, Z) >= Z because [15], by (Star) 45] iconsc(X, Y) >= cons(Y, X) because iconsc = cons, iconsc in Mul, [46] and [47], by (Fun) 46] X >= X by (Meta) 47] Y >= Y by (Meta) 48] reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because [49], by (Star) 49] reverse1*(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because reverse1 > foldl, [50], [59] and [60], by (Copy) 50] reverse1*(X) >= /\y./\z.app(cons(z, _|_), y) because [51], by (F-Abs) 51] reverse1*(X, x) >= /\z.app(cons(z, _|_), x) because [52], by (F-Abs) 52] reverse1*(X, x, y) >= app(cons(y, _|_), x) because reverse1 > app, [53] and [57], by (Copy) 53] reverse1*(X, x, y) >= cons(y, _|_) because reverse1 > cons, [54] and [56], by (Copy) 54] reverse1*(X, x, y) >= y because [55], by (Select) 55] y >= y by (Var) 56] reverse1*(X, x, y) >= _|_ by (Bot) 57] reverse1*(X, x, y) >= x because [58], by (Select) 58] x >= x by (Var) 59] reverse1*(X) >= _|_ by (Bot) 60] reverse1*(X) >= X because [61], by (Select) 61] X >= X by (Meta) 62] yap(F, X) >= @_{o -> o}(F, X) because yap = @_{o -> o}, yap in Mul, [63] and [64], by (Fun) 63] F >= F by (Meta) 64] X >= X by (Meta) We can thus remove the following rules: foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) => foldl(/\z./\u.yap(F(z), u), yap(F(X), Y), 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]): app(cons(X, Y), Z) >? cons(X, app(Y, Z)) iconsc(X, Y) >? cons(Y, X) reverse1(X) >? foldl(/\x./\y.app(cons(y, nil), x), nil, X) yap(F, X) >? F X We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[nil]] = _|_ We choose Lex = {} and Mul = {@_{o -> o}, app, cons, foldl, iconsc, reverse1, yap}, and the following precedence: yap > reverse1 > @_{o -> o} > foldl > app > cons = iconsc Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: app(cons(X, Y), Z) > cons(X, app(Y, Z)) iconsc(X, Y) >= cons(Y, X) reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) yap(F, X) > @_{o -> o}(F, X) With these choices, we have: 1] app(cons(X, Y), Z) > cons(X, app(Y, Z)) because [2], by definition 2] app*(cons(X, Y), Z) >= cons(X, app(Y, Z)) because app > cons, [3] and [7], by (Copy) 3] app*(cons(X, Y), Z) >= X because [4], by (Select) 4] cons(X, Y) >= X because [5], by (Star) 5] cons*(X, Y) >= X because [6], by (Select) 6] X >= X by (Meta) 7] app*(cons(X, Y), Z) >= app(Y, Z) because app in Mul, [8] and [11], by (Stat) 8] cons(X, Y) > Y because [9], by definition 9] cons*(X, Y) >= Y because [10], by (Select) 10] Y >= Y by (Meta) 11] Z >= Z by (Meta) 12] iconsc(X, Y) >= cons(Y, X) because iconsc = cons, iconsc in Mul, [13] and [14], by (Fun) 13] X >= X by (Meta) 14] Y >= Y by (Meta) 15] reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because [16], by (Star) 16] reverse1*(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because reverse1 > foldl, [17], [26] and [27], by (Copy) 17] reverse1*(X) >= /\y./\z.app(cons(z, _|_), y) because [18], by (F-Abs) 18] reverse1*(X, x) >= /\z.app(cons(z, _|_), x) because [19], by (F-Abs) 19] reverse1*(X, x, y) >= app(cons(y, _|_), x) because reverse1 > app, [20] and [24], by (Copy) 20] reverse1*(X, x, y) >= cons(y, _|_) because reverse1 > cons, [21] and [23], by (Copy) 21] reverse1*(X, x, y) >= y because [22], by (Select) 22] y >= y by (Var) 23] reverse1*(X, x, y) >= _|_ by (Bot) 24] reverse1*(X, x, y) >= x because [25], by (Select) 25] x >= x by (Var) 26] reverse1*(X) >= _|_ by (Bot) 27] reverse1*(X) >= X because [28], by (Select) 28] X >= X by (Meta) 29] yap(F, X) > @_{o -> o}(F, X) because [30], by definition 30] yap*(F, X) >= @_{o -> o}(F, X) because yap > @_{o -> o}, [31] and [33], by (Copy) 31] yap*(F, X) >= F because [32], by (Select) 32] F >= F by (Meta) 33] yap*(F, X) >= X because [34], by (Select) 34] X >= X by (Meta) We can thus remove the following rules: app(cons(X, Y), Z) => cons(X, app(Y, Z)) 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]): iconsc(X, Y) >? cons(Y, X) reverse1(X) >? foldl(/\x./\y.app(cons(y, nil), x), nil, X) We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[nil]] = _|_ We choose Lex = {} and Mul = {app, cons, foldl, iconsc, reverse1}, and the following precedence: reverse1 > app > iconsc > cons > foldl Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: iconsc(X, Y) > cons(Y, X) reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) With these choices, we have: 1] iconsc(X, Y) > cons(Y, X) because [2], by definition 2] iconsc*(X, Y) >= cons(Y, X) because iconsc > cons, [3] and [5], by (Copy) 3] iconsc*(X, Y) >= Y because [4], by (Select) 4] Y >= Y by (Meta) 5] iconsc*(X, Y) >= X because [6], by (Select) 6] X >= X by (Meta) 7] reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because [8], by (Star) 8] reverse1*(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because reverse1 > foldl, [9], [18] and [19], by (Copy) 9] reverse1*(X) >= /\y./\z.app(cons(z, _|_), y) because [10], by (F-Abs) 10] reverse1*(X, x) >= /\z.app(cons(z, _|_), x) because [11], by (F-Abs) 11] reverse1*(X, x, y) >= app(cons(y, _|_), x) because reverse1 > app, [12] and [16], by (Copy) 12] reverse1*(X, x, y) >= cons(y, _|_) because reverse1 > cons, [13] and [15], by (Copy) 13] reverse1*(X, x, y) >= y because [14], by (Select) 14] y >= y by (Var) 15] reverse1*(X, x, y) >= _|_ by (Bot) 16] reverse1*(X, x, y) >= x because [17], by (Select) 17] x >= x by (Var) 18] reverse1*(X) >= _|_ by (Bot) 19] reverse1*(X) >= X because [20], by (Select) 20] X >= X by (Meta) We can thus remove the following rules: iconsc(X, Y) => cons(Y, 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]): reverse1(X) >? foldl(/\x./\y.app(cons(y, nil), x), nil, X) We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[nil]] = _|_ We choose Lex = {} and Mul = {app, cons, foldl, reverse1}, and the following precedence: reverse1 > cons > app > foldl Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: reverse1(X) > foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) With these choices, we have: 1] reverse1(X) > foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because [2], by definition 2] reverse1*(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because reverse1 > foldl, [3], [12] and [13], by (Copy) 3] reverse1*(X) >= /\y./\z.app(cons(z, _|_), y) because [4], by (F-Abs) 4] reverse1*(X, x) >= /\z.app(cons(z, _|_), x) because [5], by (F-Abs) 5] reverse1*(X, x, y) >= app(cons(y, _|_), x) because reverse1 > app, [6] and [10], by (Copy) 6] reverse1*(X, x, y) >= cons(y, _|_) because reverse1 > cons, [7] and [9], by (Copy) 7] reverse1*(X, x, y) >= y because [8], by (Select) 8] y >= y by (Var) 9] reverse1*(X, x, y) >= _|_ by (Bot) 10] reverse1*(X, x, y) >= x because [11], by (Select) 11] x >= x by (Var) 12] reverse1*(X) >= _|_ by (Bot) 13] reverse1*(X) >= X because [14], by (Select) 14] X >= X by (Meta) We can thus remove the following rules: reverse1(X) => foldl(/\x./\y.app(cons(y, nil), x), nil, 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. [Kop13:2] C. Kop. StarHorpo with an Eta-Rule. Unpublished manuscript, http://cl-informatik.uibk.ac.at/users/kop/etahorpo.pdf, 2013.