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 observe that the rules contain a first-order subset: app(nil, X) => X app(cons(X, Y), Z) => cons(X, app(Y, Z)) iconsc(X) Y => cons(Y, X) Moreover, the system is finitely branching. Thus, by [Kop12, Thm. 7.55], we may omit all first-order dependency pairs from the dependency pair problem (DP(R), R) if this first-order part is Ce-terminating when seen as a many-sorted first-order TRS. According to the external first-order termination prover, this system is indeed Ce-terminating: || proof of resources/system.trs || # AProVE Commit ID: d84c10301d352dfd14de2104819581f4682260f5 fuhs 20130616 || || || Termination w.r.t. Q of the given QTRS could be proven: || || (0) QTRS || (1) QTRSRRRProof [EQUIVALENT] || (2) QTRS || (3) RisEmptyProof [EQUIVALENT] || (4) YES || || || ---------------------------------------- || || (0) || Obligation: || Q restricted rewrite system: || The TRS R consists of the following rules: || || app(nil, %X) -> %X || app(cons(%X, %Y), %Z) -> cons(%X, app(%Y, %Z)) || iconsc(%X, %Y) -> cons(%Y, %X) || ~PAIR(%X, %Y) -> %X || ~PAIR(%X, %Y) -> %Y || || Q is empty. || || ---------------------------------------- || || (1) QTRSRRRProof (EQUIVALENT) || Used ordering: || Polynomial interpretation [POLO]: || || POL(app(x_1, x_2)) = 2 + 2*x_1 + x_2 || POL(cons(x_1, x_2)) = 1 + x_1 + x_2 || POL(iconsc(x_1, x_2)) = 2 + 2*x_1 + 2*x_2 || POL(nil) = 1 || POL(~PAIR(x_1, x_2)) = 2 + x_1 + x_2 || With this ordering the following rules can be removed by the rule removal processor [LPAR04] because they are oriented strictly: || || app(nil, %X) -> %X || app(cons(%X, %Y), %Z) -> cons(%X, app(%Y, %Z)) || iconsc(%X, %Y) -> cons(%Y, %X) || ~PAIR(%X, %Y) -> %X || ~PAIR(%X, %Y) -> %Y || || || || || ---------------------------------------- || || (2) || Obligation: || Q restricted rewrite system: || R is empty. || Q is empty. || || ---------------------------------------- || || (3) RisEmptyProof (EQUIVALENT) || The TRS R is empty. Hence, termination is trivially proven. || ---------------------------------------- || || (4) || YES || We use the dependency pair framework as described in [Kop12, Ch. 6/7], with dynamic dependency pairs. After applying [Kop12, Thm. 7.22] to denote collapsing dependency pairs in an extended form, we thus obtain the following dependency pair problem (P_0, R_0, minimal, all): Dependency Pairs P_0: 0] foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> foldl#(/\z./\u.yap(F(z), u), yap(F(X), Y), Z) 1] foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> yap#(F(z), u) 2] foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> F(z) 3] foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> yap#(F(X), Y) 4] foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> F(X) 5] reverse#(X) =#> foldl#(/\x./\y.yap(iconsc(x), y), nil, X) 6] reverse#(X) =#> yap#(iconsc(x), y) 7] reverse#(X) =#> iconsc#(x) 8] reverse1#(X) =#> foldl#(/\x./\y.app(cons(y, nil), x), nil, X) 9] reverse1#(X) =#> app#(cons(x, nil), y) 10] yap#(F, X) =#> F(X) Rules R_0: 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 Thus, the original system is terminating if (P_0, R_0, minimal, all) is finite. We consider the dependency pair problem (P_0, R_0, minimal, all). We place the elements of P in a dependency graph approximation G (see e.g. [Kop12, Thm. 7.27, 7.29], as follows: * 0 : 0, 1, 2, 3, 4 * 1 : * 2 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 * 3 : 10 * 4 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 * 5 : 0, 1, 2, 3, 4 * 6 : * 7 : * 8 : 0, 1, 2, 3, 4 * 9 : * 10 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 This graph has the following strongly connected components: P_1: foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> foldl#(/\z./\u.yap(F(z), u), yap(F(X), Y), Z) foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> F(z) foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> yap#(F(X), Y) foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> F(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) By [Kop12, Thm. 7.31], we may replace any dependency pair problem (P_0, R_0, m, f) by (P_1, R_0, m, f). Thus, the original system is terminating if (P_1, R_0, minimal, all) is finite. We consider the dependency pair problem (P_1, R_0, minimal, all). We will use the reduction pair processor [Kop12, Thm. 7.16]. It suffices to find a standard reduction pair [Kop12, Def. 6.69]. Thus, we must orient: foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >? foldl#(/\z./\u.yap(F(z), u), yap(F(X), Y), Z) foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >? F(~c1) ~c0 foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >? yap#(F(X), Y) foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >? F(X) ~c2 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) 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 foldl(F, X, Y) >= foldl#(F, X, Y) reverse(X) >= reverse#(X) reverse1(X) >= reverse1#(X) yap(F, X) >= yap#(F, X) We apply [Kop12, Thm. 6.75] and use the following argument functions: pi( reverse1#(X) ) = #argfun-reverse1##(foldl#(/\x./\y.app(cons(y, nil), x), nil, X)) pi( reverse#(X) ) = #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), nil, X)) pi( yap#(F, X) ) = #argfun-yap##(F X) Since this representation is not advantageous for the higher-order recursive path ordering, we present the strict requirements in their unextended form, which is not problematic since for any F, s and substituion gamma: (F s)gamma beta-reduces to F(s)gamma.) We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[#argfun-reverse1##(x_1)]] = x_1 [[foldl(x_1, x_2, x_3)]] = foldl(x_3, x_1, x_2) [[foldl#(x_1, x_2, x_3)]] = foldl#(x_3, x_2, x_1) [[nil]] = _|_ [[reverse1#(x_1)]] = x_1 [[reverse#(x_1)]] = x_1 [[~c0]] = _|_ [[~c1]] = _|_ [[~c2]] = _|_ We choose Lex = {foldl, foldl#} and Mul = {#argfun-reverse##, #argfun-yap##, @_{o -> o}, app, cons, iconsc, reverse, reverse1, yap, yap#}, and the following precedence: reverse > #argfun-reverse## > reverse1 > app > iconsc > cons > foldl > foldl# > yap > yap# > @_{o -> o} > #argfun-yap## Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl#(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= @_{o -> o}(F(_|_), _|_) foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) > #argfun-yap##(@_{o -> o}(F(X), Y)) foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) > @_{o -> o}(F(X), _|_) #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X)) >= foldl#(/\x./\y.yap(iconsc(x), y), _|_, X) foldl#(/\x./\y.app(cons(y, _|_), x), _|_, X) >= foldl#(/\x./\y.app(cons(y, _|_), x), _|_, X) #argfun-yap##(@_{o -> o}(F, X)) >= @_{o -> o}(F, X) 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) foldl(F, X, Y) >= foldl#(F, X, Y) reverse(X) >= #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X)) reverse1(X) >= foldl#(/\x./\y.app(cons(y, _|_), x), _|_, X) yap(F, X) >= #argfun-yap##(@_{o -> o}(F, X)) With these choices, we have: 1] foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl#(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [2], by (Star) 2] foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl#(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [3], [6], [13] and [23], by (Stat) 3] cons(Y, Z) > Z because [4], by definition 4] cons*(Y, Z) >= Z because [5], by (Select) 5] Z >= Z by (Meta) 6] foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= /\x./\y.yap(F(x), y) because [7], by (Select) 7] /\x./\z.yap(F(x), z) >= /\x./\z.yap(F(x), z) because [8], by (Abs) 8] /\z.yap(F(y), z) >= /\z.yap(F(y), z) because [9], by (Abs) 9] yap(F(y), x) >= yap(F(y), x) because yap in Mul, [10] and [12], by (Fun) 10] F(y) >= F(y) because [11], by (Meta) 11] y >= y by (Var) 12] x >= x by (Var) 13] foldl#*(/\z./\u.yap(F(z), u), X, cons(Y, Z)) >= yap(F(X), Y) because foldl# > yap, [14] and [19], by (Copy) 14] foldl#*(/\z./\u.yap(F(z), u), X, cons(Y, Z)) >= F(X) because [15], by (Select) 15] /\z.yap(F(foldl#*(/\u./\v.yap(F(u), v), X, cons(Y, Z))), z) >= F(X) because [16], by (Eta)[Kop13:2] 16] F(foldl#*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= F(X) because [17], by (Meta) 17] foldl#*(/\z./\u.yap(F(z), u), X, cons(Y, Z)) >= X because [18], by (Select) 18] X >= X by (Meta) 19] foldl#*(/\z./\u.yap(F(z), u), X, cons(Y, Z)) >= Y because [20], by (Select) 20] cons(Y, Z) >= Y because [21], by (Star) 21] cons*(Y, Z) >= Y because [22], by (Select) 22] Y >= Y by (Meta) 23] foldl#*(/\z./\u.yap(F(z), u), X, cons(Y, Z)) >= Z because [24], by (Select) 24] cons(Y, Z) >= Z because [4], by (Star) 25] foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= @_{o -> o}(F(_|_), _|_) because [26], by (Star) 26] foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= @_{o -> o}(F(_|_), _|_) because foldl# > @_{o -> o}, [27] and [31], by (Copy) 27] foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= F(_|_) because [28], by (Select) 28] /\x.yap(F(foldl#*(/\y./\z.yap(F(y), z), X, cons(Y, Z))), x) >= F(_|_) because [29], by (Eta)[Kop13:2] 29] F(foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z))) >= F(_|_) because [30], by (Meta) 30] foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= _|_ by (Bot) 31] foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= _|_ by (Bot) 32] foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) > #argfun-yap##(@_{o -> o}(F(X), Y)) because [33], by definition 33] foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= #argfun-yap##(@_{o -> o}(F(X), Y)) because foldl# > #argfun-yap## and [34], by (Copy) 34] foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= @_{o -> o}(F(X), Y) because foldl# > @_{o -> o}, [14] and [19], by (Copy) 35] foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) > @_{o -> o}(F(X), _|_) because [36], by definition 36] foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= @_{o -> o}(F(X), _|_) because foldl# > @_{o -> o}, [14] and [37], by (Copy) 37] foldl#*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= _|_ by (Bot) 38] #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X)) >= foldl#(/\x./\y.yap(iconsc(x), y), _|_, X) because [39], by (Star) 39] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X)) >= foldl#(/\x./\y.yap(iconsc(x), y), _|_, X) because #argfun-reverse## > foldl#, [40], [48] and [49], by (Copy) 40] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X)) >= /\x./\y.yap(iconsc(x), y) because [41], by (F-Abs) 41] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X), z) >= /\x.yap(iconsc(z), x) because [42], by (F-Abs) 42] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X), z, u) >= yap(iconsc(z), u) because #argfun-reverse## > yap, [43] and [46], by (Copy) 43] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X), z, u) >= iconsc(z) because #argfun-reverse## > iconsc and [44], by (Copy) 44] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X), z, u) >= z because [45], by (Select) 45] z >= z by (Var) 46] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X), z, u) >= u because [47], by (Select) 47] u >= u by (Var) 48] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X)) >= _|_ by (Bot) 49] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X)) >= X because [50], by (Select) 50] foldl#(/\x./\y.yap(iconsc(x), y), _|_, X) >= X because [51], by (Star) 51] foldl#*(/\x./\y.yap(iconsc(x), y), _|_, X) >= X because [52], by (Select) 52] X >= X by (Meta) 53] foldl#(/\x./\y.app(cons(y, _|_), x), _|_, X) >= foldl#(/\x./\y.app(cons(y, _|_), x), _|_, X) because [54], [59] and [61], by (Fun) 54] /\x./\z.app(cons(z, _|_), x) >= /\x./\z.app(cons(z, _|_), x) because [55], by (Abs) 55] /\z.app(cons(z, _|_), y) >= /\z.app(cons(z, _|_), y) because [56], by (Abs) 56] app(cons(x, _|_), y) >= app(cons(x, _|_), y) because app in Mul, [57] and [60], by (Fun) 57] cons(x, _|_) >= cons(x, _|_) because cons in Mul, [58] and [59], by (Fun) 58] x >= x by (Var) 59] _|_ >= _|_ by (Bot) 60] y >= y by (Var) 61] X >= X by (Meta) 62] #argfun-yap##(@_{o -> o}(F, X)) >= @_{o -> o}(F, X) because [63], by (Star) 63] #argfun-yap##*(@_{o -> o}(F, X)) >= @_{o -> o}(F, X) because [64], by (Select) 64] @_{o -> o}(F, X) >= @_{o -> o}(F, X) because @_{o -> o} in Mul, [65] and [66], by (Fun) 65] F >= F by (Meta) 66] X >= X by (Meta) 67] app(_|_, X) >= X because [68], by (Star) 68] app*(_|_, X) >= X because [69], by (Select) 69] X >= X by (Meta) 70] app(cons(X, Y), Z) >= cons(X, app(Y, Z)) because [71], by (Star) 71] app*(cons(X, Y), Z) >= cons(X, app(Y, Z)) because app > cons, [72] and [76], by (Copy) 72] app*(cons(X, Y), Z) >= X because [73], by (Select) 73] cons(X, Y) >= X because [74], by (Star) 74] cons*(X, Y) >= X because [75], by (Select) 75] X >= X by (Meta) 76] app*(cons(X, Y), Z) >= app(Y, Z) because app in Mul, [77] and [80], by (Stat) 77] cons(X, Y) > Y because [78], by definition 78] cons*(X, Y) >= Y because [79], by (Select) 79] Y >= Y by (Meta) 80] Z >= Z by (Meta) 81] foldl(/\x./\y.yap(F(x), y), X, _|_) >= X because [82], by (Star) 82] foldl*(/\x./\y.yap(F(x), y), X, _|_) >= X because [83], by (Select) 83] X >= X by (Meta) 84] foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [85], by (Star) 85] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [3], [86], [87] and [93], by (Stat) 86] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= /\x./\y.yap(F(x), y) because [7], by (Select) 87] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= yap(F(X), Y) because foldl > yap, [88] and [92], by (Copy) 88] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= F(X) because [89], by (Select) 89] /\x.yap(F(foldl*(/\y./\z.yap(F(y), z), X, cons(Y, Z))), x) >= F(X) because [90], by (Eta)[Kop13:2] 90] F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))) >= F(X) because [91], by (Meta) 91] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= X because [18], by (Select) 92] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Y because [20], by (Select) 93] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Z because [94], by (Select) 94] yap(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= Z because [95], by (Star) 95] yap*(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= Z because [96], by (Select) 96] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Z because [97], by (Select) 97] yap(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= Z because [98], by (Star) 98] yap*(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= Z because [99], by (Select) 99] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Z because [100], by (Select) 100] cons(Y, Z) >= Z because [4], by (Star) 101] @_{o -> o}(iconsc(X), Y) >= cons(Y, X) because [102], by (Star) 102] @_{o -> o}*(iconsc(X), Y) >= cons(Y, X) because [103], by (Select) 103] iconsc(X) @_{o -> o}*(iconsc(X), Y) >= cons(Y, X) because [104] 104] iconsc*(X, @_{o -> o}*(iconsc(X), Y)) >= cons(Y, X) because iconsc > cons, [105] and [108], by (Copy) 105] iconsc*(X, @_{o -> o}*(iconsc(X), Y)) >= Y because [106], by (Select) 106] @_{o -> o}*(iconsc(X), Y) >= Y because [107], by (Select) 107] Y >= Y by (Meta) 108] iconsc*(X, @_{o -> o}*(iconsc(X), Y)) >= X because [109], by (Select) 109] X >= X by (Meta) 110] reverse(X) >= foldl(/\x./\y.yap(iconsc(x), y), _|_, X) because [111], by (Star) 111] reverse*(X) >= foldl(/\x./\y.yap(iconsc(x), y), _|_, X) because reverse > foldl, [112], [120] and [121], by (Copy) 112] reverse*(X) >= /\y./\z.yap(iconsc(y), z) because [113], by (F-Abs) 113] reverse*(X, x) >= /\z.yap(iconsc(x), z) because [114], by (F-Abs) 114] reverse*(X, x, y) >= yap(iconsc(x), y) because reverse > yap, [115] and [118], by (Copy) 115] reverse*(X, x, y) >= iconsc(x) because reverse > iconsc and [116], by (Copy) 116] reverse*(X, x, y) >= x because [117], by (Select) 117] x >= x by (Var) 118] reverse*(X, x, y) >= y because [119], by (Select) 119] y >= y by (Var) 120] reverse*(X) >= _|_ by (Bot) 121] reverse*(X) >= X because [52], by (Select) 122] reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because [123], by (Star) 123] reverse1*(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because reverse1 > foldl, [124], [133] and [134], by (Copy) 124] reverse1*(X) >= /\y./\z.app(cons(z, _|_), y) because [125], by (F-Abs) 125] reverse1*(X, x) >= /\z.app(cons(z, _|_), x) because [126], by (F-Abs) 126] reverse1*(X, x, y) >= app(cons(y, _|_), x) because reverse1 > app, [127] and [131], by (Copy) 127] reverse1*(X, x, y) >= cons(y, _|_) because reverse1 > cons, [128] and [130], by (Copy) 128] reverse1*(X, x, y) >= y because [129], by (Select) 129] y >= y by (Var) 130] reverse1*(X, x, y) >= _|_ by (Bot) 131] reverse1*(X, x, y) >= x because [132], by (Select) 132] x >= x by (Var) 133] reverse1*(X) >= _|_ by (Bot) 134] reverse1*(X) >= X because [61], by (Select) 135] yap(F, X) >= @_{o -> o}(F, X) because [136], by (Star) 136] yap*(F, X) >= @_{o -> o}(F, X) because yap > @_{o -> o}, [137] and [138], by (Copy) 137] yap*(F, X) >= F because [65], by (Select) 138] yap*(F, X) >= X because [66], by (Select) 139] foldl(F, X, Y) >= foldl#(F, X, Y) because [140], by (Star) 140] foldl*(F, X, Y) >= foldl#(F, X, Y) because foldl > foldl#, [141], [143] and [145], by (Copy) 141] foldl*(F, X, Y) >= F because [142], by (Select) 142] F >= F by (Meta) 143] foldl*(F, X, Y) >= X because [144], by (Select) 144] X >= X by (Meta) 145] foldl*(F, X, Y) >= Y because [146], by (Select) 146] Y >= Y by (Meta) 147] reverse(X) >= #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X)) because [148], by (Star) 148] reverse*(X) >= #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), _|_, X)) because reverse > #argfun-reverse## and [149], by (Copy) 149] reverse*(X) >= foldl#(/\x./\y.yap(iconsc(x), y), _|_, X) because reverse > foldl#, [150], [158] and [159], by (Copy) 150] reverse*(X) >= /\y./\z.yap(iconsc(y), z) because [151], by (F-Abs) 151] reverse*(X, x) >= /\z.yap(iconsc(x), z) because [152], by (F-Abs) 152] reverse*(X, x, y) >= yap(iconsc(x), y) because reverse > yap, [153] and [156], by (Copy) 153] reverse*(X, x, y) >= iconsc(x) because reverse > iconsc and [154], by (Copy) 154] reverse*(X, x, y) >= x because [155], by (Select) 155] x >= x by (Var) 156] reverse*(X, x, y) >= y because [157], by (Select) 157] y >= y by (Var) 158] reverse*(X) >= _|_ by (Bot) 159] reverse*(X) >= X because [160], by (Select) 160] X >= X by (Meta) 161] reverse1(X) >= foldl#(/\x./\y.app(cons(y, _|_), x), _|_, X) because [162], by (Star) 162] reverse1*(X) >= foldl#(/\x./\y.app(cons(y, _|_), x), _|_, X) because reverse1 > foldl#, [163], [172] and [173], by (Copy) 163] reverse1*(X) >= /\y./\z.app(cons(z, _|_), y) because [164], by (F-Abs) 164] reverse1*(X, x) >= /\z.app(cons(z, _|_), x) because [165], by (F-Abs) 165] reverse1*(X, x, y) >= app(cons(y, _|_), x) because reverse1 > app, [166] and [170], by (Copy) 166] reverse1*(X, x, y) >= cons(y, _|_) because reverse1 > cons, [167] and [169], by (Copy) 167] reverse1*(X, x, y) >= y because [168], by (Select) 168] y >= y by (Var) 169] reverse1*(X, x, y) >= _|_ by (Bot) 170] reverse1*(X, x, y) >= x because [171], by (Select) 171] x >= x by (Var) 172] reverse1*(X) >= _|_ by (Bot) 173] reverse1*(X) >= X because [174], by (Select) 174] X >= X by (Meta) 175] yap(F, X) >= #argfun-yap##(@_{o -> o}(F, X)) because [176], by (Star) 176] yap*(F, X) >= #argfun-yap##(@_{o -> o}(F, X)) because yap > #argfun-yap## and [177], by (Copy) 177] yap*(F, X) >= @_{o -> o}(F, X) because yap > @_{o -> o}, [178] and [180], by (Copy) 178] yap*(F, X) >= F because [179], by (Select) 179] F >= F by (Meta) 180] yap*(F, X) >= X because [181], by (Select) 181] X >= X by (Meta) By the observations in [Kop12, Sec. 6.6], this reduction pair suffices; we may thus replace the dependency pair problem (P_1, R_0, minimal, all) by (P_2, R_0, minimal, all), where P_2 consists of: foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> foldl#(/\z./\u.yap(F(z), u), yap(F(X), Y), Z) foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> F(z) 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) Thus, the original system is terminating if (P_2, R_0, minimal, all) is finite. We consider the dependency pair problem (P_2, R_0, minimal, all). We will use the reduction pair processor [Kop12, Thm. 7.16]. It suffices to find a standard reduction pair [Kop12, Def. 6.69]. Thus, we must orient: foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >? foldl#(/\z./\u.yap(F(z), u), yap(F(X), Y), Z) foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >? F(~c1) ~c0 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) 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 foldl(F, X, Y) >= foldl#(F, X, Y) reverse(X) >= reverse#(X) reverse1(X) >= reverse1#(X) yap(F, X) >= yap#(F, X) We apply [Kop12, Thm. 6.75] and use the following argument functions: pi( reverse1#(X) ) = #argfun-reverse1##(foldl#(/\x./\y.app(cons(y, nil), x), nil, X)) pi( reverse#(X) ) = #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), nil, X)) pi( yap#(F, X) ) = #argfun-yap##(F X) Since this representation is not advantageous for the higher-order recursive path ordering, we present the strict requirements in their unextended form, which is not problematic since for any F, s and substituion gamma: (F s)gamma beta-reduces to F(s)gamma.) We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[foldl(x_1, x_2, x_3)]] = foldl(x_1, x_3, x_2) [[foldl#(x_1, x_2, x_3)]] = foldl#(x_1, x_3) [[nil]] = _|_ [[reverse1#(x_1)]] = x_1 [[reverse#(x_1)]] = x_1 [[~c0]] = _|_ [[~c1]] = _|_ We choose Lex = {foldl} and Mul = {#argfun-reverse1##, #argfun-reverse##, #argfun-yap##, @_{o -> o}, app, cons, foldl#, iconsc, reverse, reverse1, yap, yap#}, and the following precedence: reverse > #argfun-reverse## > iconsc > reverse1 > #argfun-reverse1## > app > foldl > yap > #argfun-yap## > foldl# > @_{o -> o} > cons > yap# Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: foldl#(/\x./\y.yap(F(x), y), cons(X, Y)) >= foldl#(/\x./\y.yap(F(x), y), Y) foldl#(/\x./\y.yap(F(x), y), cons(X, Y)) > @_{o -> o}(F(_|_), _|_) #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), X)) >= foldl#(/\x./\y.yap(iconsc(x), y), X) #argfun-reverse1##(foldl#(/\x./\y.app(cons(y, _|_), x), X)) >= foldl#(/\x./\y.app(cons(y, _|_), x), X) #argfun-yap##(@_{o -> o}(F, X)) >= @_{o -> o}(F, X) 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) foldl(F, X, Y) >= foldl#(F, Y) reverse(X) >= #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), X)) reverse1(X) >= #argfun-reverse1##(foldl#(/\x./\y.app(cons(y, _|_), x), X)) yap(F, X) >= #argfun-yap##(@_{o -> o}(F, X)) With these choices, we have: 1] foldl#(/\x./\y.yap(F(x), y), cons(X, Y)) >= foldl#(/\x./\y.yap(F(x), y), Y) because foldl# in Mul, [2] and [8], by (Fun) 2] /\x./\z.yap(F(x), z) >= /\x./\z.yap(F(x), z) because [3], by (Abs) 3] /\z.yap(F(y), z) >= /\z.yap(F(y), z) because [4], by (Abs) 4] yap(F(y), x) >= yap(F(y), x) because yap in Mul, [5] and [7], by (Fun) 5] F(y) >= F(y) because [6], by (Meta) 6] y >= y by (Var) 7] x >= x by (Var) 8] cons(X, Y) >= Y because [9], by (Star) 9] cons*(X, Y) >= Y because [10], by (Select) 10] Y >= Y by (Meta) 11] foldl#(/\x./\y.yap(F(x), y), cons(X, Y)) > @_{o -> o}(F(_|_), _|_) because [12], by definition 12] foldl#*(/\x./\y.yap(F(x), y), cons(X, Y)) >= @_{o -> o}(F(_|_), _|_) because foldl# > @_{o -> o}, [13] and [17], by (Copy) 13] foldl#*(/\x./\y.yap(F(x), y), cons(X, Y)) >= F(_|_) because [14], by (Select) 14] /\x.yap(F(foldl#*(/\y./\z.yap(F(y), z), cons(X, Y))), x) >= F(_|_) because [15], by (Eta)[Kop13:2] 15] F(foldl#*(/\x./\y.yap(F(x), y), cons(X, Y))) >= F(_|_) because [16], by (Meta) 16] foldl#*(/\x./\y.yap(F(x), y), cons(X, Y)) >= _|_ by (Bot) 17] foldl#*(/\x./\y.yap(F(x), y), cons(X, Y)) >= _|_ by (Bot) 18] #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), X)) >= foldl#(/\x./\y.yap(iconsc(x), y), X) because [19], by (Star) 19] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), X)) >= foldl#(/\x./\y.yap(iconsc(x), y), X) because #argfun-reverse## > foldl#, [20] and [28], by (Copy) 20] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), X)) >= /\x./\y.yap(iconsc(x), y) because [21], by (F-Abs) 21] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), X), z) >= /\x.yap(iconsc(z), x) because [22], by (F-Abs) 22] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), X), z, u) >= yap(iconsc(z), u) because #argfun-reverse## > yap, [23] and [26], by (Copy) 23] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), X), z, u) >= iconsc(z) because #argfun-reverse## > iconsc and [24], by (Copy) 24] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), X), z, u) >= z because [25], by (Select) 25] z >= z by (Var) 26] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), X), z, u) >= u because [27], by (Select) 27] u >= u by (Var) 28] #argfun-reverse##*(foldl#(/\x./\y.yap(iconsc(x), y), X)) >= X because [29], by (Select) 29] foldl#(/\x./\y.yap(iconsc(x), y), X) >= X because [30], by (Star) 30] foldl#*(/\x./\y.yap(iconsc(x), y), X) >= X because [31], by (Select) 31] X >= X by (Meta) 32] #argfun-reverse1##(foldl#(/\x./\y.app(cons(y, _|_), x), X)) >= foldl#(/\x./\y.app(cons(y, _|_), x), X) because [33], by (Star) 33] #argfun-reverse1##*(foldl#(/\x./\y.app(cons(y, _|_), x), X)) >= foldl#(/\x./\y.app(cons(y, _|_), x), X) because [34], by (Select) 34] foldl#(/\x./\y.app(cons(y, _|_), x), X) >= foldl#(/\x./\y.app(cons(y, _|_), x), X) because foldl# in Mul, [35] and [42], by (Fun) 35] /\x./\z.app(cons(z, _|_), x) >= /\x./\z.app(cons(z, _|_), x) because [36], by (Abs) 36] /\z.app(cons(z, _|_), y) >= /\z.app(cons(z, _|_), y) because [37], by (Abs) 37] app(cons(x, _|_), y) >= app(cons(x, _|_), y) because app in Mul, [38] and [41], by (Fun) 38] cons(x, _|_) >= cons(x, _|_) because cons in Mul, [39] and [40], by (Fun) 39] x >= x by (Var) 40] _|_ >= _|_ by (Bot) 41] y >= y by (Var) 42] X >= X by (Meta) 43] #argfun-yap##(@_{o -> o}(F, X)) >= @_{o -> o}(F, X) because [44], by (Star) 44] #argfun-yap##*(@_{o -> o}(F, X)) >= @_{o -> o}(F, X) because [45], by (Select) 45] @_{o -> o}(F, X) >= @_{o -> o}(F, X) because @_{o -> o} in Mul, [46] and [47], by (Fun) 46] F >= F by (Meta) 47] X >= X by (Meta) 48] app(_|_, X) >= X because [49], by (Star) 49] app*(_|_, X) >= X because [50], by (Select) 50] X >= X by (Meta) 51] app(cons(X, Y), Z) >= cons(X, app(Y, Z)) because [52], by (Star) 52] app*(cons(X, Y), Z) >= cons(X, app(Y, Z)) because app > cons, [53] and [57], by (Copy) 53] app*(cons(X, Y), Z) >= X because [54], by (Select) 54] cons(X, Y) >= X because [55], by (Star) 55] cons*(X, Y) >= X because [56], by (Select) 56] X >= X by (Meta) 57] app*(cons(X, Y), Z) >= app(Y, Z) because app in Mul, [58] and [61], by (Stat) 58] cons(X, Y) > Y because [59], by definition 59] cons*(X, Y) >= Y because [60], by (Select) 60] Y >= Y by (Meta) 61] Z >= Z by (Meta) 62] foldl(/\x./\y.yap(F(x), y), X, _|_) >= X because [63], by (Star) 63] foldl*(/\x./\y.yap(F(x), y), X, _|_) >= X because [64], by (Select) 64] X >= X by (Meta) 65] foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [66], by (Star) 66] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [67], by (Select) 67] 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 [68], by (Star) 68] 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 [69], by (Select) 69] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [2], [70], [72], [73] and [83], by (Stat) 70] cons(Y, Z) > Z because [71], by definition 71] cons*(Y, Z) >= Z because [10], by (Select) 72] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= /\x./\y.yap(F(x), y) because [2], by (Select) 73] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= yap(F(X), Y) because foldl > yap, [74] and [79], by (Copy) 74] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= F(X) because [75], by (Select) 75] /\x.yap(F(foldl*(/\y./\z.yap(F(y), z), X, cons(Y, Z))), x) >= F(X) because [76], by (Eta)[Kop13:2] 76] F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))) >= F(X) because [77], by (Meta) 77] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= X because [78], by (Select) 78] X >= X by (Meta) 79] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Y because [80], by (Select) 80] cons(Y, Z) >= Y because [81], by (Star) 81] cons*(Y, Z) >= Y because [82], by (Select) 82] Y >= Y by (Meta) 83] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Z because [84], by (Select) 84] yap(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= Z because [85], by (Star) 85] yap*(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= Z because [86], by (Select) 86] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Z because [87], by (Select) 87] yap(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= Z because [88], by (Star) 88] yap*(F(foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z))), foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= Z because [89], by (Select) 89] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= Z because [90], by (Select) 90] cons(Y, Z) >= Z because [71], by (Star) 91] @_{o -> o}(iconsc(X), Y) >= cons(Y, X) because [92], by (Star) 92] @_{o -> o}*(iconsc(X), Y) >= cons(Y, X) because @_{o -> o} > cons, [93] and [95], by (Copy) 93] @_{o -> o}*(iconsc(X), Y) >= Y because [94], by (Select) 94] Y >= Y by (Meta) 95] @_{o -> o}*(iconsc(X), Y) >= X because [96], by (Select) 96] iconsc(X) @_{o -> o}*(iconsc(X), Y) >= X because [97] 97] iconsc*(X, @_{o -> o}*(iconsc(X), Y)) >= X because [98], by (Select) 98] @_{o -> o}*(iconsc(X), Y) >= X because [99], by (Select) 99] iconsc(X) @_{o -> o}*(iconsc(X), Y) >= X because [100] 100] iconsc*(X, @_{o -> o}*(iconsc(X), Y)) >= X because [101], by (Select) 101] X >= X by (Meta) 102] reverse(X) >= foldl(/\x./\y.yap(iconsc(x), y), _|_, X) because [103], by (Star) 103] reverse*(X) >= foldl(/\x./\y.yap(iconsc(x), y), _|_, X) because reverse > foldl, [104], [112] and [113], by (Copy) 104] reverse*(X) >= /\y./\z.yap(iconsc(y), z) because [105], by (F-Abs) 105] reverse*(X, x) >= /\z.yap(iconsc(x), z) because [106], by (F-Abs) 106] reverse*(X, x, y) >= yap(iconsc(x), y) because reverse > yap, [107] and [110], by (Copy) 107] reverse*(X, x, y) >= iconsc(x) because reverse > iconsc and [108], by (Copy) 108] reverse*(X, x, y) >= x because [109], by (Select) 109] x >= x by (Var) 110] reverse*(X, x, y) >= y because [111], by (Select) 111] y >= y by (Var) 112] reverse*(X) >= _|_ by (Bot) 113] reverse*(X) >= X because [31], by (Select) 114] reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because [115], by (Star) 115] reverse1*(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because reverse1 > foldl, [116], [125] and [126], by (Copy) 116] reverse1*(X) >= /\y./\z.app(cons(z, _|_), y) because [117], by (F-Abs) 117] reverse1*(X, x) >= /\z.app(cons(z, _|_), x) because [118], by (F-Abs) 118] reverse1*(X, x, y) >= app(cons(y, _|_), x) because reverse1 > app, [119] and [123], by (Copy) 119] reverse1*(X, x, y) >= cons(y, _|_) because reverse1 > cons, [120] and [122], by (Copy) 120] reverse1*(X, x, y) >= y because [121], by (Select) 121] y >= y by (Var) 122] reverse1*(X, x, y) >= _|_ by (Bot) 123] reverse1*(X, x, y) >= x because [124], by (Select) 124] x >= x by (Var) 125] reverse1*(X) >= _|_ by (Bot) 126] reverse1*(X) >= X because [42], by (Select) 127] yap(F, X) >= @_{o -> o}(F, X) because [128], by (Star) 128] yap*(F, X) >= @_{o -> o}(F, X) because yap > @_{o -> o}, [129] and [130], by (Copy) 129] yap*(F, X) >= F because [46], by (Select) 130] yap*(F, X) >= X because [47], by (Select) 131] foldl(F, X, Y) >= foldl#(F, Y) because [132], by (Star) 132] foldl*(F, X, Y) >= foldl#(F, Y) because foldl > foldl#, [133] and [135], by (Copy) 133] foldl*(F, X, Y) >= F because [134], by (Select) 134] F >= F by (Meta) 135] foldl*(F, X, Y) >= Y because [136], by (Select) 136] Y >= Y by (Meta) 137] reverse(X) >= #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), X)) because [138], by (Star) 138] reverse*(X) >= #argfun-reverse##(foldl#(/\x./\y.yap(iconsc(x), y), X)) because reverse > #argfun-reverse## and [139], by (Copy) 139] reverse*(X) >= foldl#(/\x./\y.yap(iconsc(x), y), X) because reverse > foldl#, [140] and [148], by (Copy) 140] reverse*(X) >= /\y./\z.yap(iconsc(y), z) because [141], by (F-Abs) 141] reverse*(X, x) >= /\z.yap(iconsc(x), z) because [142], by (F-Abs) 142] reverse*(X, x, y) >= yap(iconsc(x), y) because reverse > yap, [143] and [146], by (Copy) 143] reverse*(X, x, y) >= iconsc(x) because reverse > iconsc and [144], by (Copy) 144] reverse*(X, x, y) >= x because [145], by (Select) 145] x >= x by (Var) 146] reverse*(X, x, y) >= y because [147], by (Select) 147] y >= y by (Var) 148] reverse*(X) >= X because [149], by (Select) 149] X >= X by (Meta) 150] reverse1(X) >= #argfun-reverse1##(foldl#(/\x./\y.app(cons(y, _|_), x), X)) because [151], by (Star) 151] reverse1*(X) >= #argfun-reverse1##(foldl#(/\x./\y.app(cons(y, _|_), x), X)) because reverse1 > #argfun-reverse1## and [152], by (Copy) 152] reverse1*(X) >= foldl#(/\x./\y.app(cons(y, _|_), x), X) because reverse1 > foldl#, [153] and [162], by (Copy) 153] reverse1*(X) >= /\y./\z.app(cons(z, _|_), y) because [154], by (F-Abs) 154] reverse1*(X, x) >= /\z.app(cons(z, _|_), x) because [155], by (F-Abs) 155] reverse1*(X, x, y) >= app(cons(y, _|_), x) because reverse1 > app, [156] and [160], by (Copy) 156] reverse1*(X, x, y) >= cons(y, _|_) because reverse1 > cons, [157] and [159], by (Copy) 157] reverse1*(X, x, y) >= y because [158], by (Select) 158] y >= y by (Var) 159] reverse1*(X, x, y) >= _|_ by (Bot) 160] reverse1*(X, x, y) >= x because [161], by (Select) 161] x >= x by (Var) 162] reverse1*(X) >= X because [163], by (Select) 163] X >= X by (Meta) 164] yap(F, X) >= #argfun-yap##(@_{o -> o}(F, X)) because [165], by (Star) 165] yap*(F, X) >= #argfun-yap##(@_{o -> o}(F, X)) because yap > #argfun-yap## and [166], by (Copy) 166] yap*(F, X) >= @_{o -> o}(F, X) because yap > @_{o -> o}, [167] and [169], by (Copy) 167] yap*(F, X) >= F because [168], by (Select) 168] F >= F by (Meta) 169] yap*(F, X) >= X because [170], by (Select) 170] X >= X by (Meta) By the observations in [Kop12, Sec. 6.6], this reduction pair suffices; we may thus replace the dependency pair problem (P_2, R_0, minimal, all) by (P_3, R_0, minimal, all), where P_3 consists of: foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> foldl#(/\z./\u.yap(F(z), u), yap(F(X), Y), Z) 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) Thus, the original system is terminating if (P_3, R_0, minimal, all) is finite. We consider the dependency pair problem (P_3, R_0, minimal, all). We place the elements of P in a dependency graph approximation G (see e.g. [Kop12, Thm. 7.27, 7.29], as follows: * 0 : 0 * 1 : 0 * 2 : 0 * 3 : 0, 1, 2, 3 This graph has the following strongly connected components: P_4: foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z)) =#> foldl#(/\z./\u.yap(F(z), u), yap(F(X), Y), Z) P_5: yap#(F, X) =#> F(X) By [Kop12, Thm. 7.31], we may replace any dependency pair problem (P_3, R_0, m, f) by (P_4, R_0, m, f) and (P_5, R_0, m, f). Thus, the original system is terminating if each of (P_4, R_0, minimal, all) and (P_5, R_0, minimal, all) is finite. We consider the dependency pair problem (P_5, R_0, minimal, all). We will use the reduction pair processor [Kop12, Thm. 7.16]. It suffices to find a standard reduction pair [Kop12, Def. 6.69]. Thus, we must orient: yap#(F, X) >? F(X) 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 yap(F, X) >= yap#(F, X) We apply [Kop12, Thm. 6.75] and use the following argument functions: pi( yap#(F, X) ) = #argfun-yap##(F X) Since this representation is not advantageous for the higher-order recursive path ordering, we present the strict requirements in their unextended form, which is not problematic since for any F, s and substituion gamma: (F s)gamma beta-reduces to F(s)gamma.) 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_2, x_1) [[nil]] = _|_ We choose Lex = {foldl} and Mul = {#argfun-yap##, @_{o -> o}, app, cons, iconsc, reverse, reverse1, yap, yap#}, and the following precedence: reverse > iconsc > reverse1 > app > foldl > yap > #argfun-yap## > cons > @_{o -> o} > yap# Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: #argfun-yap##(@_{o -> o}(F, X)) > @_{o -> o}(F, X) 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) yap(F, X) >= #argfun-yap##(@_{o -> o}(F, X)) With these choices, we have: 1] #argfun-yap##(@_{o -> o}(F, X)) > @_{o -> o}(F, X) because [2], by definition 2] #argfun-yap##*(@_{o -> o}(F, X)) >= @_{o -> o}(F, X) because [3], by (Select) 3] @_{o -> o}(F, X) >= @_{o -> o}(F, X) because @_{o -> o} in Mul, [4] and [5], by (Fun) 4] F >= F by (Meta) 5] X >= X by (Meta) 6] app(_|_, X) >= X because [7], by (Star) 7] app*(_|_, X) >= X because [8], by (Select) 8] X >= X by (Meta) 9] app(cons(X, Y), Z) >= cons(X, app(Y, Z)) because [10], by (Star) 10] app*(cons(X, Y), Z) >= cons(X, app(Y, Z)) because app > cons, [11] and [15], by (Copy) 11] app*(cons(X, Y), Z) >= X because [12], by (Select) 12] cons(X, Y) >= X because [13], by (Star) 13] cons*(X, Y) >= X because [14], by (Select) 14] X >= X by (Meta) 15] app*(cons(X, Y), Z) >= app(Y, Z) because app in Mul, [16] and [19], by (Stat) 16] cons(X, Y) > Y because [17], by definition 17] cons*(X, Y) >= Y because [18], by (Select) 18] Y >= Y by (Meta) 19] Z >= Z by (Meta) 20] foldl(/\x./\y.yap(F(x), y), X, _|_) >= X because [21], by (Star) 21] foldl*(/\x./\y.yap(F(x), y), X, _|_) >= X because [22], by (Select) 22] X >= X by (Meta) 23] foldl(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [24], by (Star) 24] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= foldl(/\x./\y.yap(F(x), y), yap(F(X), Y), Z) because [25], [28], [35] and [45], by (Stat) 25] cons(Y, Z) > Z because [26], by definition 26] cons*(Y, Z) >= Z because [27], by (Select) 27] Z >= Z by (Meta) 28] foldl*(/\x./\y.yap(F(x), y), X, cons(Y, Z)) >= /\x./\y.yap(F(x), y) because [29], by (Select) 29] /\x./\z.yap(F(x), z) >= /\x./\z.yap(F(x), z) because [30], by (Abs) 30] /\z.yap(F(y), z) >= /\z.yap(F(y), z) because [31], by (Abs) 31] yap(F(y), x) >= yap(F(y), x) because yap in Mul, [32] and [34], by (Fun) 32] F(y) >= F(y) because [33], by (Meta) 33] y >= y by (Var) 34] x >= x by (Var) 35] foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z)) >= yap(F(X), Y) because foldl > yap, [36] and [41], by (Copy) 36] foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z)) >= F(X) because [37], by (Select) 37] /\z.yap(F(foldl*(/\u./\v.yap(F(u), v), X, cons(Y, Z))), z) >= F(X) because [38], by (Eta)[Kop13:2] 38] F(foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z))) >= F(X) because [39], by (Meta) 39] foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z)) >= X because [40], by (Select) 40] X >= X by (Meta) 41] foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z)) >= Y because [42], by (Select) 42] cons(Y, Z) >= Y because [43], by (Star) 43] cons*(Y, Z) >= Y because [44], by (Select) 44] Y >= Y by (Meta) 45] foldl*(/\z./\u.yap(F(z), u), X, cons(Y, Z)) >= Z because [46], by (Select) 46] cons(Y, Z) >= Z because [26], by (Star) 47] @_{o -> o}(iconsc(X), Y) >= cons(Y, X) because [48], by (Star) 48] @_{o -> o}*(iconsc(X), Y) >= cons(Y, X) because [49], by (Select) 49] iconsc(X) @_{o -> o}*(iconsc(X), Y) >= cons(Y, X) because [50] 50] iconsc*(X, @_{o -> o}*(iconsc(X), Y)) >= cons(Y, X) because iconsc > cons, [51] and [54], by (Copy) 51] iconsc*(X, @_{o -> o}*(iconsc(X), Y)) >= Y because [52], by (Select) 52] @_{o -> o}*(iconsc(X), Y) >= Y because [53], by (Select) 53] Y >= Y by (Meta) 54] iconsc*(X, @_{o -> o}*(iconsc(X), Y)) >= X because [55], by (Select) 55] X >= X by (Meta) 56] reverse(X) >= foldl(/\x./\y.yap(iconsc(x), y), _|_, X) because [57], by (Star) 57] reverse*(X) >= foldl(/\x./\y.yap(iconsc(x), y), _|_, X) because reverse > foldl, [58], [66] and [67], by (Copy) 58] reverse*(X) >= /\y./\z.yap(iconsc(y), z) because [59], by (F-Abs) 59] reverse*(X, x) >= /\z.yap(iconsc(x), z) because [60], by (F-Abs) 60] reverse*(X, x, y) >= yap(iconsc(x), y) because reverse > yap, [61] and [64], by (Copy) 61] reverse*(X, x, y) >= iconsc(x) because reverse > iconsc and [62], by (Copy) 62] reverse*(X, x, y) >= x because [63], by (Select) 63] x >= x by (Var) 64] reverse*(X, x, y) >= y because [65], by (Select) 65] y >= y by (Var) 66] reverse*(X) >= _|_ by (Bot) 67] reverse*(X) >= X because [68], by (Select) 68] X >= X by (Meta) 69] reverse1(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because [70], by (Star) 70] reverse1*(X) >= foldl(/\x./\y.app(cons(y, _|_), x), _|_, X) because reverse1 > foldl, [71], [80] and [81], by (Copy) 71] reverse1*(X) >= /\y./\z.app(cons(z, _|_), y) because [72], by (F-Abs) 72] reverse1*(X, x) >= /\z.app(cons(z, _|_), x) because [73], by (F-Abs) 73] reverse1*(X, x, y) >= app(cons(y, _|_), x) because reverse1 > app, [74] and [78], by (Copy) 74] reverse1*(X, x, y) >= cons(y, _|_) because reverse1 > cons, [75] and [77], by (Copy) 75] reverse1*(X, x, y) >= y because [76], by (Select) 76] y >= y by (Var) 77] reverse1*(X, x, y) >= _|_ by (Bot) 78] reverse1*(X, x, y) >= x because [79], by (Select) 79] x >= x by (Var) 80] reverse1*(X) >= _|_ by (Bot) 81] reverse1*(X) >= X because [82], by (Select) 82] X >= X by (Meta) 83] yap(F, X) >= @_{o -> o}(F, X) because [84], by (Star) 84] yap*(F, X) >= @_{o -> o}(F, X) because yap > @_{o -> o}, [85] and [86], by (Copy) 85] yap*(F, X) >= F because [4], by (Select) 86] yap*(F, X) >= X because [5], by (Select) 87] yap(F, X) >= #argfun-yap##(@_{o -> o}(F, X)) because [88], by (Star) 88] yap*(F, X) >= #argfun-yap##(@_{o -> o}(F, X)) because yap > #argfun-yap## and [89], by (Copy) 89] yap*(F, X) >= @_{o -> o}(F, X) because yap > @_{o -> o}, [90] and [92], by (Copy) 90] yap*(F, X) >= F because [91], by (Select) 91] F >= F by (Meta) 92] yap*(F, X) >= X because [93], by (Select) 93] X >= X by (Meta) By the observations in [Kop12, Sec. 6.6], this reduction pair suffices; we may thus replace a dependency pair problem (P_5, R_0) by ({}, R_0). By the empty set processor [Kop12, Thm. 7.15] this problem may be immediately removed. Thus, the original system is terminating if (P_4, R_0, minimal, all) is finite. We consider the dependency pair problem (P_4, R_0, minimal, all). We apply the subterm criterion with the following projection function: nu(foldl#) = 3 Thus, we can orient the dependency pairs as follows: nu(foldl#(/\x./\y.yap(F(x), y), X, cons(Y, Z))) = cons(Y, Z) |> Z = nu(foldl#(/\z./\u.yap(F(z), u), yap(F(X), Y), Z)) By [FuhKop19, Thm. 61], we may replace a dependency pair problem (P_4, R_0, minimal, f) by ({}, R_0, minimal, f). By the empty set processor [Kop12, Thm. 7.15] this problem may be immediately removed. As all dependency pair problems were succesfully simplified with sound (and complete) processors until nothing remained, we conclude termination. +++ Citations +++ [FuhKop19] C. Fuhs, and C. Kop. A static higher-order dependency pair framework. In Proceedings of ESOP 2019, 2019. [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.