4.53/4.58 YES 4.53/4.60 We consider the system theBenchmark. 4.53/4.60 4.53/4.60 Alphabet: 4.53/4.60 4.53/4.60 0 : [] --> c 4.53/4.60 1 : [] --> c 4.53/4.60 add : [] --> c -> a -> c 4.53/4.60 cons : [a * b] --> b 4.53/4.60 fold : [c -> a -> c * b * c] --> c 4.53/4.60 mul : [] --> c -> a -> c 4.53/4.60 nil : [] --> b 4.53/4.60 prod : [b] --> c 4.53/4.60 sum : [b] --> c 4.53/4.60 xap : [c -> a -> c * c] --> a -> c 4.53/4.60 yap : [a -> c * a] --> c 4.53/4.60 4.53/4.60 Rules: 4.53/4.60 4.53/4.60 fold(/\x./\y.yap(xap(f, x), y), nil, z) => z 4.53/4.60 fold(/\x./\y.yap(xap(f, x), y), cons(z, u), v) => fold(/\w./\x'.yap(xap(f, w), x'), u, yap(xap(f, v), z)) 4.53/4.60 sum(x) => fold(/\y./\z.yap(xap(add, y), z), x, 0) 4.53/4.60 fold(mul, x, 1) => prod(x) 4.53/4.60 xap(f, x) => f x 4.53/4.60 yap(f, x) => f x 4.53/4.60 4.53/4.60 This AFS is converted to an AFSM simply by replacing all free variables by meta-variables (with arity 0). 4.53/4.60 4.53/4.60 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: 4.53/4.60 4.53/4.60 Alphabet: 4.53/4.60 4.53/4.60 0 : [] --> c 4.53/4.60 1 : [] --> c 4.53/4.60 add : [c] --> a -> c 4.53/4.60 cons : [a * b] --> b 4.53/4.60 fold : [c -> a -> c * b * c] --> c 4.53/4.60 mul : [] --> c -> a -> c 4.53/4.60 nil : [] --> b 4.53/4.60 prod : [b] --> c 4.53/4.60 sum : [b] --> c 4.53/4.60 yap : [a -> c * a] --> c 4.53/4.60 4.53/4.60 Rules: 4.53/4.60 4.53/4.60 fold(/\x./\y.yap(F(x), y), nil, X) => X 4.53/4.60 fold(/\x./\y.yap(F(x), y), cons(X, Y), Z) => fold(/\z./\u.yap(F(z), u), Y, yap(F(Z), X)) 4.53/4.60 sum(X) => fold(/\x./\y.yap(add(x), y), X, 0) 4.53/4.60 fold(mul, X, 1) => prod(X) 4.53/4.60 yap(F, X) => F X 4.53/4.60 4.53/4.60 We use rule removal, following [Kop12, Theorem 2.23]. 4.53/4.60 4.53/4.60 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 4.53/4.60 4.53/4.60 fold(/\x./\y.yap(F(x), y), nil, X) >? X 4.53/4.60 fold(/\x./\y.yap(F(x), y), cons(X, Y), Z) >? fold(/\z./\u.yap(F(z), u), Y, yap(F(Z), X)) 4.53/4.60 sum(X) >? fold(/\x./\y.yap(add(x), y), X, 0) 4.53/4.60 fold(mul, X, 1) >? prod(X) 4.53/4.60 yap(F, X) >? F X 4.53/4.60 4.53/4.60 We use a recursive path ordering as defined in [Kop12, Chapter 5]. 4.53/4.60 4.53/4.60 Argument functions: 4.53/4.60 4.53/4.60 [[0]] = _|_ 4.53/4.60 [[fold(x_1, x_2, x_3)]] = fold(x_2, x_3, x_1) 4.53/4.60 [[prod(x_1)]] = x_1 4.53/4.60 4.53/4.60 We choose Lex = {fold} and Mul = {1, @_{o -> o}, add, cons, mul, nil, sum, yap}, and the following precedence: 1 > mul > nil > cons > sum > add > fold > yap > @_{o -> o} 4.53/4.60 4.53/4.60 Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: 4.53/4.60 4.53/4.60 fold(/\x./\y.yap(F(x), y), nil, X) >= X 4.53/4.60 fold(/\x./\y.yap(F(x), y), cons(X, Y), Z) > fold(/\x./\y.yap(F(x), y), Y, yap(F(Z), X)) 4.53/4.60 sum(X) >= fold(/\x./\y.yap(add(x), y), X, _|_) 4.53/4.60 fold(mul, X, 1) > X 4.53/4.60 yap(F, X) >= @_{o -> o}(F, X) 4.53/4.60 4.53/4.60 With these choices, we have: 4.53/4.60 4.53/4.60 1] fold(/\x./\y.yap(F(x), y), nil, X) >= X because [2], by (Star) 4.53/4.60 2] fold*(/\x./\y.yap(F(x), y), nil, X) >= X because [3], by (Select) 4.53/4.60 3] X >= X by (Meta) 4.53/4.60 4.53/4.60 4] fold(/\x./\y.yap(F(x), y), cons(X, Y), Z) > fold(/\x./\y.yap(F(x), y), Y, yap(F(Z), X)) because [5], by definition 4.53/4.60 5] fold*(/\x./\y.yap(F(x), y), cons(X, Y), Z) >= fold(/\x./\y.yap(F(x), y), Y, yap(F(Z), X)) because [6], by (Select) 4.53/4.60 6] yap(F(fold*(/\x./\y.yap(F(x), y), cons(X, Y), Z)), fold*(/\z./\u.yap(F(z), u), cons(X, Y), Z)) >= fold(/\x./\y.yap(F(x), y), Y, yap(F(Z), X)) because [7], by (Star) 4.53/4.60 7] yap*(F(fold*(/\x./\y.yap(F(x), y), cons(X, Y), Z)), fold*(/\z./\u.yap(F(z), u), cons(X, Y), Z)) >= fold(/\x./\y.yap(F(x), y), Y, yap(F(Z), X)) because [8], by (Select) 4.53/4.60 8] fold*(/\x./\y.yap(F(x), y), cons(X, Y), Z) >= fold(/\x./\y.yap(F(x), y), Y, yap(F(Z), X)) because [9], [12], [19] and [21], by (Stat) 4.53/4.60 9] cons(X, Y) > Y because [10], by definition 4.53/4.60 10] cons*(X, Y) >= Y because [11], by (Select) 4.53/4.60 11] Y >= Y by (Meta) 4.53/4.60 12] fold*(/\x./\y.yap(F(x), y), cons(X, Y), Z) >= /\x./\y.yap(F(x), y) because [13], by (Select) 4.53/4.60 13] /\x./\z.yap(F(x), z) >= /\x./\z.yap(F(x), z) because [14], by (Abs) 4.53/4.60 14] /\z.yap(F(y), z) >= /\z.yap(F(y), z) because [15], by (Abs) 4.53/4.60 15] yap(F(y), x) >= yap(F(y), x) because yap in Mul, [16] and [18], by (Fun) 4.53/4.60 16] F(y) >= F(y) because [17], by (Meta) 4.53/4.60 17] y >= y by (Var) 4.53/4.60 18] x >= x by (Var) 4.53/4.60 19] fold*(/\z./\u.yap(F(z), u), cons(X, Y), Z) >= Y because [20], by (Select) 4.53/4.60 20] cons(X, Y) >= Y because [10], by (Star) 4.53/4.60 21] fold*(/\z./\u.yap(F(z), u), cons(X, Y), Z) >= yap(F(Z), X) because fold > yap, [22] and [27], by (Copy) 4.53/4.60 22] fold*(/\z./\u.yap(F(z), u), cons(X, Y), Z) >= F(Z) because [23], by (Select) 4.53/4.60 23] /\z.yap(F(fold*(/\u./\v.yap(F(u), v), cons(X, Y), Z)), z) >= F(Z) because [24], by (Eta)[Kop13:2] 4.53/4.60 24] F(fold*(/\z./\u.yap(F(z), u), cons(X, Y), Z)) >= F(Z) because [25], by (Meta) 4.53/4.60 25] fold*(/\z./\u.yap(F(z), u), cons(X, Y), Z) >= Z because [26], by (Select) 4.53/4.60 26] Z >= Z by (Meta) 4.53/4.60 27] fold*(/\z./\u.yap(F(z), u), cons(X, Y), Z) >= X because [28], by (Select) 4.53/4.60 28] cons(X, Y) >= X because [29], by (Star) 4.53/4.60 29] cons*(X, Y) >= X because [30], by (Select) 4.53/4.60 30] X >= X by (Meta) 4.53/4.60 4.53/4.60 31] sum(X) >= fold(/\x./\y.yap(add(x), y), X, _|_) because [32], by (Star) 4.53/4.60 32] sum*(X) >= fold(/\x./\y.yap(add(x), y), X, _|_) because sum > fold, [33], [41] and [43], by (Copy) 4.53/4.60 33] sum*(X) >= /\y./\z.yap(add(y), z) because [34], by (F-Abs) 4.53/4.60 34] sum*(X, x) >= /\z.yap(add(x), z) because [35], by (F-Abs) 4.53/4.60 35] sum*(X, x, y) >= yap(add(x), y) because sum > yap, [36] and [39], by (Copy) 4.53/4.60 36] sum*(X, x, y) >= add(x) because sum > add and [37], by (Copy) 4.53/4.60 37] sum*(X, x, y) >= x because [38], by (Select) 4.53/4.60 38] x >= x by (Var) 4.53/4.60 39] sum*(X, x, y) >= y because [40], by (Select) 4.53/4.60 40] y >= y by (Var) 4.53/4.60 41] sum*(X) >= X because [42], by (Select) 4.53/4.60 42] X >= X by (Meta) 4.53/4.60 43] sum*(X) >= _|_ by (Bot) 4.53/4.60 4.53/4.60 44] fold(mul, X, 1) > X because [45], by definition 4.53/4.60 45] fold*(mul, X, 1) >= X because [46], by (Select) 4.53/4.60 46] X >= X by (Meta) 4.53/4.60 4.53/4.60 47] yap(F, X) >= @_{o -> o}(F, X) because [48], by (Star) 4.53/4.60 48] yap*(F, X) >= @_{o -> o}(F, X) because yap > @_{o -> o}, [49] and [51], by (Copy) 4.53/4.60 49] yap*(F, X) >= F because [50], by (Select) 4.53/4.60 50] F >= F by (Meta) 4.53/4.60 51] yap*(F, X) >= X because [52], by (Select) 4.53/4.60 52] X >= X by (Meta) 4.53/4.60 4.53/4.60 We can thus remove the following rules: 4.53/4.60 4.53/4.60 fold(/\x./\y.yap(F(x), y), cons(X, Y), Z) => fold(/\z./\u.yap(F(z), u), Y, yap(F(Z), X)) 4.53/4.60 fold(mul, X, 1) => prod(X) 4.53/4.60 4.53/4.60 We use rule removal, following [Kop12, Theorem 2.23]. 4.53/4.60 4.53/4.60 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 4.53/4.60 4.53/4.60 fold(/\x./\y.yap(F(x), y), nil, X) >? X 4.53/4.60 sum(X) >? fold(/\x./\y.yap(add(x), y), X, 0) 4.53/4.60 yap(F, X) >? F X 4.53/4.60 4.53/4.60 We orient these requirements with a polynomial interpretation in the natural numbers. 4.53/4.60 4.53/4.60 The following interpretation satisfies the requirements: 4.53/4.60 4.53/4.60 0 = 0 4.53/4.60 add = \y0y1.y0 4.53/4.60 fold = \G0y1y2.y1 + y2 + G0(0,0) 4.53/4.60 nil = 3 4.53/4.60 sum = \y0.3 + 3y0 4.53/4.60 yap = \G0y1.y1 + G0(y1) 4.53/4.60 4.53/4.60 Using this interpretation, the requirements translate to: 4.53/4.60 4.53/4.60 [[fold(/\x./\y.yap(_F0(x), y), nil, _x1)]] = 3 + x1 + F0(0,0) > x1 = [[_x1]] 4.53/4.60 [[sum(_x0)]] = 3 + 3x0 > x0 = [[fold(/\x./\y.yap(add(x), y), _x0, 0)]] 4.53/4.60 [[yap(_F0, _x1)]] = x1 + F0(x1) >= x1 + F0(x1) = [[_F0 _x1]] 4.53/4.60 4.53/4.60 We can thus remove the following rules: 4.53/4.60 4.53/4.60 fold(/\x./\y.yap(F(x), y), nil, X) => X 4.53/4.60 sum(X) => fold(/\x./\y.yap(add(x), y), X, 0) 4.53/4.60 4.53/4.60 We use rule removal, following [Kop12, Theorem 2.23]. 4.53/4.60 4.53/4.60 This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): 4.53/4.60 4.53/4.60 yap(F, X) >? F X 4.53/4.60 4.53/4.60 We orient these requirements with a polynomial interpretation in the natural numbers. 4.53/4.60 4.53/4.60 The following interpretation satisfies the requirements: 4.53/4.60 4.53/4.60 yap = \G0y1.1 + y1 + G0(y1) 4.53/4.60 4.53/4.60 Using this interpretation, the requirements translate to: 4.53/4.60 4.53/4.60 [[yap(_F0, _x1)]] = 1 + x1 + F0(x1) > x1 + F0(x1) = [[_F0 _x1]] 4.53/4.60 4.53/4.60 We can thus remove the following rules: 4.53/4.60 4.53/4.60 yap(F, X) => F X 4.53/4.60 4.53/4.60 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. 4.53/4.60 4.53/4.60 4.53/4.60 +++ Citations +++ 4.53/4.60 4.53/4.60 [Kop12] C. Kop. Higher Order Termination. PhD Thesis, 2012. 4.53/4.60 [Kop13:2] C. Kop. StarHorpo with an Eta-Rule. Unpublished manuscript, http://cl-informatik.uibk.ac.at/users/kop/etahorpo.pdf, 2013. 4.53/4.60 EOF