0.00/0.59 YES 0.60/0.63 We consider the system theBenchmark. 0.60/0.63 0.60/0.63 Alphabet: 0.60/0.63 0.60/0.63 0 : [] --> b 0.60/0.63 cons : [b * a] --> a 0.60/0.63 double : [] --> a -> a 0.60/0.63 inc : [] --> a -> a 0.60/0.63 map : [b -> b] --> a -> a 0.60/0.63 nil : [] --> a 0.60/0.63 plus : [b] --> b -> b 0.60/0.63 s : [b] --> b 0.60/0.63 times : [b] --> b -> b 0.60/0.63 0.60/0.63 Rules: 0.60/0.63 0.60/0.63 plus(0) x => x 0.60/0.63 plus(s(x)) y => s(plus(x) y) 0.60/0.63 times(0) x => 0 0.60/0.63 times(s(x)) y => plus(times(x) y) y 0.60/0.63 map(f) nil => nil 0.60/0.63 map(f) cons(x, y) => cons(f x, map(f) y) 0.60/0.63 inc => map(plus(s(0))) 0.60/0.63 double => map(times(s(s(0)))) 0.60/0.63 0.60/0.63 This AFS is converted to an AFSM simply by replacing all free variables by meta-variables (with arity 0). 0.60/0.63 0.60/0.63 We use rule removal, following [Kop12, Theorem 2.23]. 0.60/0.63 0.60/0.63 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 0.60/0.63 0.60/0.63 plus(0) X >? X 0.60/0.63 plus(s(X)) Y >? s(plus(X) Y) 0.60/0.63 times(0) X >? 0 0.60/0.63 times(s(X)) Y >? plus(times(X) Y) Y 0.60/0.63 map(F) nil >? nil 0.60/0.63 map(F) cons(X, Y) >? cons(F X, map(F) Y) 0.60/0.63 inc >? map(plus(s(0))) 0.60/0.63 double >? map(times(s(s(0)))) 0.60/0.63 0.60/0.63 We use a recursive path ordering as defined in [Kop12, Chapter 5]. 0.60/0.63 0.60/0.63 Argument functions: 0.60/0.63 0.60/0.63 [[0]] = _|_ 0.60/0.63 [[nil]] = _|_ 0.60/0.63 0.60/0.63 We choose Lex = {} and Mul = {@_{o -> o}, cons, double, inc, map, plus, s, times}, and the following precedence: double > inc > times > plus > @_{o -> o} > cons > map > s 0.60/0.63 0.60/0.63 Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: 0.60/0.63 0.60/0.63 @_{o -> o}(plus(_|_), X) >= X 0.60/0.63 @_{o -> o}(plus(s(X)), Y) >= s(@_{o -> o}(plus(X), Y)) 0.60/0.63 @_{o -> o}(times(_|_), X) >= _|_ 0.60/0.63 @_{o -> o}(times(s(X)), Y) >= @_{o -> o}(plus(@_{o -> o}(times(X), Y)), Y) 0.60/0.63 @_{o -> o}(map(F), _|_) >= _|_ 0.60/0.63 @_{o -> o}(map(F), cons(X, Y)) > cons(@_{o -> o}(F, X), @_{o -> o}(map(F), Y)) 0.60/0.63 inc > map(plus(s(_|_))) 0.60/0.63 double > map(times(s(s(_|_)))) 0.60/0.63 0.60/0.63 With these choices, we have: 0.60/0.63 0.60/0.63 1] @_{o -> o}(plus(_|_), X) >= X because [2], by (Star) 0.60/0.63 2] @_{o -> o}*(plus(_|_), X) >= X because [3], by (Select) 0.60/0.63 3] X >= X by (Meta) 0.60/0.63 0.60/0.63 4] @_{o -> o}(plus(s(X)), Y) >= s(@_{o -> o}(plus(X), Y)) because [5], by (Star) 0.60/0.63 5] @_{o -> o}*(plus(s(X)), Y) >= s(@_{o -> o}(plus(X), Y)) because @_{o -> o} > s and [6], by (Copy) 0.60/0.63 6] @_{o -> o}*(plus(s(X)), Y) >= @_{o -> o}(plus(X), Y) because [7], by (Select) 0.60/0.63 7] plus(s(X)) @_{o -> o}*(plus(s(X)), Y) >= @_{o -> o}(plus(X), Y) because [8] 0.60/0.63 8] plus*(s(X), @_{o -> o}*(plus(s(X)), Y)) >= @_{o -> o}(plus(X), Y) because plus > @_{o -> o}, [9] and [13], by (Copy) 0.60/0.63 9] plus*(s(X), @_{o -> o}*(plus(s(X)), Y)) >= plus(X) because plus in Mul and [10], by (Stat) 0.60/0.63 10] s(X) > X because [11], by definition 0.60/0.63 11] s*(X) >= X because [12], by (Select) 0.60/0.63 12] X >= X by (Meta) 0.60/0.63 13] plus*(s(X), @_{o -> o}*(plus(s(X)), Y)) >= Y because [14], by (Select) 0.60/0.63 14] @_{o -> o}*(plus(s(X)), Y) >= Y because [15], by (Select) 0.60/0.63 15] Y >= Y by (Meta) 0.60/0.63 0.60/0.63 16] @_{o -> o}(times(_|_), X) >= _|_ by (Bot) 0.60/0.63 0.60/0.63 17] @_{o -> o}(times(s(X)), Y) >= @_{o -> o}(plus(@_{o -> o}(times(X), Y)), Y) because [18], by (Star) 0.60/0.63 18] @_{o -> o}*(times(s(X)), Y) >= @_{o -> o}(plus(@_{o -> o}(times(X), Y)), Y) because [19], by (Select) 0.60/0.63 19] times(s(X)) @_{o -> o}*(times(s(X)), Y) >= @_{o -> o}(plus(@_{o -> o}(times(X), Y)), Y) because [20] 0.60/0.63 20] times*(s(X), @_{o -> o}*(times(s(X)), Y)) >= @_{o -> o}(plus(@_{o -> o}(times(X), Y)), Y) because times > @_{o -> o}, [21] and [27], by (Copy) 0.60/0.63 21] times*(s(X), @_{o -> o}*(times(s(X)), Y)) >= plus(@_{o -> o}(times(X), Y)) because times > plus and [22], by (Copy) 0.60/0.63 22] times*(s(X), @_{o -> o}*(times(s(X)), Y)) >= @_{o -> o}(times(X), Y) because times > @_{o -> o}, [23] and [27], by (Copy) 0.60/0.63 23] times*(s(X), @_{o -> o}*(times(s(X)), Y)) >= times(X) because times in Mul and [24], by (Stat) 0.60/0.63 24] s(X) > X because [25], by definition 0.60/0.63 25] s*(X) >= X because [26], by (Select) 0.60/0.63 26] X >= X by (Meta) 0.60/0.63 27] times*(s(X), @_{o -> o}*(times(s(X)), Y)) >= Y because [28], by (Select) 0.60/0.63 28] @_{o -> o}*(times(s(X)), Y) >= Y because [29], by (Select) 0.60/0.63 29] Y >= Y by (Meta) 0.60/0.63 0.60/0.63 30] @_{o -> o}(map(F), _|_) >= _|_ by (Bot) 0.60/0.63 0.60/0.63 31] @_{o -> o}(map(F), cons(X, Y)) > cons(@_{o -> o}(F, X), @_{o -> o}(map(F), Y)) because [32], by definition 0.60/0.63 32] @_{o -> o}*(map(F), cons(X, Y)) >= cons(@_{o -> o}(F, X), @_{o -> o}(map(F), Y)) because @_{o -> o} > cons, [33] and [43], by (Copy) 0.60/0.63 33] @_{o -> o}*(map(F), cons(X, Y)) >= @_{o -> o}(F, X) because [34], by (Select) 0.60/0.63 34] map(F) @_{o -> o}*(map(F), cons(X, Y)) >= @_{o -> o}(F, X) because [35] 0.60/0.63 35] map*(F, @_{o -> o}*(map(F), cons(X, Y))) >= @_{o -> o}(F, X) because [36], by (Select) 0.60/0.63 36] @_{o -> o}*(map(F), cons(X, Y)) >= @_{o -> o}(F, X) because @_{o -> o} in Mul, [37] and [40], by (Stat) 0.60/0.63 37] map(F) >= F because [38], by (Star) 0.60/0.63 38] map*(F) >= F because [39], by (Select) 0.60/0.63 39] F >= F by (Meta) 0.60/0.63 40] cons(X, Y) > X because [41], by definition 0.60/0.63 41] cons*(X, Y) >= X because [42], by (Select) 0.60/0.63 42] X >= X by (Meta) 0.60/0.63 43] @_{o -> o}*(map(F), cons(X, Y)) >= @_{o -> o}(map(F), Y) because @_{o -> o} in Mul, [44] and [46], by (Stat) 0.60/0.63 44] map(F) >= map(F) because map in Mul and [45], by (Fun) 0.60/0.63 45] F >= F by (Meta) 0.60/0.63 46] cons(X, Y) > Y because [47], by definition 0.60/0.63 47] cons*(X, Y) >= Y because [48], by (Select) 0.60/0.63 48] Y >= Y by (Meta) 0.60/0.63 0.60/0.63 49] inc > map(plus(s(_|_))) because [50], by definition 0.60/0.63 50] inc* >= map(plus(s(_|_))) because inc > map and [51], by (Copy) 0.60/0.63 51] inc* >= plus(s(_|_)) because inc > plus and [52], by (Copy) 0.60/0.63 52] inc* >= s(_|_) because inc > s and [53], by (Copy) 0.60/0.63 53] inc* >= _|_ by (Bot) 0.60/0.63 0.60/0.63 54] double > map(times(s(s(_|_)))) because [55], by definition 0.60/0.63 55] double* >= map(times(s(s(_|_)))) because double > map and [56], by (Copy) 0.60/0.63 56] double* >= times(s(s(_|_))) because double > times and [57], by (Copy) 0.60/0.63 57] double* >= s(s(_|_)) because double > s and [58], by (Copy) 0.60/0.63 58] double* >= s(_|_) because double > s and [59], by (Copy) 0.60/0.63 59] double* >= _|_ by (Bot) 0.60/0.63 0.60/0.63 We can thus remove the following rules: 0.60/0.63 0.60/0.63 map(F) cons(X, Y) => cons(F X, map(F) Y) 0.60/0.63 inc => map(plus(s(0))) 0.60/0.63 double => map(times(s(s(0)))) 0.60/0.63 0.60/0.63 We use rule removal, following [Kop12, Theorem 2.23]. 0.60/0.63 0.60/0.63 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 0.60/0.63 0.60/0.63 plus(0, X) >? X 0.60/0.63 plus(s(X), Y) >? s(plus(X, Y)) 0.60/0.63 times(0, X) >? 0 0.60/0.63 times(s(X), Y) >? plus(times(X, Y), Y) 0.60/0.63 map(F, nil) >? nil 0.60/0.63 0.60/0.63 We use a recursive path ordering as defined in [Kop12, Chapter 5]. 0.60/0.63 0.60/0.63 Argument functions: 0.60/0.63 0.60/0.63 [[0]] = _|_ 0.60/0.63 [[nil]] = _|_ 0.60/0.63 0.60/0.63 We choose Lex = {} and Mul = {map, plus, s, times}, and the following precedence: map > times > plus > s 0.60/0.63 0.60/0.63 Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: 0.60/0.63 0.60/0.63 plus(_|_, X) >= X 0.60/0.63 plus(s(X), Y) > s(plus(X, Y)) 0.60/0.63 times(_|_, X) >= _|_ 0.60/0.63 times(s(X), Y) >= plus(times(X, Y), Y) 0.60/0.63 map(F, _|_) >= _|_ 0.60/0.63 0.60/0.63 With these choices, we have: 0.60/0.63 0.60/0.63 1] plus(_|_, X) >= X because [2], by (Star) 0.60/0.63 2] plus*(_|_, X) >= X because [3], by (Select) 0.60/0.63 3] X >= X by (Meta) 0.60/0.63 0.60/0.63 4] plus(s(X), Y) > s(plus(X, Y)) because [5], by definition 0.60/0.63 5] plus*(s(X), Y) >= s(plus(X, Y)) because plus > s and [6], by (Copy) 0.60/0.63 6] plus*(s(X), Y) >= plus(X, Y) because plus in Mul, [7] and [10], by (Stat) 0.60/0.63 7] s(X) > X because [8], by definition 0.60/0.63 8] s*(X) >= X because [9], by (Select) 0.60/0.63 9] X >= X by (Meta) 0.60/0.63 10] Y >= Y by (Meta) 0.60/0.63 0.60/0.63 11] times(_|_, X) >= _|_ by (Bot) 0.60/0.63 0.60/0.63 12] times(s(X), Y) >= plus(times(X, Y), Y) because [13], by (Star) 0.60/0.63 13] times*(s(X), Y) >= plus(times(X, Y), Y) because times > plus, [14] and [19], by (Copy) 0.60/0.63 14] times*(s(X), Y) >= times(X, Y) because times in Mul, [15] and [18], by (Stat) 0.60/0.63 15] s(X) > X because [16], by definition 0.60/0.63 16] s*(X) >= X because [17], by (Select) 0.60/0.63 17] X >= X by (Meta) 0.60/0.63 18] Y >= Y by (Meta) 0.60/0.63 19] times*(s(X), Y) >= Y because [18], by (Select) 0.60/0.63 0.60/0.63 20] map(F, _|_) >= _|_ by (Bot) 0.60/0.63 0.60/0.63 We can thus remove the following rules: 0.60/0.63 0.60/0.63 plus(s(X), Y) => s(plus(X, Y)) 0.60/0.63 0.60/0.63 We use rule removal, following [Kop12, Theorem 2.23]. 0.60/0.63 0.60/0.63 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 0.60/0.63 0.60/0.63 plus(0, X) >? X 0.60/0.63 times(0, X) >? 0 0.60/0.63 times(s(X), Y) >? plus(times(X, Y), Y) 0.60/0.63 map(F, nil) >? nil 0.60/0.63 0.60/0.63 We use a recursive path ordering as defined in [Kop12, Chapter 5]. 0.60/0.63 0.60/0.63 Argument functions: 0.60/0.63 0.60/0.63 [[0]] = _|_ 0.60/0.63 [[nil]] = _|_ 0.60/0.63 0.60/0.63 We choose Lex = {} and Mul = {map, plus, s, times}, and the following precedence: s > map > times > plus 0.60/0.63 0.60/0.63 Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: 0.60/0.63 0.60/0.63 plus(_|_, X) >= X 0.60/0.63 times(_|_, X) > _|_ 0.60/0.63 times(s(X), Y) >= plus(times(X, Y), Y) 0.60/0.63 map(F, _|_) >= _|_ 0.60/0.63 0.60/0.63 With these choices, we have: 0.60/0.63 0.60/0.63 1] plus(_|_, X) >= X because [2], by (Star) 0.60/0.63 2] plus*(_|_, X) >= X because [3], by (Select) 0.60/0.63 3] X >= X by (Meta) 0.60/0.63 0.60/0.63 4] times(_|_, X) > _|_ because [5], by definition 0.60/0.63 5] times*(_|_, X) >= _|_ by (Bot) 0.60/0.63 0.60/0.63 6] times(s(X), Y) >= plus(times(X, Y), Y) because [7], by (Star) 0.60/0.63 7] times*(s(X), Y) >= plus(times(X, Y), Y) because times > plus, [8] and [13], by (Copy) 0.60/0.63 8] times*(s(X), Y) >= times(X, Y) because times in Mul, [9] and [12], by (Stat) 0.60/0.63 9] s(X) > X because [10], by definition 0.60/0.63 10] s*(X) >= X because [11], by (Select) 0.60/0.63 11] X >= X by (Meta) 0.60/0.63 12] Y >= Y by (Meta) 0.60/0.63 13] times*(s(X), Y) >= Y because [12], by (Select) 0.60/0.63 0.60/0.63 14] map(F, _|_) >= _|_ by (Bot) 0.60/0.63 0.60/0.63 We can thus remove the following rules: 0.60/0.63 0.60/0.63 times(0, X) => 0 0.60/0.63 0.60/0.63 We use rule removal, following [Kop12, Theorem 2.23]. 0.60/0.63 0.60/0.63 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 0.60/0.63 0.60/0.63 plus(0, X) >? X 0.60/0.63 times(s(X), Y) >? plus(times(X, Y), Y) 0.60/0.63 map(F, nil) >? nil 0.60/0.63 0.60/0.63 We use a recursive path ordering as defined in [Kop12, Chapter 5]. 0.60/0.63 0.60/0.63 Argument functions: 0.60/0.63 0.60/0.63 [[nil]] = _|_ 0.60/0.63 0.60/0.63 We choose Lex = {} and Mul = {0, map, plus, s, times}, and the following precedence: 0 > times > map > plus > s 0.60/0.63 0.60/0.63 Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: 0.60/0.63 0.60/0.63 plus(0, X) > X 0.60/0.63 times(s(X), Y) >= plus(times(X, Y), Y) 0.60/0.63 map(F, _|_) >= _|_ 0.60/0.63 0.60/0.63 With these choices, we have: 0.60/0.63 0.60/0.63 1] plus(0, X) > X because [2], by definition 0.60/0.63 2] plus*(0, X) >= X because [3], by (Select) 0.60/0.63 3] X >= X by (Meta) 0.60/0.63 0.60/0.63 4] times(s(X), Y) >= plus(times(X, Y), Y) because [5], by (Star) 0.60/0.63 5] times*(s(X), Y) >= plus(times(X, Y), Y) because times > plus, [6] and [11], by (Copy) 0.60/0.63 6] times*(s(X), Y) >= times(X, Y) because times in Mul, [7] and [10], by (Stat) 0.60/0.63 7] s(X) > X because [8], by definition 0.60/0.63 8] s*(X) >= X because [9], by (Select) 0.60/0.63 9] X >= X by (Meta) 0.60/0.63 10] Y >= Y by (Meta) 0.60/0.63 11] times*(s(X), Y) >= Y because [10], by (Select) 0.60/0.63 0.60/0.63 12] map(F, _|_) >= _|_ by (Bot) 0.60/0.63 0.60/0.63 We can thus remove the following rules: 0.60/0.63 0.60/0.63 plus(0, X) => X 0.60/0.63 0.60/0.63 We use rule removal, following [Kop12, Theorem 2.23]. 0.60/0.63 0.60/0.63 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 0.60/0.63 0.60/0.63 times(s(X), Y) >? plus(times(X, Y), Y) 0.60/0.63 map(F, nil) >? nil 0.60/0.63 0.60/0.63 We use a recursive path ordering as defined in [Kop12, Chapter 5]. 0.60/0.63 0.60/0.63 Argument functions: 0.60/0.63 0.60/0.63 [[nil]] = _|_ 0.60/0.63 0.60/0.63 We choose Lex = {} and Mul = {map, plus, s, times}, and the following precedence: s > map > times > plus 0.60/0.63 0.60/0.63 Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: 0.60/0.63 0.60/0.63 times(s(X), Y) >= plus(times(X, Y), Y) 0.60/0.63 map(F, _|_) > _|_ 0.60/0.63 0.60/0.63 With these choices, we have: 0.60/0.63 0.60/0.63 1] times(s(X), Y) >= plus(times(X, Y), Y) because [2], by (Star) 0.60/0.63 2] times*(s(X), Y) >= plus(times(X, Y), Y) because times > plus, [3] and [8], by (Copy) 0.60/0.63 3] times*(s(X), Y) >= times(X, Y) because times in Mul, [4] and [7], by (Stat) 0.60/0.63 4] s(X) > X because [5], by definition 0.60/0.63 5] s*(X) >= X because [6], by (Select) 0.60/0.63 6] X >= X by (Meta) 0.60/0.63 7] Y >= Y by (Meta) 0.60/0.63 8] times*(s(X), Y) >= Y because [7], by (Select) 0.60/0.63 0.60/0.63 9] map(F, _|_) > _|_ because [10], by definition 0.60/0.63 10] map*(F, _|_) >= _|_ by (Bot) 0.60/0.63 0.60/0.63 We can thus remove the following rules: 0.60/0.63 0.60/0.63 map(F, nil) => nil 0.60/0.63 0.60/0.63 We use rule removal, following [Kop12, Theorem 2.23]. 0.60/0.63 0.60/0.63 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 0.60/0.63 0.60/0.63 times(s(X), Y) >? plus(times(X, Y), Y) 0.60/0.63 0.60/0.63 We use a recursive path ordering as defined in [Kop12, Chapter 5]. 0.60/0.63 0.60/0.63 We choose Lex = {} and Mul = {plus, s, times}, and the following precedence: times > s > plus 0.60/0.63 0.60/0.63 With these choices, we have: 0.60/0.63 0.60/0.63 1] times(s(X), Y) > plus(times(X, Y), Y) because [2], by definition 0.60/0.63 2] times*(s(X), Y) >= plus(times(X, Y), Y) because times > plus, [3] and [8], by (Copy) 0.60/0.63 3] times*(s(X), Y) >= times(X, Y) because times in Mul, [4] and [7], by (Stat) 0.60/0.63 4] s(X) > X because [5], by definition 0.60/0.63 5] s*(X) >= X because [6], by (Select) 0.60/0.63 6] X >= X by (Meta) 0.60/0.63 7] Y >= Y by (Meta) 0.60/0.63 8] times*(s(X), Y) >= Y because [7], by (Select) 0.60/0.63 0.60/0.63 We can thus remove the following rules: 0.60/0.63 0.60/0.63 times(s(X), Y) => plus(times(X, Y), Y) 0.60/0.63 0.60/0.63 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. 0.60/0.63 0.60/0.63 0.60/0.63 +++ Citations +++ 0.60/0.63 0.60/0.63 [Kop12] C. Kop. Higher Order Termination. PhD Thesis, 2012. 0.60/0.63 EOF