/export/starexec/sandbox2/solver/bin/starexec_run_FirstOrder /export/starexec/sandbox2/benchmark/theBenchmark.xml /export/starexec/sandbox2/output/output_files -------------------------------------------------------------------------------- YES We consider the system theBenchmark. We are asked to determine termination of the following first-order TRS. !870 : [o * o] --> o !dot : [o * o] --> o admit : [o * o] --> o carry : [o * o * o] --> o cond : [o * o] --> o nil : [] --> o sum : [o * o * o] --> o true : [] --> o w : [] --> o admit(X, nil) => nil admit(X, !dot(Y, !dot(Z, !dot(w, U)))) => cond(!870(sum(X, Y, Z), w), !dot(Y, !dot(Z, !dot(w, admit(carry(X, Y, Z), U))))) cond(true, X) => X As the system is orthogonal, it is terminating if it is innermost terminating by [Gra95]. Then, by [FuhGieParSchSwi11], it suffices to prove (innermost) termination of the typed system, with sort annotations chosen to respect the rules, as follows: !870 : [fa * s] --> ya !dot : [s * bb] --> bb admit : [pa * bb] --> bb carry : [pa * s * s] --> pa cond : [ya * bb] --> bb nil : [] --> bb sum : [pa * s * s] --> fa true : [] --> ya w : [] --> s We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): admit(X, nil) >? nil admit(X, !dot(Y, !dot(Z, !dot(w, U)))) >? cond(!870(sum(X, Y, Z), w), !dot(Y, !dot(Z, !dot(w, admit(carry(X, Y, Z), U))))) cond(true, X) >? X about to try horpo We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[admit(x_1, x_2)]] = admit(x_2, x_1) [[nil]] = _|_ We choose Lex = {admit} and Mul = {!870, !dot, carry, cond, sum, true, w}, and the following precedence: admit > !870 > !dot > cond > w > sum > carry = true Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: admit(X, _|_) >= _|_ admit(X, !dot(Y, !dot(Z, !dot(w, U)))) >= cond(!870(sum(X, Y, Z), w), !dot(Y, !dot(Z, !dot(w, admit(carry(X, Y, Z), U))))) cond(true, X) > X With these choices, we have: 1] admit(X, _|_) >= _|_ by (Bot) 2] admit(X, !dot(Y, !dot(Z, !dot(w, U)))) >= cond(!870(sum(X, Y, Z), w), !dot(Y, !dot(Z, !dot(w, admit(carry(X, Y, Z), U))))) because [3], by (Star) 3] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= cond(!870(sum(X, Y, Z), w), !dot(Y, !dot(Z, !dot(w, admit(carry(X, Y, Z), U))))) because admit > cond, [4] and [19], by (Copy) 4] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= !870(sum(X, Y, Z), w) because admit > !870, [5] and [18], by (Copy) 5] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= sum(X, Y, Z) because admit > sum, [6], [8] and [12], by (Copy) 6] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= X because [7], by (Select) 7] X >= X by (Meta) 8] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= Y because [9], by (Select) 9] !dot(Y, !dot(Z, !dot(w, U))) >= Y because [10], by (Star) 10] !dot*(Y, !dot(Z, !dot(w, U))) >= Y because [11], by (Select) 11] Y >= Y by (Meta) 12] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= Z because [13], by (Select) 13] !dot(Y, !dot(Z, !dot(w, U))) >= Z because [14], by (Star) 14] !dot*(Y, !dot(Z, !dot(w, U))) >= Z because [15], by (Select) 15] !dot(Z, !dot(w, U)) >= Z because [16], by (Star) 16] !dot*(Z, !dot(w, U)) >= Z because [17], by (Select) 17] Z >= Z by (Meta) 18] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= w because admit > w, by (Copy) 19] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= !dot(Y, !dot(Z, !dot(w, admit(carry(X, Y, Z), U)))) because admit > !dot, [8] and [20], by (Copy) 20] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= !dot(Z, !dot(w, admit(carry(X, Y, Z), U))) because admit > !dot, [12] and [21], by (Copy) 21] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= !dot(w, admit(carry(X, Y, Z), U)) because admit > !dot, [18] and [22], by (Copy) 22] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= admit(carry(X, Y, Z), U) because [23], [30] and [31], by (Stat) 23] !dot(Y, !dot(Z, !dot(w, U))) > U because [24], by definition 24] !dot*(Y, !dot(Z, !dot(w, U))) >= U because [25], by (Select) 25] !dot(Z, !dot(w, U)) >= U because [26], by (Star) 26] !dot*(Z, !dot(w, U)) >= U because [27], by (Select) 27] !dot(w, U) >= U because [28], by (Star) 28] !dot*(w, U) >= U because [29], by (Select) 29] U >= U by (Meta) 30] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= carry(X, Y, Z) because admit > carry, [6], [8] and [12], by (Copy) 31] admit*(X, !dot(Y, !dot(Z, !dot(w, U)))) >= U because [32], by (Select) 32] !dot(Y, !dot(Z, !dot(w, U))) >= U because [24], by (Star) 33] cond(true, X) > X because [34], by definition 34] cond*(true, X) >= X because [35], by (Select) 35] X >= X by (Meta) We can thus remove the following rules: cond(true, X) => X We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): admit(X, nil) >? nil admit(X, !dot(Y, !dot(Z, !dot(w, U)))) >? cond(!870(sum(X, Y, Z), w), !dot(Y, !dot(Z, !dot(w, admit(carry(X, Y, Z), U))))) about to try horpo We use a recursive path ordering as defined in [Kop12, Chapter 5]. Argument functions: [[admit(x_1, x_2)]] = admit(x_2, x_1) [[w]] = _|_ We choose Lex = {admit} and Mul = {!870, !dot, carry, cond, nil, sum}, and the following precedence: admit > carry > cond > nil > !870 > !dot > sum Taking the argument function into account, and fixing the greater / greater equal choices, the constraints can be denoted as follows: admit(X, nil) >= nil admit(X, !dot(Y, !dot(Z, !dot(_|_, U)))) > cond(!870(sum(X, Y, Z), _|_), !dot(Y, !dot(Z, !dot(_|_, admit(carry(X, Y, Z), U))))) With these choices, we have: 1] admit(X, nil) >= nil because [2], by (Star) 2] admit*(X, nil) >= nil because admit > nil, by (Copy) 3] admit(X, !dot(Y, !dot(Z, !dot(_|_, U)))) > cond(!870(sum(X, Y, Z), _|_), !dot(Y, !dot(Z, !dot(_|_, admit(carry(X, Y, Z), U))))) because [4], by definition 4] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= cond(!870(sum(X, Y, Z), _|_), !dot(Y, !dot(Z, !dot(_|_, admit(carry(X, Y, Z), U))))) because admit > cond, [5] and [20], by (Copy) 5] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= !870(sum(X, Y, Z), _|_) because admit > !870, [6] and [19], by (Copy) 6] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= sum(X, Y, Z) because admit > sum, [7], [9] and [13], by (Copy) 7] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= X because [8], by (Select) 8] X >= X by (Meta) 9] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= Y because [10], by (Select) 10] !dot(Y, !dot(Z, !dot(_|_, U))) >= Y because [11], by (Star) 11] !dot*(Y, !dot(Z, !dot(_|_, U))) >= Y because [12], by (Select) 12] Y >= Y by (Meta) 13] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= Z because [14], by (Select) 14] !dot(Y, !dot(Z, !dot(_|_, U))) >= Z because [15], by (Star) 15] !dot*(Y, !dot(Z, !dot(_|_, U))) >= Z because [16], by (Select) 16] !dot(Z, !dot(_|_, U)) >= Z because [17], by (Star) 17] !dot*(Z, !dot(_|_, U)) >= Z because [18], by (Select) 18] Z >= Z by (Meta) 19] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= _|_ by (Bot) 20] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= !dot(Y, !dot(Z, !dot(_|_, admit(carry(X, Y, Z), U)))) because admit > !dot, [9] and [21], by (Copy) 21] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= !dot(Z, !dot(_|_, admit(carry(X, Y, Z), U))) because admit > !dot, [13] and [22], by (Copy) 22] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= !dot(_|_, admit(carry(X, Y, Z), U)) because admit > !dot, [19] and [23], by (Copy) 23] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= admit(carry(X, Y, Z), U) because [24], [31] and [32], by (Stat) 24] !dot(Y, !dot(Z, !dot(_|_, U))) > U because [25], by definition 25] !dot*(Y, !dot(Z, !dot(_|_, U))) >= U because [26], by (Select) 26] !dot(Z, !dot(_|_, U)) >= U because [27], by (Star) 27] !dot*(Z, !dot(_|_, U)) >= U because [28], by (Select) 28] !dot(_|_, U) >= U because [29], by (Star) 29] !dot*(_|_, U) >= U because [30], by (Select) 30] U >= U by (Meta) 31] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= carry(X, Y, Z) because admit > carry, [7], [9] and [13], by (Copy) 32] admit*(X, !dot(Y, !dot(Z, !dot(_|_, U)))) >= U because [33], by (Select) 33] !dot(Y, !dot(Z, !dot(_|_, U))) >= U because [25], by (Star) We can thus remove the following rules: admit(X, !dot(Y, !dot(Z, !dot(w, U)))) => cond(!870(sum(X, Y, Z), w), !dot(Y, !dot(Z, !dot(w, admit(carry(X, Y, Z), U))))) We use rule removal, following [Kop12, Theorem 2.23]. This gives the following requirements (possibly using Theorems 2.25 and 2.26 in [Kop12]): admit(X, nil) >? nil We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: admit = \y0y1.3 + y0 + 3y1 nil = 0 Using this interpretation, the requirements translate to: [[admit(_x0, nil)]] = 3 + x0 > 0 = [[nil]] We can thus remove the following rules: admit(X, nil) => nil All rules were succesfully removed. Thus, termination of the original system has been reduced to termination of the beta-rule, which is well-known to hold. +++ Citations +++ [FuhGieParSchSwi11] C. Fuhs, J. Giesl, M. Parting, P. Schneider-Kamp, and S. Swiderski. Proving Termination by Dependency Pairs and Inductive Theorem Proving. In volume 47(2) of Journal of Automated Reasoning. 133--160, 2011. [Gra95] B. Gramlich. Abstract Relations Between Restricted Termination and Confluence Properties of Rewrite Systems. In volume 24(1-2) of Fundamentae Informaticae. 3--23, 1995. [Kop12] C. Kop. Higher Order Termination. PhD Thesis, 2012.