We consider the system AotoYamada_05__Ex5TermProof. Alphabet: 0 : [] --> a add : [a * a] --> a fact : [] --> a -> a mult : [] --> a -> a -> a rec : [a -> a -> a * a] --> a -> a s : [a] --> a Rules: add(0, x) => x add(s(x), y) => s(add(x, y)) mult 0 x => 0 mult s(x) y => add(mult x y, y) rec(f, x) 0 => x rec(f, x) s(y) => f s(y) (rec(f, x) y) fact => rec(mult, s(0)) This AFS is converted to an AFSM simply by replacing all free variables by meta-variables (with arity 0). We use the dependency pair framework as described in [Kop12, Ch. 6/7], with static dependency pairs (see [KusIsoSakBla09] and the adaptation for AFSMs and accessible arguments in [Kop13]). In order to do so, we start by eta-expanding the system, which gives: add(0, X) => X add(s(X), Y) => s(add(X, Y)) mult(0, X) => 0 mult(s(X), Y) => add(mult(X, Y), Y) rec(F, X, 0) => X rec(F, X, s(Y)) => F s(Y) rec(F, X, Y) fact(X) => rec(/\x./\y.mult(x, y), s(0), X) We thus obtain the following dependency pair problem (P_0, R_0, static, formative): Dependency Pairs P_0: 0] add#(s(X), Y) =#> add#(X, Y) 1] mult#(s(X), Y) =#> add#(mult(X, Y), Y) 2] mult#(s(X), Y) =#> mult#(X, Y) 3] rec#(F, X, s(Y)) =#> rec#(F, X, Y) 4] fact#(X) =#> rec#(/\x./\y.mult(x, y), s(0), X) 5] fact#(X) =#> mult#(Y, Z) Rules R_0: add(0, X) => X add(s(X), Y) => s(add(X, Y)) mult(0, X) => 0 mult(s(X), Y) => add(mult(X, Y), Y) rec(F, X, 0) => X rec(F, X, s(Y)) => F s(Y) rec(F, X, Y) fact(X) => rec(/\x./\y.mult(x, y), s(0), X) Thus, the original system is terminating if (P_0, R_0, static, formative) is finite. We consider the dependency pair problem (P_0, R_0, static, formative). 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: add#(s(X), Y) >? add#(X, Y) mult#(s(X), Y) >? add#(mult(X, Y), Y) mult#(s(X), Y) >? mult#(X, Y) rec#(F, X, s(Y)) >? rec#(F, X, Y) fact#(X) >? rec#(/\x./\y.mult(x, y), s(0), X) fact#(X) >? mult#(Y, Z) add(0, X) >= X add(s(X), Y) >= s(add(X, Y)) mult(0, X) >= 0 mult(s(X), Y) >= add(mult(X, Y), Y) rec(F, X, 0) >= X rec(F, X, s(Y)) >= F s(Y) rec(F, X, Y) fact(X) >= rec(/\x./\y.mult(x, y), s(0), X) We apply [Kop12, Thm. 6.75] and use the following argument functions: pi( fact(X) ) = #argfun-fact#(rec(/\x./\y.mult(x, y), s(0), 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-fact#(x_1)]] = x_1 [[add#(x_1, x_2)]] = _|_ [[mult#(x_1, x_2)]] = _|_ We choose Lex = {} and Mul = {0, @_{o -> o -> o}, @_{o -> o}, add, fact, fact#, mult, rec, rec#, s}, and the following precedence: fact > rec > @_{o -> o -> o} > @_{o -> o} > fact# > mult > 0 > add > rec# > s Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: _|_ >= _|_ _|_ >= _|_ _|_ >= _|_ rec#(F, X, s(Y)) >= rec#(F, X, Y) fact#(X) > rec#(/\x./\y.mult(x, y), s(0), X) fact#(X) >= _|_ add(0, X) >= X add(s(X), Y) >= s(add(X, Y)) mult(0, X) >= 0 mult(s(X), Y) >= add(mult(X, Y), Y) rec(F, X, 0) >= X rec(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) rec(/\x./\y.mult(x, y), s(0), X) >= rec(/\x./\y.mult(x, y), s(0), X) With these choices, we have: 1] _|_ >= _|_ by (Bot) 2] _|_ >= _|_ by (Bot) 3] _|_ >= _|_ by (Bot) 4] rec#(F, X, s(Y)) >= rec#(F, X, Y) because rec# in Mul, [5], [6] and [7], by (Fun) 5] F >= F by (Meta) 6] X >= X by (Meta) 7] s(Y) >= Y because [8], by (Star) 8] s*(Y) >= Y because [9], by (Select) 9] Y >= Y by (Meta) 10] fact#(X) > rec#(/\x./\y.mult(x, y), s(0), X) because [11], by definition 11] fact#*(X) >= rec#(/\x./\y.mult(x, y), s(0), X) because fact# > rec#, [12], [19] and [21], by (Copy) 12] fact#*(X) >= /\y./\z.mult(y, z) because [13], by (F-Abs) 13] fact#*(X, x) >= /\z.mult(x, z) because [14], by (F-Abs) 14] fact#*(X, x, y) >= mult(x, y) because fact# > mult, [15] and [17], by (Copy) 15] fact#*(X, x, y) >= x because [16], by (Select) 16] x >= x by (Var) 17] fact#*(X, x, y) >= y because [18], by (Select) 18] y >= y by (Var) 19] fact#*(X) >= s(0) because fact# > s and [20], by (Copy) 20] fact#*(X) >= 0 because fact# > 0, by (Copy) 21] fact#*(X) >= X because [22], by (Select) 22] X >= X by (Meta) 23] fact#(X) >= _|_ by (Bot) 24] add(0, X) >= X because [25], by (Star) 25] add*(0, X) >= X because [26], by (Select) 26] X >= X by (Meta) 27] add(s(X), Y) >= s(add(X, Y)) because [28], by (Star) 28] add*(s(X), Y) >= s(add(X, Y)) because add > s and [29], by (Copy) 29] add*(s(X), Y) >= add(X, Y) because add in Mul, [30] and [33], by (Stat) 30] s(X) > X because [31], by definition 31] s*(X) >= X because [32], by (Select) 32] X >= X by (Meta) 33] Y >= Y by (Meta) 34] mult(0, X) >= 0 because [35], by (Star) 35] mult*(0, X) >= 0 because mult > 0, by (Copy) 36] mult(s(X), Y) >= add(mult(X, Y), Y) because [37], by (Star) 37] mult*(s(X), Y) >= add(mult(X, Y), Y) because mult > add, [38] and [43], by (Copy) 38] mult*(s(X), Y) >= mult(X, Y) because mult in Mul, [39] and [42], by (Stat) 39] s(X) > X because [40], by definition 40] s*(X) >= X because [41], by (Select) 41] X >= X by (Meta) 42] Y >= Y by (Meta) 43] mult*(s(X), Y) >= Y because [42], by (Select) 44] rec(F, X, 0) >= X because [45], by (Star) 45] rec*(F, X, 0) >= X because [46], by (Select) 46] X >= X by (Meta) 47] rec(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) because [48], by (Star) 48] rec*(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) because rec > @_{o -> o}, [49] and [54], by (Copy) 49] rec*(F, X, s(Y)) >= @_{o -> o -> o}(F, s(Y)) because rec > @_{o -> o -> o}, [50] and [51], by (Copy) 50] rec*(F, X, s(Y)) >= F because [5], by (Select) 51] rec*(F, X, s(Y)) >= s(Y) because [52], by (Select) 52] s(Y) >= s(Y) because s in Mul and [53], by (Fun) 53] Y >= Y by (Meta) 54] rec*(F, X, s(Y)) >= rec(F, X, Y) because rec in Mul, [5], [6] and [55], by (Stat) 55] s(Y) > Y because [56], by definition 56] s*(Y) >= Y because [53], by (Select) 57] rec(/\x./\y.mult(x, y), s(0), X) >= rec(/\x./\y.mult(x, y), s(0), X) because rec in Mul, [58], [63] and [65], by (Fun) 58] /\x./\z.mult(x, z) >= /\x./\z.mult(x, z) because [59], by (Abs) 59] /\z.mult(y, z) >= /\z.mult(y, z) because [60], by (Abs) 60] mult(y, x) >= mult(y, x) because mult in Mul, [61] and [62], by (Fun) 61] y >= y by (Var) 62] x >= x by (Var) 63] s(0) >= s(0) because s in Mul and [64], by (Fun) 64] 0 >= 0 by (Fun) 65] 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_0, R_0, static, formative) by (P_1, R_0, static, formative), where P_1 consists of: add#(s(X), Y) =#> add#(X, Y) mult#(s(X), Y) =#> add#(mult(X, Y), Y) mult#(s(X), Y) =#> mult#(X, Y) rec#(F, X, s(Y)) =#> rec#(F, X, Y) fact#(X) =#> mult#(Y, Z) Thus, the original system is terminating if (P_1, R_0, static, formative) is finite. We consider the dependency pair problem (P_1, R_0, static, formative). 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: add#(s(X), Y) >? add#(X, Y) mult#(s(X), Y) >? add#(mult(X, Y), Y) mult#(s(X), Y) >? mult#(X, Y) rec#(F, X, s(Y)) >? rec#(F, X, Y) fact#(X) >? mult#(Y, Z) add(0, X) >= X add(s(X), Y) >= s(add(X, Y)) mult(0, X) >= 0 mult(s(X), Y) >= add(mult(X, Y), Y) rec(F, X, 0) >= X rec(F, X, s(Y)) >= F s(Y) rec(F, X, Y) fact(X) >= rec(/\x./\y.mult(x, y), s(0), X) We apply [Kop12, Thm. 6.75] and use the following argument functions: pi( fact(X) ) = #argfun-fact#(rec(/\x./\y.mult(x, y), s(0), 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: [[0]] = _|_ [[add#(x_1, x_2)]] = _|_ [[fact(x_1)]] = x_1 [[mult#(x_1, x_2)]] = _|_ We choose Lex = {} and Mul = {#argfun-fact#, @_{o -> o -> o}, @_{o -> o}, add, fact#, mult, rec, rec#, s}, and the following precedence: #argfun-fact# > mult > fact# > rec > @_{o -> o} > rec# > add > @_{o -> o -> o} > s Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: _|_ >= _|_ _|_ >= _|_ _|_ >= _|_ rec#(F, X, s(Y)) >= rec#(F, X, Y) fact#(X) > _|_ add(_|_, X) >= X add(s(X), Y) >= s(add(X, Y)) mult(_|_, X) >= _|_ mult(s(X), Y) >= add(mult(X, Y), Y) rec(F, X, _|_) >= X rec(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) #argfun-fact#(rec(/\x./\y.mult(x, y), s(_|_), X)) >= rec(/\x./\y.mult(x, y), s(_|_), X) With these choices, we have: 1] _|_ >= _|_ by (Bot) 2] _|_ >= _|_ by (Bot) 3] _|_ >= _|_ by (Bot) 4] rec#(F, X, s(Y)) >= rec#(F, X, Y) because [5], by (Star) 5] rec#*(F, X, s(Y)) >= rec#(F, X, Y) because rec# in Mul, [6], [7] and [8], by (Stat) 6] F >= F by (Meta) 7] X >= X by (Meta) 8] s(Y) > Y because [9], by definition 9] s*(Y) >= Y because [10], by (Select) 10] Y >= Y by (Meta) 11] fact#(X) > _|_ because [12], by definition 12] fact#*(X) >= _|_ by (Bot) 13] add(_|_, X) >= X because [14], by (Star) 14] add*(_|_, X) >= X because [15], by (Select) 15] X >= X by (Meta) 16] add(s(X), Y) >= s(add(X, Y)) because [17], by (Star) 17] add*(s(X), Y) >= s(add(X, Y)) because add > s and [18], by (Copy) 18] add*(s(X), Y) >= add(X, Y) because add in Mul, [19] and [22], by (Stat) 19] s(X) > X because [20], by definition 20] s*(X) >= X because [21], by (Select) 21] X >= X by (Meta) 22] Y >= Y by (Meta) 23] mult(_|_, X) >= _|_ by (Bot) 24] mult(s(X), Y) >= add(mult(X, Y), Y) because [25], by (Star) 25] mult*(s(X), Y) >= add(mult(X, Y), Y) because mult > add, [26] and [31], by (Copy) 26] mult*(s(X), Y) >= mult(X, Y) because mult in Mul, [27] and [30], by (Stat) 27] s(X) > X because [28], by definition 28] s*(X) >= X because [29], by (Select) 29] X >= X by (Meta) 30] Y >= Y by (Meta) 31] mult*(s(X), Y) >= Y because [30], by (Select) 32] rec(F, X, _|_) >= X because [33], by (Star) 33] rec*(F, X, _|_) >= X because [34], by (Select) 34] X >= X by (Meta) 35] rec(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) because [36], by (Star) 36] rec*(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) because rec > @_{o -> o}, [37] and [42], by (Copy) 37] rec*(F, X, s(Y)) >= @_{o -> o -> o}(F, s(Y)) because rec > @_{o -> o -> o}, [38] and [39], by (Copy) 38] rec*(F, X, s(Y)) >= F because [6], by (Select) 39] rec*(F, X, s(Y)) >= s(Y) because [40], by (Select) 40] s(Y) >= s(Y) because s in Mul and [41], by (Fun) 41] Y >= Y by (Meta) 42] rec*(F, X, s(Y)) >= rec(F, X, Y) because rec in Mul, [6], [7] and [8], by (Stat) 43] #argfun-fact#(rec(/\x./\y.mult(x, y), s(_|_), X)) >= rec(/\x./\y.mult(x, y), s(_|_), X) because [44], by (Star) 44] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= rec(/\x./\y.mult(x, y), s(_|_), X) because #argfun-fact# > rec, [45], [52] and [54], by (Copy) 45] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= /\x./\y.mult(x, y) because [46], by (F-Abs) 46] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z) >= /\x.mult(z, x) because [47], by (F-Abs) 47] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z, u) >= mult(z, u) because #argfun-fact# > mult, [48] and [50], by (Copy) 48] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z, u) >= z because [49], by (Select) 49] z >= z by (Var) 50] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z, u) >= u because [51], by (Select) 51] u >= u by (Var) 52] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= s(_|_) because #argfun-fact# > s and [53], by (Copy) 53] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= _|_ by (Bot) 54] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= X because [55], by (Select) 55] rec(/\x./\y.mult(x, y), s(_|_), X) >= X because [56], by (Star) 56] rec*(/\x./\y.mult(x, y), s(_|_), X) >= X because [57], by (Select) 57] 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, static, formative) by (P_2, R_0, static, formative), where P_2 consists of: add#(s(X), Y) =#> add#(X, Y) mult#(s(X), Y) =#> add#(mult(X, Y), Y) mult#(s(X), Y) =#> mult#(X, Y) rec#(F, X, s(Y)) =#> rec#(F, X, Y) Thus, the original system is terminating if (P_2, R_0, static, formative) is finite. We consider the dependency pair problem (P_2, R_0, static, formative). 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: add#(s(X), Y) >? add#(X, Y) mult#(s(X), Y) >? add#(mult(X, Y), Y) mult#(s(X), Y) >? mult#(X, Y) rec#(F, X, s(Y)) >? rec#(F, X, Y) add(0, X) >= X add(s(X), Y) >= s(add(X, Y)) mult(0, X) >= 0 mult(s(X), Y) >= add(mult(X, Y), Y) rec(F, X, 0) >= X rec(F, X, s(Y)) >= F s(Y) rec(F, X, Y) fact(X) >= rec(/\x./\y.mult(x, y), s(0), X) We apply [Kop12, Thm. 6.75] and use the following argument functions: pi( fact(X) ) = #argfun-fact#(rec(/\x./\y.mult(x, y), s(0), 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: [[0]] = _|_ [[add#(x_1, x_2)]] = add#(x_2) [[fact(x_1)]] = x_1 We choose Lex = {} and Mul = {#argfun-fact#, @_{o -> o -> o}, @_{o -> o}, add, add#, mult, mult#, rec, rec#, s}, and the following precedence: #argfun-fact# > mult > rec > add > @_{o -> o} > @_{o -> o -> o} > rec# > s > add# = mult# Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: add#(X) >= add#(X) mult#(s(X), Y) > add#(Y) mult#(s(X), Y) > mult#(X, Y) rec#(F, X, s(Y)) >= rec#(F, X, Y) add(_|_, X) >= X add(s(X), Y) >= s(add(X, Y)) mult(_|_, X) >= _|_ mult(s(X), Y) >= add(mult(X, Y), Y) rec(F, X, _|_) >= X rec(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) #argfun-fact#(rec(/\x./\y.mult(x, y), s(_|_), X)) >= rec(/\x./\y.mult(x, y), s(_|_), X) With these choices, we have: 1] add#(X) >= add#(X) because add# in Mul and [2], by (Fun) 2] X >= X by (Meta) 3] mult#(s(X), Y) > add#(Y) because [4], by definition 4] mult#*(s(X), Y) >= add#(Y) because mult# = add#, mult# in Mul and [5], by (Stat) 5] Y >= Y by (Meta) 6] mult#(s(X), Y) > mult#(X, Y) because [7], by definition 7] mult#*(s(X), Y) >= mult#(X, Y) because mult# in Mul, [8] and [5], by (Stat) 8] s(X) > X because [9], by definition 9] s*(X) >= X because [10], by (Select) 10] X >= X by (Meta) 11] rec#(F, X, s(Y)) >= rec#(F, X, Y) because [12], by (Star) 12] rec#*(F, X, s(Y)) >= rec#(F, X, Y) because rec# in Mul, [13], [14] and [15], by (Stat) 13] F >= F by (Meta) 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] add(_|_, X) >= X because [19], by (Star) 19] add*(_|_, X) >= X because [20], by (Select) 20] X >= X by (Meta) 21] add(s(X), Y) >= s(add(X, Y)) because [22], by (Star) 22] add*(s(X), Y) >= s(add(X, Y)) because add > s and [23], by (Copy) 23] add*(s(X), Y) >= add(X, Y) because add in Mul, [24] and [2], by (Stat) 24] s(X) > X because [25], by definition 25] s*(X) >= X because [26], by (Select) 26] X >= X by (Meta) 27] mult(_|_, X) >= _|_ by (Bot) 28] mult(s(X), Y) >= add(mult(X, Y), Y) because [29], by (Star) 29] mult*(s(X), Y) >= add(mult(X, Y), Y) because mult > add, [30] and [31], by (Copy) 30] mult*(s(X), Y) >= mult(X, Y) because mult in Mul, [8] and [5], by (Stat) 31] mult*(s(X), Y) >= Y because [5], by (Select) 32] rec(F, X, _|_) >= X because [33], by (Star) 33] rec*(F, X, _|_) >= X because [34], by (Select) 34] X >= X by (Meta) 35] rec(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) because [36], by (Star) 36] rec*(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) because rec > @_{o -> o}, [37] and [42], by (Copy) 37] rec*(F, X, s(Y)) >= @_{o -> o -> o}(F, s(Y)) because rec > @_{o -> o -> o}, [38] and [39], by (Copy) 38] rec*(F, X, s(Y)) >= F because [13], by (Select) 39] rec*(F, X, s(Y)) >= s(Y) because [40], by (Select) 40] s(Y) >= s(Y) because s in Mul and [41], by (Fun) 41] Y >= Y by (Meta) 42] rec*(F, X, s(Y)) >= rec(F, X, Y) because rec in Mul, [13], [14] and [15], by (Stat) 43] #argfun-fact#(rec(/\x./\y.mult(x, y), s(_|_), X)) >= rec(/\x./\y.mult(x, y), s(_|_), X) because [44], by (Star) 44] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= rec(/\x./\y.mult(x, y), s(_|_), X) because #argfun-fact# > rec, [45], [52] and [54], by (Copy) 45] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= /\x./\y.mult(x, y) because [46], by (F-Abs) 46] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z) >= /\x.mult(z, x) because [47], by (F-Abs) 47] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z, u) >= mult(z, u) because #argfun-fact# > mult, [48] and [50], by (Copy) 48] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z, u) >= z because [49], by (Select) 49] z >= z by (Var) 50] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z, u) >= u because [51], by (Select) 51] u >= u by (Var) 52] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= s(_|_) because #argfun-fact# > s and [53], by (Copy) 53] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= _|_ by (Bot) 54] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= X because [55], by (Select) 55] rec(/\x./\y.mult(x, y), s(_|_), X) >= X because [56], by (Star) 56] rec*(/\x./\y.mult(x, y), s(_|_), X) >= X because [57], by (Select) 57] 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, static, formative) by (P_3, R_0, static, formative), where P_3 consists of: add#(s(X), Y) =#> add#(X, Y) rec#(F, X, s(Y)) =#> rec#(F, X, Y) Thus, the original system is terminating if (P_3, R_0, static, formative) is finite. We consider the dependency pair problem (P_3, R_0, static, formative). 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: add#(s(X), Y) >? add#(X, Y) rec#(F, X, s(Y)) >? rec#(F, X, Y) add(0, X) >= X add(s(X), Y) >= s(add(X, Y)) mult(0, X) >= 0 mult(s(X), Y) >= add(mult(X, Y), Y) rec(F, X, 0) >= X rec(F, X, s(Y)) >= F s(Y) rec(F, X, Y) fact(X) >= rec(/\x./\y.mult(x, y), s(0), X) We apply [Kop12, Thm. 6.75] and use the following argument functions: pi( fact(X) ) = #argfun-fact#(rec(/\x./\y.mult(x, y), s(0), 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-fact#(x_1)]] = x_1 [[add#(x_1, x_2)]] = x_1 [[fact(x_1)]] = x_1 We choose Lex = {} and Mul = {0, @_{o -> o -> o}, @_{o -> o}, add, mult, rec, rec#, s}, and the following precedence: mult > 0 > add > rec > @_{o -> o -> o} > @_{o -> o} > rec# > s Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: s(X) > X rec#(F, X, s(Y)) >= rec#(F, X, Y) add(0, X) >= X add(s(X), Y) >= s(add(X, Y)) mult(0, X) >= 0 mult(s(X), Y) >= add(mult(X, Y), Y) rec(F, X, 0) >= X rec(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) rec(/\x./\y.mult(x, y), s(0), X) >= rec(/\x./\y.mult(x, y), s(0), X) With these choices, we have: 1] s(X) > X because [2], by definition 2] s*(X) >= X because [3], by (Select) 3] X >= X by (Meta) 4] rec#(F, X, s(Y)) >= rec#(F, X, Y) because [5], by (Star) 5] rec#*(F, X, s(Y)) >= rec#(F, X, Y) because rec# in Mul, [6], [7] and [8], by (Stat) 6] F >= F by (Meta) 7] X >= X by (Meta) 8] s(Y) > Y because [9], by definition 9] s*(Y) >= Y because [10], by (Select) 10] Y >= Y by (Meta) 11] add(0, X) >= X because [12], by (Star) 12] add*(0, X) >= X because [13], by (Select) 13] X >= X by (Meta) 14] add(s(X), Y) >= s(add(X, Y)) because [15], by (Star) 15] add*(s(X), Y) >= s(add(X, Y)) because add > s and [16], by (Copy) 16] add*(s(X), Y) >= add(X, Y) because add in Mul, [17] and [18], by (Stat) 17] s(X) > X because [2], by definition 18] Y >= Y by (Meta) 19] mult(0, X) >= 0 because [20], by (Star) 20] mult*(0, X) >= 0 because mult > 0, by (Copy) 21] mult(s(X), Y) >= add(mult(X, Y), Y) because [22], by (Star) 22] mult*(s(X), Y) >= add(mult(X, Y), Y) because mult > add, [23] and [28], by (Copy) 23] mult*(s(X), Y) >= mult(X, Y) because mult in Mul, [24] and [27], by (Stat) 24] s(X) > X because [25], by definition 25] s*(X) >= X because [26], by (Select) 26] X >= X by (Meta) 27] Y >= Y by (Meta) 28] mult*(s(X), Y) >= Y because [27], by (Select) 29] rec(F, X, 0) >= X because [30], by (Star) 30] rec*(F, X, 0) >= X because [31], by (Select) 31] X >= X by (Meta) 32] rec(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) because [33], by (Star) 33] rec*(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) because rec > @_{o -> o}, [34] and [39], by (Copy) 34] rec*(F, X, s(Y)) >= @_{o -> o -> o}(F, s(Y)) because rec > @_{o -> o -> o}, [35] and [36], by (Copy) 35] rec*(F, X, s(Y)) >= F because [6], by (Select) 36] rec*(F, X, s(Y)) >= s(Y) because [37], by (Select) 37] s(Y) >= s(Y) because s in Mul and [38], by (Fun) 38] Y >= Y by (Meta) 39] rec*(F, X, s(Y)) >= rec(F, X, Y) because rec in Mul, [6], [7] and [8], by (Stat) 40] rec(/\x./\y.mult(x, y), s(0), X) >= rec(/\x./\y.mult(x, y), s(0), X) because rec in Mul, [41], [46] and [48], by (Fun) 41] /\x./\z.mult(x, z) >= /\x./\z.mult(x, z) because [42], by (Abs) 42] /\z.mult(y, z) >= /\z.mult(y, z) because [43], by (Abs) 43] mult(y, x) >= mult(y, x) because mult in Mul, [44] and [45], by (Fun) 44] y >= y by (Var) 45] x >= x by (Var) 46] s(0) >= s(0) because s in Mul and [47], by (Fun) 47] 0 >= 0 by (Fun) 48] 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_3, R_0, static, formative) by (P_4, R_0, static, formative), where P_4 consists of: rec#(F, X, s(Y)) =#> rec#(F, X, Y) Thus, the original system is terminating if (P_4, R_0, static, formative) is finite. We consider the dependency pair problem (P_4, R_0, static, formative). 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: rec#(F, X, s(Y)) >? rec#(F, X, Y) add(0, X) >= X add(s(X), Y) >= s(add(X, Y)) mult(0, X) >= 0 mult(s(X), Y) >= add(mult(X, Y), Y) rec(F, X, 0) >= X rec(F, X, s(Y)) >= F s(Y) rec(F, X, Y) fact(X) >= rec(/\x./\y.mult(x, y), s(0), X) We apply [Kop12, Thm. 6.75] and use the following argument functions: pi( fact(X) ) = #argfun-fact#(rec(/\x./\y.mult(x, y), s(0), 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: [[0]] = _|_ [[fact(x_1)]] = x_1 We choose Lex = {} and Mul = {#argfun-fact#, @_{o -> o -> o}, @_{o -> o}, add, mult, rec, rec#, s}, and the following precedence: #argfun-fact# > mult > add > rec > @_{o -> o -> o} > @_{o -> o} > rec# > s Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: rec#(F, X, s(Y)) > rec#(F, X, Y) add(_|_, X) >= X add(s(X), Y) >= s(add(X, Y)) mult(_|_, X) >= _|_ mult(s(X), Y) >= add(mult(X, Y), Y) rec(F, X, _|_) >= X rec(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) #argfun-fact#(rec(/\x./\y.mult(x, y), s(_|_), X)) >= rec(/\x./\y.mult(x, y), s(_|_), X) With these choices, we have: 1] rec#(F, X, s(Y)) > rec#(F, X, Y) because [2], by definition 2] rec#*(F, X, s(Y)) >= rec#(F, X, Y) because rec# in Mul, [3], [4] and [5], by (Stat) 3] F >= F by (Meta) 4] X >= X by (Meta) 5] s(Y) > Y because [6], by definition 6] s*(Y) >= Y because [7], by (Select) 7] Y >= Y by (Meta) 8] add(_|_, X) >= X because [9], by (Star) 9] add*(_|_, X) >= X because [10], by (Select) 10] X >= X by (Meta) 11] add(s(X), Y) >= s(add(X, Y)) because [12], by (Star) 12] add*(s(X), Y) >= s(add(X, Y)) because add > s and [13], by (Copy) 13] add*(s(X), Y) >= add(X, Y) because add in Mul, [14] and [17], by (Stat) 14] s(X) > X because [15], by definition 15] s*(X) >= X because [16], by (Select) 16] X >= X by (Meta) 17] Y >= Y by (Meta) 18] mult(_|_, X) >= _|_ by (Bot) 19] mult(s(X), Y) >= add(mult(X, Y), Y) because [20], by (Star) 20] mult*(s(X), Y) >= add(mult(X, Y), Y) because mult > add, [21] and [26], by (Copy) 21] mult*(s(X), Y) >= mult(X, Y) because mult in Mul, [22] and [25], by (Stat) 22] s(X) > X because [23], by definition 23] s*(X) >= X because [24], by (Select) 24] X >= X by (Meta) 25] Y >= Y by (Meta) 26] mult*(s(X), Y) >= Y because [25], by (Select) 27] rec(F, X, _|_) >= X because [28], by (Star) 28] rec*(F, X, _|_) >= X because [29], by (Select) 29] X >= X by (Meta) 30] rec(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) because [31], by (Star) 31] rec*(F, X, s(Y)) >= @_{o -> o}(@_{o -> o -> o}(F, s(Y)), rec(F, X, Y)) because rec > @_{o -> o}, [32] and [37], by (Copy) 32] rec*(F, X, s(Y)) >= @_{o -> o -> o}(F, s(Y)) because rec > @_{o -> o -> o}, [33] and [34], by (Copy) 33] rec*(F, X, s(Y)) >= F because [3], by (Select) 34] rec*(F, X, s(Y)) >= s(Y) because rec > s and [35], by (Copy) 35] rec*(F, X, s(Y)) >= Y because [36], by (Select) 36] s(Y) >= Y because [6], by (Star) 37] rec*(F, X, s(Y)) >= rec(F, X, Y) because rec in Mul, [3], [4] and [5], by (Stat) 38] #argfun-fact#(rec(/\x./\y.mult(x, y), s(_|_), X)) >= rec(/\x./\y.mult(x, y), s(_|_), X) because [39], by (Star) 39] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= rec(/\x./\y.mult(x, y), s(_|_), X) because #argfun-fact# > rec, [40], [47] and [51], by (Copy) 40] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= /\x./\y.mult(x, y) because [41], by (F-Abs) 41] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z) >= /\x.mult(z, x) because [42], by (F-Abs) 42] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z, u) >= mult(z, u) because #argfun-fact# > mult, [43] and [45], by (Copy) 43] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z, u) >= z because [44], by (Select) 44] z >= z by (Var) 45] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X), z, u) >= u because [46], by (Select) 46] u >= u by (Var) 47] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= s(_|_) because [48], by (Select) 48] rec(/\x./\y.mult(x, y), s(_|_), X) >= s(_|_) because [49], by (Star) 49] rec*(/\x./\y.mult(x, y), s(_|_), X) >= s(_|_) because rec > s and [50], by (Copy) 50] rec*(/\x./\y.mult(x, y), s(_|_), X) >= _|_ by (Bot) 51] #argfun-fact#*(rec(/\x./\y.mult(x, y), s(_|_), X)) >= X because [52], by (Select) 52] rec(/\x./\y.mult(x, y), s(_|_), X) >= X because [53], by (Star) 53] rec*(/\x./\y.mult(x, y), s(_|_), X) >= X because [54], by (Select) 54] 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_4, R_0) by ({}, R_0). 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 +++ [Kop12] C. Kop. Higher Order Termination. PhD Thesis, 2012. [Kop13] C. Kop. Static Dependency Pairs with Accessibility. Unpublished manuscript, http://cl-informatik.uibk.ac.at/users/kop/static.pdf, 2013. [KusIsoSakBla09] K. Kusakari, Y. Isogai, M. Sakai, and F. Blanqui. Static Dependency Pair Method Based On Strong Computability for Higher-Order Rewrite Systems. In volume 92(10) of IEICE Transactions on Information and Systems. 2007--2015, 2009.