We consider the system 427. Alphabet: all : [T -> F] --> F and : [F * F] --> F ex : [T -> F] --> F not : [F] --> F or : [F * F] --> F Rules: and(X, all(/\x.Y(x))) => all(/\y.and(X, Y(y))) and(all(/\x.X(x)), Y) => all(/\y.and(X(y), Y)) or(X, all(/\x.Y(x))) => all(/\y.or(X, Y(y))) or(all(/\x.X(x)), Y) => all(/\y.or(X(y), Y)) and(X, ex(/\x.Y(x))) => ex(/\y.and(X, Y(y))) and(ex(/\x.X(x)), Y) => ex(/\y.and(X(y), Y)) or(X, ex(/\x.Y(x))) => ex(/\y.or(X, Y(y))) or(ex(/\x.X(x)), Y) => ex(/\y.or(X(y), Y)) not(all(/\x.X(x))) => ex(/\y.not(X(y))) not(ex(/\x.X(x))) => all(/\y.not(X(y))) We use the dependency pair framework as described in [Kop12, Ch. 6/7], with dynamic dependency pairs. We thus obtain the following dependency pair problem (P_0, R_0, minimal, formative): Dependency Pairs P_0: 0] and#(X, all(/\x.Y(x))) =#> and#(X, Y(y)) 1] and#(X, all(/\x.Y(x))) =#> Y(y) 2] and#(all(/\x.X(x)), Y) =#> and#(X(y), Y) 3] and#(all(/\x.X(x)), Y) =#> X(y) 4] or#(X, all(/\x.Y(x))) =#> or#(X, Y(y)) 5] or#(X, all(/\x.Y(x))) =#> Y(y) 6] or#(all(/\x.X(x)), Y) =#> or#(X(y), Y) 7] or#(all(/\x.X(x)), Y) =#> X(y) 8] and#(X, ex(/\x.Y(x))) =#> and#(X, Y(y)) 9] and#(X, ex(/\x.Y(x))) =#> Y(y) 10] and#(ex(/\x.X(x)), Y) =#> and#(X(y), Y) 11] and#(ex(/\x.X(x)), Y) =#> X(y) 12] or#(X, ex(/\x.Y(x))) =#> or#(X, Y(y)) 13] or#(X, ex(/\x.Y(x))) =#> Y(y) 14] or#(ex(/\x.X(x)), Y) =#> or#(X(y), Y) 15] or#(ex(/\x.X(x)), Y) =#> X(y) 16] not#(all(/\x.X(x))) =#> not#(X(y)) 17] not#(all(/\x.X(x))) =#> X(y) 18] not#(ex(/\x.X(x))) =#> not#(X(y)) 19] not#(ex(/\x.X(x))) =#> X(y) Rules R_0: and(X, all(/\x.Y(x))) => all(/\y.and(X, Y(y))) and(all(/\x.X(x)), Y) => all(/\y.and(X(y), Y)) or(X, all(/\x.Y(x))) => all(/\y.or(X, Y(y))) or(all(/\x.X(x)), Y) => all(/\y.or(X(y), Y)) and(X, ex(/\x.Y(x))) => ex(/\y.and(X, Y(y))) and(ex(/\x.X(x)), Y) => ex(/\y.and(X(y), Y)) or(X, ex(/\x.Y(x))) => ex(/\y.or(X, Y(y))) or(ex(/\x.X(x)), Y) => ex(/\y.or(X(y), Y)) not(all(/\x.X(x))) => ex(/\y.not(X(y))) not(ex(/\x.X(x))) => all(/\y.not(X(y))) Thus, the original system is terminating if (P_0, R_0, minimal, formative) is finite. We consider the dependency pair problem (P_0, R_0, minimal, formative). We will use the reduction pair processor [Kop12, Thm. 7.16]. As the system is abstraction-simple and the formative flag is set, it suffices to find a tagged reduction pair [Kop12, Def. 6.70]. Thus, we must orient: and#(X, all(/\x.Y(x))) >? and#(X, Y(~c0)) and#(X, all(/\x.Y(x))) >? Y(~c1) and#(all(/\x.X(x)), Y) >? and#(X(~c2), Y) and#(all(/\x.X(x)), Y) >? X(~c3) or#(X, all(/\x.Y(x))) >? or#(X, Y(~c4)) or#(X, all(/\x.Y(x))) >? Y(~c5) or#(all(/\x.X(x)), Y) >? or#(X(~c6), Y) or#(all(/\x.X(x)), Y) >? X(~c7) and#(X, ex(/\x.Y(x))) >? and#(X, Y(~c8)) and#(X, ex(/\x.Y(x))) >? Y(~c9) and#(ex(/\x.X(x)), Y) >? and#(X(~c10), Y) and#(ex(/\x.X(x)), Y) >? X(~c11) or#(X, ex(/\x.Y(x))) >? or#(X, Y(~c12)) or#(X, ex(/\x.Y(x))) >? Y(~c13) or#(ex(/\x.X(x)), Y) >? or#(X(~c14), Y) or#(ex(/\x.X(x)), Y) >? X(~c15) not#(all(/\x.X(x))) >? not#(X(~c16)) not#(all(/\x.X(x))) >? X(~c17) not#(ex(/\x.X(x))) >? not#(X(~c18)) not#(ex(/\x.X(x))) >? X(~c19) and(X, all(/\x.Y(x))) >= all(/\y.and-(X, Y(y))) and(all(/\x.X(x)), Y) >= all(/\y.and-(X(y), Y)) or(X, all(/\x.Y(x))) >= all(/\y.or-(X, Y(y))) or(all(/\x.X(x)), Y) >= all(/\y.or-(X(y), Y)) and(X, ex(/\x.Y(x))) >= ex(/\y.and-(X, Y(y))) and(ex(/\x.X(x)), Y) >= ex(/\y.and-(X(y), Y)) or(X, ex(/\x.Y(x))) >= ex(/\y.or-(X, Y(y))) or(ex(/\x.X(x)), Y) >= ex(/\y.or-(X(y), Y)) not(all(/\x.X(x))) >= ex(/\y.not-(X(y))) not(ex(/\x.X(x))) >= all(/\y.not-(X(y))) and-(X, Y) >= and(X, Y) and-(X, Y) >= and#(X, Y) not-(X) >= not(X) not-(X) >= not#(X) or-(X, Y) >= or(X, Y) or-(X, Y) >= or#(X, Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: all = \G0.G0(0) and = \y0y1.y1 + 2y0 and- = \y0y1.y1 + 2y0 and# = \y0y1.y1 + 2y0 ex = \G0.G0(0) not = \y0.y0 not- = \y0.y0 not# = \y0.y0 or = \y0y1.1 + y1 + 2y0 or- = \y0y1.1 + y1 + 2y0 or# = \y0y1.1 + y0 + y1 ~c0 = 0 ~c1 = 0 ~c10 = 0 ~c11 = 0 ~c12 = 0 ~c13 = 0 ~c14 = 0 ~c15 = 0 ~c16 = 0 ~c17 = 0 ~c18 = 0 ~c19 = 0 ~c2 = 0 ~c3 = 0 ~c4 = 0 ~c5 = 0 ~c6 = 0 ~c7 = 0 ~c8 = 0 ~c9 = 0 Using this interpretation, the requirements translate to: [[and#(_x0, all(/\x._x1(x)))]] = 2x0 + F1(0) >= 2x0 + F1(0) = [[and#(_x0, _x1(~c0))]] [[and#(_x0, all(/\x._x1(x)))]] = 2x0 + F1(0) >= F1(0) = [[_x1(~c1)]] [[and#(all(/\x._x0(x)), _x1)]] = x1 + 2F0(0) >= x1 + 2F0(0) = [[and#(_x0(~c2), _x1)]] [[and#(all(/\x._x0(x)), _x1)]] = x1 + 2F0(0) >= F0(0) = [[_x0(~c3)]] [[or#(_x0, all(/\x._x1(x)))]] = 1 + x0 + F1(0) >= 1 + x0 + F1(0) = [[or#(_x0, _x1(~c4))]] [[or#(_x0, all(/\x._x1(x)))]] = 1 + x0 + F1(0) > F1(0) = [[_x1(~c5)]] [[or#(all(/\x._x0(x)), _x1)]] = 1 + x1 + F0(0) >= 1 + x1 + F0(0) = [[or#(_x0(~c6), _x1)]] [[or#(all(/\x._x0(x)), _x1)]] = 1 + x1 + F0(0) > F0(0) = [[_x0(~c7)]] [[and#(_x0, ex(/\x._x1(x)))]] = 2x0 + F1(0) >= 2x0 + F1(0) = [[and#(_x0, _x1(~c8))]] [[and#(_x0, ex(/\x._x1(x)))]] = 2x0 + F1(0) >= F1(0) = [[_x1(~c9)]] [[and#(ex(/\x._x0(x)), _x1)]] = x1 + 2F0(0) >= x1 + 2F0(0) = [[and#(_x0(~c10), _x1)]] [[and#(ex(/\x._x0(x)), _x1)]] = x1 + 2F0(0) >= F0(0) = [[_x0(~c11)]] [[or#(_x0, ex(/\x._x1(x)))]] = 1 + x0 + F1(0) >= 1 + x0 + F1(0) = [[or#(_x0, _x1(~c12))]] [[or#(_x0, ex(/\x._x1(x)))]] = 1 + x0 + F1(0) > F1(0) = [[_x1(~c13)]] [[or#(ex(/\x._x0(x)), _x1)]] = 1 + x1 + F0(0) >= 1 + x1 + F0(0) = [[or#(_x0(~c14), _x1)]] [[or#(ex(/\x._x0(x)), _x1)]] = 1 + x1 + F0(0) > F0(0) = [[_x0(~c15)]] [[not#(all(/\x._x0(x)))]] = F0(0) >= F0(0) = [[not#(_x0(~c16))]] [[not#(all(/\x._x0(x)))]] = F0(0) >= F0(0) = [[_x0(~c17)]] [[not#(ex(/\x._x0(x)))]] = F0(0) >= F0(0) = [[not#(_x0(~c18))]] [[not#(ex(/\x._x0(x)))]] = F0(0) >= F0(0) = [[_x0(~c19)]] [[and(_x0, all(/\x._x1(x)))]] = 2x0 + F1(0) >= 2x0 + F1(0) = [[all(/\x.and-(_x0, _x1(x)))]] [[and(all(/\x._x0(x)), _x1)]] = x1 + 2F0(0) >= x1 + 2F0(0) = [[all(/\x.and-(_x0(x), _x1))]] [[or(_x0, all(/\x._x1(x)))]] = 1 + 2x0 + F1(0) >= 1 + 2x0 + F1(0) = [[all(/\x.or-(_x0, _x1(x)))]] [[or(all(/\x._x0(x)), _x1)]] = 1 + x1 + 2F0(0) >= 1 + x1 + 2F0(0) = [[all(/\x.or-(_x0(x), _x1))]] [[and(_x0, ex(/\x._x1(x)))]] = 2x0 + F1(0) >= 2x0 + F1(0) = [[ex(/\x.and-(_x0, _x1(x)))]] [[and(ex(/\x._x0(x)), _x1)]] = x1 + 2F0(0) >= x1 + 2F0(0) = [[ex(/\x.and-(_x0(x), _x1))]] [[or(_x0, ex(/\x._x1(x)))]] = 1 + 2x0 + F1(0) >= 1 + 2x0 + F1(0) = [[ex(/\x.or-(_x0, _x1(x)))]] [[or(ex(/\x._x0(x)), _x1)]] = 1 + x1 + 2F0(0) >= 1 + x1 + 2F0(0) = [[ex(/\x.or-(_x0(x), _x1))]] [[not(all(/\x._x0(x)))]] = F0(0) >= F0(0) = [[ex(/\x.not-(_x0(x)))]] [[not(ex(/\x._x0(x)))]] = F0(0) >= F0(0) = [[all(/\x.not-(_x0(x)))]] [[and-(_x0, _x1)]] = x1 + 2x0 >= x1 + 2x0 = [[and(_x0, _x1)]] [[and-(_x0, _x1)]] = x1 + 2x0 >= x1 + 2x0 = [[and#(_x0, _x1)]] [[not-(_x0)]] = x0 >= x0 = [[not(_x0)]] [[not-(_x0)]] = x0 >= x0 = [[not#(_x0)]] [[or-(_x0, _x1)]] = 1 + x1 + 2x0 >= 1 + x1 + 2x0 = [[or(_x0, _x1)]] [[or-(_x0, _x1)]] = 1 + x1 + 2x0 >= 1 + x0 + x1 = [[or#(_x0, _x1)]] By the observations in [Kop12, Sec. 6.6], this reduction pair suffices; we may thus replace the dependency pair problem (P_0, R_0, minimal, formative) by (P_1, R_0, minimal, formative), where P_1 consists of: and#(X, all(/\x.Y(x))) =#> and#(X, Y(y)) and#(X, all(/\x.Y(x))) =#> Y(y) and#(all(/\x.X(x)), Y) =#> and#(X(y), Y) and#(all(/\x.X(x)), Y) =#> X(y) or#(X, all(/\x.Y(x))) =#> or#(X, Y(y)) or#(all(/\x.X(x)), Y) =#> or#(X(y), Y) and#(X, ex(/\x.Y(x))) =#> and#(X, Y(y)) and#(X, ex(/\x.Y(x))) =#> Y(y) and#(ex(/\x.X(x)), Y) =#> and#(X(y), Y) and#(ex(/\x.X(x)), Y) =#> X(y) or#(X, ex(/\x.Y(x))) =#> or#(X, Y(y)) or#(ex(/\x.X(x)), Y) =#> or#(X(y), Y) not#(all(/\x.X(x))) =#> not#(X(y)) not#(all(/\x.X(x))) =#> X(y) not#(ex(/\x.X(x))) =#> not#(X(y)) not#(ex(/\x.X(x))) =#> X(y) Thus, the original system is terminating if (P_1, R_0, minimal, formative) is finite. We consider the dependency pair problem (P_1, R_0, minimal, formative). 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, 6, 7, 8, 9 * 1 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 * 2 : 0, 1, 2, 3, 6, 7, 8, 9 * 3 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 * 4 : 4, 5, 10, 11 * 5 : 4, 5, 10, 11 * 6 : 0, 1, 2, 3, 6, 7, 8, 9 * 7 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 * 8 : 0, 1, 2, 3, 6, 7, 8, 9 * 9 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 * 10 : 4, 5, 10, 11 * 11 : 4, 5, 10, 11 * 12 : 12, 13, 14, 15 * 13 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 * 14 : 12, 13, 14, 15 * 15 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 This graph has the following strongly connected components: P_2: and#(X, all(/\x.Y(x))) =#> and#(X, Y(y)) and#(X, all(/\x.Y(x))) =#> Y(y) and#(all(/\x.X(x)), Y) =#> and#(X(y), Y) and#(all(/\x.X(x)), Y) =#> X(y) and#(X, ex(/\x.Y(x))) =#> and#(X, Y(y)) and#(X, ex(/\x.Y(x))) =#> Y(y) and#(ex(/\x.X(x)), Y) =#> and#(X(y), Y) and#(ex(/\x.X(x)), Y) =#> X(y) not#(all(/\x.X(x))) =#> not#(X(y)) not#(all(/\x.X(x))) =#> X(y) not#(ex(/\x.X(x))) =#> not#(X(y)) not#(ex(/\x.X(x))) =#> X(y) P_3: or#(X, all(/\x.Y(x))) =#> or#(X, Y(y)) or#(all(/\x.X(x)), Y) =#> or#(X(y), Y) or#(X, ex(/\x.Y(x))) =#> or#(X, Y(y)) or#(ex(/\x.X(x)), Y) =#> or#(X(y), Y) By [Kop12, Thm. 7.31], we may replace any dependency pair problem (P_1, R_0, m, f) by (P_2, R_0, m, f) and (P_3, R_0, m, f). Thus, the original system is terminating if each of (P_2, R_0, minimal, formative) and (P_3, R_0, minimal, formative) is finite. We consider the dependency pair problem (P_3, R_0, minimal, formative). We will use the reduction pair processor with usable rules [Kop12, Thm. 7.44]. (P_3, R_0) has no usable rules. It suffices to find a standard reduction pair [Kop12, Def. 6.69]. Thus, we must orient: or#(X, all(/\x.Y(x))) >? or#(X, Y(~c0)) or#(all(/\x.X(x)), Y) >? or#(X(~c1), Y) or#(X, ex(/\x.Y(x))) >? or#(X, Y(~c2)) or#(ex(/\x.X(x)), Y) >? or#(X(~c3), Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: all = \G0.3 + 2G0(0) ex = \G0.3 + G0(0) or# = \y0y1.y1 ~c0 = 0 ~c1 = 0 ~c2 = 0 ~c3 = 0 Using this interpretation, the requirements translate to: [[or#(_x0, all(/\x._x1(x)))]] = 3 + 2F1(0) > F1(0) = [[or#(_x0, _x1(~c0))]] [[or#(all(/\x._x0(x)), _x1)]] = x1 >= x1 = [[or#(_x0(~c1), _x1)]] [[or#(_x0, ex(/\x._x1(x)))]] = 3 + F1(0) > F1(0) = [[or#(_x0, _x1(~c2))]] [[or#(ex(/\x._x0(x)), _x1)]] = x1 >= x1 = [[or#(_x0(~c3), _x1)]] By the observations in [Kop12, Sec. 6.6], this reduction pair suffices; we may thus replace the dependency pair problem (P_3, R_0, minimal, formative) by (P_4, R_0, minimal, formative), where P_4 consists of: or#(all(/\x.X(x)), Y) =#> or#(X(y), Y) or#(ex(/\x.X(x)), Y) =#> or#(X(y), Y) Thus, the original system is terminating if each of (P_2, R_0, minimal, formative) and (P_4, R_0, minimal, formative) is finite. We consider the dependency pair problem (P_4, R_0, minimal, formative). We will use the reduction pair processor with usable rules [Kop12, Thm. 7.44]. (P_4, R_0) has no usable rules. It suffices to find a standard reduction pair [Kop12, Def. 6.69]. Thus, we must orient: or#(all(/\x.X(x)), Y) >? or#(X(~c0), Y) or#(ex(/\x.X(x)), Y) >? or#(X(~c1), Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: all = \G0.3 + G0(0) ex = \G0.3 + G0(0) or# = \y0y1.y0 ~c0 = 0 ~c1 = 0 Using this interpretation, the requirements translate to: [[or#(all(/\x._x0(x)), _x1)]] = 3 + F0(0) > F0(0) = [[or#(_x0(~c0), _x1)]] [[or#(ex(/\x._x0(x)), _x1)]] = 3 + F0(0) > F0(0) = [[or#(_x0(~c1), _x1)]] 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. Thus, the original system is terminating if (P_2, R_0, minimal, formative) is finite. We consider the dependency pair problem (P_2, R_0, minimal, formative). We will use the reduction pair processor [Kop12, Thm. 7.16]. As the system is abstraction-simple and the formative flag is set, it suffices to find a tagged reduction pair [Kop12, Def. 6.70]. Thus, we must orient: and#(X, all(/\x.Y(x))) >? and#(X, Y(~c0)) and#(X, all(/\x.Y(x))) >? Y(~c1) and#(all(/\x.X(x)), Y) >? and#(X(~c2), Y) and#(all(/\x.X(x)), Y) >? X(~c3) and#(X, ex(/\x.Y(x))) >? and#(X, Y(~c4)) and#(X, ex(/\x.Y(x))) >? Y(~c5) and#(ex(/\x.X(x)), Y) >? and#(X(~c6), Y) and#(ex(/\x.X(x)), Y) >? X(~c7) not#(all(/\x.X(x))) >? not#(X(~c8)) not#(all(/\x.X(x))) >? X(~c9) not#(ex(/\x.X(x))) >? not#(X(~c10)) not#(ex(/\x.X(x))) >? X(~c11) and(X, all(/\x.Y(x))) >= all(/\y.and-(X, Y(y))) and(all(/\x.X(x)), Y) >= all(/\y.and-(X(y), Y)) or(X, all(/\x.Y(x))) >= all(/\y.or-(X, Y(y))) or(all(/\x.X(x)), Y) >= all(/\y.or-(X(y), Y)) and(X, ex(/\x.Y(x))) >= ex(/\y.and-(X, Y(y))) and(ex(/\x.X(x)), Y) >= ex(/\y.and-(X(y), Y)) or(X, ex(/\x.Y(x))) >= ex(/\y.or-(X, Y(y))) or(ex(/\x.X(x)), Y) >= ex(/\y.or-(X(y), Y)) not(all(/\x.X(x))) >= ex(/\y.not-(X(y))) not(ex(/\x.X(x))) >= all(/\y.not-(X(y))) and-(X, Y) >= and(X, Y) and-(X, Y) >= and#(X, Y) not-(X) >= not(X) not-(X) >= not#(X) or-(X, Y) >= or(X, Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: all = \G0.G0(0) and = \y0y1.2y0 + 2y1 and- = \y0y1.2y0 + 2y1 and# = \y0y1.y0 + y1 ex = \G0.G0(0) not = \y0.1 + y0 not- = \y0.1 + y0 not# = \y0.1 + y0 or = \y0y1.y0 + y1 or- = \y0y1.y0 + y1 ~c0 = 0 ~c1 = 0 ~c10 = 0 ~c11 = 0 ~c2 = 0 ~c3 = 0 ~c4 = 0 ~c5 = 0 ~c6 = 0 ~c7 = 0 ~c8 = 0 ~c9 = 0 Using this interpretation, the requirements translate to: [[and#(_x0, all(/\x._x1(x)))]] = x0 + F1(0) >= x0 + F1(0) = [[and#(_x0, _x1(~c0))]] [[and#(_x0, all(/\x._x1(x)))]] = x0 + F1(0) >= F1(0) = [[_x1(~c1)]] [[and#(all(/\x._x0(x)), _x1)]] = x1 + F0(0) >= x1 + F0(0) = [[and#(_x0(~c2), _x1)]] [[and#(all(/\x._x0(x)), _x1)]] = x1 + F0(0) >= F0(0) = [[_x0(~c3)]] [[and#(_x0, ex(/\x._x1(x)))]] = x0 + F1(0) >= x0 + F1(0) = [[and#(_x0, _x1(~c4))]] [[and#(_x0, ex(/\x._x1(x)))]] = x0 + F1(0) >= F1(0) = [[_x1(~c5)]] [[and#(ex(/\x._x0(x)), _x1)]] = x1 + F0(0) >= x1 + F0(0) = [[and#(_x0(~c6), _x1)]] [[and#(ex(/\x._x0(x)), _x1)]] = x1 + F0(0) >= F0(0) = [[_x0(~c7)]] [[not#(all(/\x._x0(x)))]] = 1 + F0(0) >= 1 + F0(0) = [[not#(_x0(~c8))]] [[not#(all(/\x._x0(x)))]] = 1 + F0(0) > F0(0) = [[_x0(~c9)]] [[not#(ex(/\x._x0(x)))]] = 1 + F0(0) >= 1 + F0(0) = [[not#(_x0(~c10))]] [[not#(ex(/\x._x0(x)))]] = 1 + F0(0) > F0(0) = [[_x0(~c11)]] [[and(_x0, all(/\x._x1(x)))]] = 2x0 + 2F1(0) >= 2x0 + 2F1(0) = [[all(/\x.and-(_x0, _x1(x)))]] [[and(all(/\x._x0(x)), _x1)]] = 2x1 + 2F0(0) >= 2x1 + 2F0(0) = [[all(/\x.and-(_x0(x), _x1))]] [[or(_x0, all(/\x._x1(x)))]] = x0 + F1(0) >= x0 + F1(0) = [[all(/\x.or-(_x0, _x1(x)))]] [[or(all(/\x._x0(x)), _x1)]] = x1 + F0(0) >= x1 + F0(0) = [[all(/\x.or-(_x0(x), _x1))]] [[and(_x0, ex(/\x._x1(x)))]] = 2x0 + 2F1(0) >= 2x0 + 2F1(0) = [[ex(/\x.and-(_x0, _x1(x)))]] [[and(ex(/\x._x0(x)), _x1)]] = 2x1 + 2F0(0) >= 2x1 + 2F0(0) = [[ex(/\x.and-(_x0(x), _x1))]] [[or(_x0, ex(/\x._x1(x)))]] = x0 + F1(0) >= x0 + F1(0) = [[ex(/\x.or-(_x0, _x1(x)))]] [[or(ex(/\x._x0(x)), _x1)]] = x1 + F0(0) >= x1 + F0(0) = [[ex(/\x.or-(_x0(x), _x1))]] [[not(all(/\x._x0(x)))]] = 1 + F0(0) >= 1 + F0(0) = [[ex(/\x.not-(_x0(x)))]] [[not(ex(/\x._x0(x)))]] = 1 + F0(0) >= 1 + F0(0) = [[all(/\x.not-(_x0(x)))]] [[and-(_x0, _x1)]] = 2x0 + 2x1 >= 2x0 + 2x1 = [[and(_x0, _x1)]] [[and-(_x0, _x1)]] = 2x0 + 2x1 >= x0 + x1 = [[and#(_x0, _x1)]] [[not-(_x0)]] = 1 + x0 >= 1 + x0 = [[not(_x0)]] [[not-(_x0)]] = 1 + x0 >= 1 + x0 = [[not#(_x0)]] [[or-(_x0, _x1)]] = x0 + x1 >= x0 + x1 = [[or(_x0, _x1)]] 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, formative) by (P_5, R_0, minimal, formative), where P_5 consists of: and#(X, all(/\x.Y(x))) =#> and#(X, Y(y)) and#(X, all(/\x.Y(x))) =#> Y(y) and#(all(/\x.X(x)), Y) =#> and#(X(y), Y) and#(all(/\x.X(x)), Y) =#> X(y) and#(X, ex(/\x.Y(x))) =#> and#(X, Y(y)) and#(X, ex(/\x.Y(x))) =#> Y(y) and#(ex(/\x.X(x)), Y) =#> and#(X(y), Y) and#(ex(/\x.X(x)), Y) =#> X(y) not#(all(/\x.X(x))) =#> not#(X(y)) not#(ex(/\x.X(x))) =#> not#(X(y)) Thus, the original system is terminating if (P_5, R_0, minimal, formative) is finite. We consider the dependency pair problem (P_5, R_0, minimal, formative). 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, 5, 6, 7 * 1 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 * 2 : 0, 1, 2, 3, 4, 5, 6, 7 * 3 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 * 4 : 0, 1, 2, 3, 4, 5, 6, 7 * 5 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 * 6 : 0, 1, 2, 3, 4, 5, 6, 7 * 7 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 * 8 : 8, 9 * 9 : 8, 9 This graph has the following strongly connected components: P_6: and#(X, all(/\x.Y(x))) =#> and#(X, Y(y)) and#(X, all(/\x.Y(x))) =#> Y(y) and#(all(/\x.X(x)), Y) =#> and#(X(y), Y) and#(all(/\x.X(x)), Y) =#> X(y) and#(X, ex(/\x.Y(x))) =#> and#(X, Y(y)) and#(X, ex(/\x.Y(x))) =#> Y(y) and#(ex(/\x.X(x)), Y) =#> and#(X(y), Y) and#(ex(/\x.X(x)), Y) =#> X(y) P_7: not#(all(/\x.X(x))) =#> not#(X(y)) not#(ex(/\x.X(x))) =#> not#(X(y)) By [Kop12, Thm. 7.31], we may replace any dependency pair problem (P_5, R_0, m, f) by (P_6, R_0, m, f) and (P_7, R_0, m, f). Thus, the original system is terminating if each of (P_6, R_0, minimal, formative) and (P_7, R_0, minimal, formative) is finite. We consider the dependency pair problem (P_7, R_0, minimal, formative). We will use the reduction pair processor with usable rules [Kop12, Thm. 7.44]. (P_7, R_0) has no usable rules. It suffices to find a standard reduction pair [Kop12, Def. 6.69]. Thus, we must orient: not#(all(/\x.X(x))) >? not#(X(~c0)) not#(ex(/\x.X(x))) >? not#(X(~c1)) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: all = \G0.3 + G0(0) ex = \G0.3 + G0(0) not# = \y0.y0 ~c0 = 0 ~c1 = 0 Using this interpretation, the requirements translate to: [[not#(all(/\x._x0(x)))]] = 3 + F0(0) > F0(0) = [[not#(_x0(~c0))]] [[not#(ex(/\x._x0(x)))]] = 3 + F0(0) > F0(0) = [[not#(_x0(~c1))]] By the observations in [Kop12, Sec. 6.6], this reduction pair suffices; we may thus replace a dependency pair problem (P_7, 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_6, R_0, minimal, formative) is finite. We consider the dependency pair problem (P_6, R_0, minimal, formative). We will use the reduction pair processor [Kop12, Thm. 7.16]. As the system is abstraction-simple and the formative flag is set, it suffices to find a tagged reduction pair [Kop12, Def. 6.70]. Thus, we must orient: and#(X, all(/\x.Y(x))) >? and#(X, Y(~c0)) and#(X, all(/\x.Y(x))) >? Y(~c1) and#(all(/\x.X(x)), Y) >? and#(X(~c2), Y) and#(all(/\x.X(x)), Y) >? X(~c3) and#(X, ex(/\x.Y(x))) >? and#(X, Y(~c4)) and#(X, ex(/\x.Y(x))) >? Y(~c5) and#(ex(/\x.X(x)), Y) >? and#(X(~c6), Y) and#(ex(/\x.X(x)), Y) >? X(~c7) and(X, all(/\x.Y(x))) >= all(/\y.and-(X, Y(y))) and(all(/\x.X(x)), Y) >= all(/\y.and-(X(y), Y)) or(X, all(/\x.Y(x))) >= all(/\y.or-(X, Y(y))) or(all(/\x.X(x)), Y) >= all(/\y.or-(X(y), Y)) and(X, ex(/\x.Y(x))) >= ex(/\y.and-(X, Y(y))) and(ex(/\x.X(x)), Y) >= ex(/\y.and-(X(y), Y)) or(X, ex(/\x.Y(x))) >= ex(/\y.or-(X, Y(y))) or(ex(/\x.X(x)), Y) >= ex(/\y.or-(X(y), Y)) not(all(/\x.X(x))) >= ex(/\y.not-(X(y))) not(ex(/\x.X(x))) >= all(/\y.not-(X(y))) and-(X, Y) >= and(X, Y) and-(X, Y) >= and#(X, Y) not-(X) >= not(X) or-(X, Y) >= or(X, Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: all = \G0.G0(0) and = \y0y1.1 + y0 + y1 and- = \y0y1.1 + y0 + y1 and# = \y0y1.1 + y0 + y1 ex = \G0.G0(0) not = \y0.y0 not- = \y0.y0 or = \y0y1.y0 + y1 or- = \y0y1.y0 + y1 ~c0 = 0 ~c1 = 0 ~c2 = 0 ~c3 = 0 ~c4 = 0 ~c5 = 0 ~c6 = 0 ~c7 = 0 Using this interpretation, the requirements translate to: [[and#(_x0, all(/\x._x1(x)))]] = 1 + x0 + F1(0) >= 1 + x0 + F1(0) = [[and#(_x0, _x1(~c0))]] [[and#(_x0, all(/\x._x1(x)))]] = 1 + x0 + F1(0) > F1(0) = [[_x1(~c1)]] [[and#(all(/\x._x0(x)), _x1)]] = 1 + x1 + F0(0) >= 1 + x1 + F0(0) = [[and#(_x0(~c2), _x1)]] [[and#(all(/\x._x0(x)), _x1)]] = 1 + x1 + F0(0) > F0(0) = [[_x0(~c3)]] [[and#(_x0, ex(/\x._x1(x)))]] = 1 + x0 + F1(0) >= 1 + x0 + F1(0) = [[and#(_x0, _x1(~c4))]] [[and#(_x0, ex(/\x._x1(x)))]] = 1 + x0 + F1(0) > F1(0) = [[_x1(~c5)]] [[and#(ex(/\x._x0(x)), _x1)]] = 1 + x1 + F0(0) >= 1 + x1 + F0(0) = [[and#(_x0(~c6), _x1)]] [[and#(ex(/\x._x0(x)), _x1)]] = 1 + x1 + F0(0) > F0(0) = [[_x0(~c7)]] [[and(_x0, all(/\x._x1(x)))]] = 1 + x0 + F1(0) >= 1 + x0 + F1(0) = [[all(/\x.and-(_x0, _x1(x)))]] [[and(all(/\x._x0(x)), _x1)]] = 1 + x1 + F0(0) >= 1 + x1 + F0(0) = [[all(/\x.and-(_x0(x), _x1))]] [[or(_x0, all(/\x._x1(x)))]] = x0 + F1(0) >= x0 + F1(0) = [[all(/\x.or-(_x0, _x1(x)))]] [[or(all(/\x._x0(x)), _x1)]] = x1 + F0(0) >= x1 + F0(0) = [[all(/\x.or-(_x0(x), _x1))]] [[and(_x0, ex(/\x._x1(x)))]] = 1 + x0 + F1(0) >= 1 + x0 + F1(0) = [[ex(/\x.and-(_x0, _x1(x)))]] [[and(ex(/\x._x0(x)), _x1)]] = 1 + x1 + F0(0) >= 1 + x1 + F0(0) = [[ex(/\x.and-(_x0(x), _x1))]] [[or(_x0, ex(/\x._x1(x)))]] = x0 + F1(0) >= x0 + F1(0) = [[ex(/\x.or-(_x0, _x1(x)))]] [[or(ex(/\x._x0(x)), _x1)]] = x1 + F0(0) >= x1 + F0(0) = [[ex(/\x.or-(_x0(x), _x1))]] [[not(all(/\x._x0(x)))]] = F0(0) >= F0(0) = [[ex(/\x.not-(_x0(x)))]] [[not(ex(/\x._x0(x)))]] = F0(0) >= F0(0) = [[all(/\x.not-(_x0(x)))]] [[and-(_x0, _x1)]] = 1 + x0 + x1 >= 1 + x0 + x1 = [[and(_x0, _x1)]] [[and-(_x0, _x1)]] = 1 + x0 + x1 >= 1 + x0 + x1 = [[and#(_x0, _x1)]] [[not-(_x0)]] = x0 >= x0 = [[not(_x0)]] [[or-(_x0, _x1)]] = x0 + x1 >= x0 + x1 = [[or(_x0, _x1)]] By the observations in [Kop12, Sec. 6.6], this reduction pair suffices; we may thus replace the dependency pair problem (P_6, R_0, minimal, formative) by (P_8, R_0, minimal, formative), where P_8 consists of: and#(X, all(/\x.Y(x))) =#> and#(X, Y(y)) and#(all(/\x.X(x)), Y) =#> and#(X(y), Y) and#(X, ex(/\x.Y(x))) =#> and#(X, Y(y)) and#(ex(/\x.X(x)), Y) =#> and#(X(y), Y) Thus, the original system is terminating if (P_8, R_0, minimal, formative) is finite. We consider the dependency pair problem (P_8, R_0, minimal, formative). We will use the reduction pair processor with usable rules [Kop12, Thm. 7.44]. (P_8, R_0) has no usable rules. It suffices to find a standard reduction pair [Kop12, Def. 6.69]. Thus, we must orient: and#(X, all(/\x.Y(x))) >? and#(X, Y(~c0)) and#(all(/\x.X(x)), Y) >? and#(X(~c1), Y) and#(X, ex(/\x.Y(x))) >? and#(X, Y(~c2)) and#(ex(/\x.X(x)), Y) >? and#(X(~c3), Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: all = \G0.3 + 2G0(0) and# = \y0y1.y1 ex = \G0.3 + G0(0) ~c0 = 0 ~c1 = 0 ~c2 = 0 ~c3 = 0 Using this interpretation, the requirements translate to: [[and#(_x0, all(/\x._x1(x)))]] = 3 + 2F1(0) > F1(0) = [[and#(_x0, _x1(~c0))]] [[and#(all(/\x._x0(x)), _x1)]] = x1 >= x1 = [[and#(_x0(~c1), _x1)]] [[and#(_x0, ex(/\x._x1(x)))]] = 3 + F1(0) > F1(0) = [[and#(_x0, _x1(~c2))]] [[and#(ex(/\x._x0(x)), _x1)]] = x1 >= x1 = [[and#(_x0(~c3), _x1)]] By the observations in [Kop12, Sec. 6.6], this reduction pair suffices; we may thus replace the dependency pair problem (P_8, R_0, minimal, formative) by (P_9, R_0, minimal, formative), where P_9 consists of: and#(all(/\x.X(x)), Y) =#> and#(X(y), Y) and#(ex(/\x.X(x)), Y) =#> and#(X(y), Y) Thus, the original system is terminating if (P_9, R_0, minimal, formative) is finite. We consider the dependency pair problem (P_9, R_0, minimal, formative). We will use the reduction pair processor with usable rules [Kop12, Thm. 7.44]. (P_9, R_0) has no usable rules. It suffices to find a standard reduction pair [Kop12, Def. 6.69]. Thus, we must orient: and#(all(/\x.X(x)), Y) >? and#(X(~c0), Y) and#(ex(/\x.X(x)), Y) >? and#(X(~c1), Y) We orient these requirements with a polynomial interpretation in the natural numbers. The following interpretation satisfies the requirements: all = \G0.3 + G0(0) and# = \y0y1.y0 ex = \G0.3 + G0(0) ~c0 = 0 ~c1 = 0 Using this interpretation, the requirements translate to: [[and#(all(/\x._x0(x)), _x1)]] = 3 + F0(0) > F0(0) = [[and#(_x0(~c0), _x1)]] [[and#(ex(/\x._x0(x)), _x1)]] = 3 + F0(0) > F0(0) = [[and#(_x0(~c1), _x1)]] By the observations in [Kop12, Sec. 6.6], this reduction pair suffices; we may thus replace a dependency pair problem (P_9, 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.