WORST_CASE(?,O(n^2)) proof of input_ecIqu2taF1.trs # AProVE Commit ID: aff8ecad908e01718a4c36e68d2e55d5e0f16e15 fuhs 20220216 unpublished The Runtime Complexity (parallel-innermost) of the given CpxTRS could be proven to be BOUNDS(1, n^2). (0) CpxTRS (1) CpxTrsToCdtProof [UPPER BOUND(ID), 0 ms] (2) CdtProblem (3) CdtLeafRemovalProof [BOTH BOUNDS(ID, ID), 0 ms] (4) CdtProblem (5) CdtRhsSimplificationProcessorProof [BOTH BOUNDS(ID, ID), 0 ms] (6) CdtProblem (7) CdtUsableRulesProof [BOTH BOUNDS(ID, ID), 0 ms] (8) CdtProblem (9) CdtRuleRemovalProof [UPPER BOUND(ADD(n^1)), 145 ms] (10) CdtProblem (11) CdtRuleRemovalProof [UPPER BOUND(ADD(n^1)), 26 ms] (12) CdtProblem (13) CdtRuleRemovalProof [UPPER BOUND(ADD(n^2)), 173 ms] (14) CdtProblem (15) CdtRuleRemovalProof [UPPER BOUND(ADD(n^2)), 181 ms] (16) CdtProblem (17) CdtRuleRemovalProof [UPPER BOUND(ADD(n^2)), 156 ms] (18) CdtProblem (19) CdtKnowledgeProof [FINISHED, 0 ms] (20) BOUNDS(1, 1) ---------------------------------------- (0) Obligation: The Runtime Complexity (parallel-innermost) of the given CpxTRS could be proven to be BOUNDS(1, n^2). The TRS R consists of the following rules: eq(0, 0) -> true eq(0, s(x)) -> false eq(s(x), 0) -> false eq(s(x), s(y)) -> eq(x, y) or(true, y) -> true or(false, y) -> y union(empty, h) -> h union(edge(x, y, i), h) -> edge(x, y, union(i, h)) reach(x, y, empty, h) -> false reach(x, y, edge(u, v, i), h) -> if_reach_1(eq(x, u), x, y, edge(u, v, i), h) if_reach_1(true, x, y, edge(u, v, i), h) -> if_reach_2(eq(y, v), x, y, edge(u, v, i), h) if_reach_2(true, x, y, edge(u, v, i), h) -> true if_reach_2(false, x, y, edge(u, v, i), h) -> or(reach(x, y, i, h), reach(v, y, union(i, h), empty)) if_reach_1(false, x, y, edge(u, v, i), h) -> reach(x, y, i, edge(u, v, h)) S is empty. Rewrite Strategy: PARALLEL_INNERMOST ---------------------------------------- (1) CpxTrsToCdtProof (UPPER BOUND(ID)) Converted Cpx (relative) TRS with rewrite strategy PARALLEL_INNERMOST to CDT ---------------------------------------- (2) Obligation: Complexity Dependency Tuples Problem Rules: eq(0, 0) -> true eq(0, s(z0)) -> false eq(s(z0), 0) -> false eq(s(z0), s(z1)) -> eq(z0, z1) or(true, z0) -> true or(false, z0) -> z0 union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) reach(z0, z1, empty, z2) -> false reach(z0, z1, edge(z2, z3, z4), z5) -> if_reach_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5) if_reach_1(true, z0, z1, edge(z2, z3, z4), z5) -> if_reach_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5) if_reach_1(false, z0, z1, edge(z2, z3, z4), z5) -> reach(z0, z1, z4, edge(z2, z3, z5)) if_reach_2(true, z0, z1, edge(z2, z3, z4), z5) -> true if_reach_2(false, z0, z1, edge(z2, z3, z4), z5) -> or(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)) Tuples: EQ(0, 0) -> c EQ(0, s(z0)) -> c1 EQ(s(z0), 0) -> c2 EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) OR(true, z0) -> c4 OR(false, z0) -> c5 UNION(empty, z0) -> c6 UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, empty, z2) -> c8 REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(true, z0, z1, edge(z2, z3, z4), z5) -> c12 IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(OR(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)), REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(OR(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)), REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) S tuples: EQ(0, 0) -> c EQ(0, s(z0)) -> c1 EQ(s(z0), 0) -> c2 EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) OR(true, z0) -> c4 OR(false, z0) -> c5 UNION(empty, z0) -> c6 UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, empty, z2) -> c8 REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(true, z0, z1, edge(z2, z3, z4), z5) -> c12 IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(OR(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)), REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(OR(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)), REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) K tuples:none Defined Rule Symbols: eq_2, or_2, union_2, reach_4, if_reach_1_5, if_reach_2_5 Defined Pair Symbols: EQ_2, OR_2, UNION_2, REACH_4, IF_REACH_1_5, IF_REACH_2_5 Compound Symbols: c, c1, c2, c3_1, c4, c5, c6, c7_1, c8, c9_2, c10_2, c11_1, c12, c13_2, c14_3 ---------------------------------------- (3) CdtLeafRemovalProof (BOTH BOUNDS(ID, ID)) Removed 8 trailing nodes: IF_REACH_2(true, z0, z1, edge(z2, z3, z4), z5) -> c12 REACH(z0, z1, empty, z2) -> c8 UNION(empty, z0) -> c6 EQ(s(z0), 0) -> c2 EQ(0, s(z0)) -> c1 EQ(0, 0) -> c OR(true, z0) -> c4 OR(false, z0) -> c5 ---------------------------------------- (4) Obligation: Complexity Dependency Tuples Problem Rules: eq(0, 0) -> true eq(0, s(z0)) -> false eq(s(z0), 0) -> false eq(s(z0), s(z1)) -> eq(z0, z1) or(true, z0) -> true or(false, z0) -> z0 union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) reach(z0, z1, empty, z2) -> false reach(z0, z1, edge(z2, z3, z4), z5) -> if_reach_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5) if_reach_1(true, z0, z1, edge(z2, z3, z4), z5) -> if_reach_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5) if_reach_1(false, z0, z1, edge(z2, z3, z4), z5) -> reach(z0, z1, z4, edge(z2, z3, z5)) if_reach_2(true, z0, z1, edge(z2, z3, z4), z5) -> true if_reach_2(false, z0, z1, edge(z2, z3, z4), z5) -> or(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)) Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(OR(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)), REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(OR(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)), REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) S tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(OR(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)), REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(OR(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)), REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) K tuples:none Defined Rule Symbols: eq_2, or_2, union_2, reach_4, if_reach_1_5, if_reach_2_5 Defined Pair Symbols: EQ_2, UNION_2, REACH_4, IF_REACH_1_5, IF_REACH_2_5 Compound Symbols: c3_1, c7_1, c9_2, c10_2, c11_1, c13_2, c14_3 ---------------------------------------- (5) CdtRhsSimplificationProcessorProof (BOTH BOUNDS(ID, ID)) Removed 2 trailing tuple parts ---------------------------------------- (6) Obligation: Complexity Dependency Tuples Problem Rules: eq(0, 0) -> true eq(0, s(z0)) -> false eq(s(z0), 0) -> false eq(s(z0), s(z1)) -> eq(z0, z1) or(true, z0) -> true or(false, z0) -> z0 union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) reach(z0, z1, empty, z2) -> false reach(z0, z1, edge(z2, z3, z4), z5) -> if_reach_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5) if_reach_1(true, z0, z1, edge(z2, z3, z4), z5) -> if_reach_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5) if_reach_1(false, z0, z1, edge(z2, z3, z4), z5) -> reach(z0, z1, z4, edge(z2, z3, z5)) if_reach_2(true, z0, z1, edge(z2, z3, z4), z5) -> true if_reach_2(false, z0, z1, edge(z2, z3, z4), z5) -> or(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)) Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) S tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) K tuples:none Defined Rule Symbols: eq_2, or_2, union_2, reach_4, if_reach_1_5, if_reach_2_5 Defined Pair Symbols: EQ_2, UNION_2, REACH_4, IF_REACH_1_5, IF_REACH_2_5 Compound Symbols: c3_1, c7_1, c9_2, c10_2, c11_1, c13_1, c14_2 ---------------------------------------- (7) CdtUsableRulesProof (BOTH BOUNDS(ID, ID)) The following rules are not usable and were removed: or(true, z0) -> true or(false, z0) -> z0 reach(z0, z1, empty, z2) -> false reach(z0, z1, edge(z2, z3, z4), z5) -> if_reach_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5) if_reach_1(true, z0, z1, edge(z2, z3, z4), z5) -> if_reach_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5) if_reach_1(false, z0, z1, edge(z2, z3, z4), z5) -> reach(z0, z1, z4, edge(z2, z3, z5)) if_reach_2(true, z0, z1, edge(z2, z3, z4), z5) -> true if_reach_2(false, z0, z1, edge(z2, z3, z4), z5) -> or(reach(z0, z1, z4, z5), reach(z3, z1, union(z4, z5), empty)) ---------------------------------------- (8) Obligation: Complexity Dependency Tuples Problem Rules: eq(0, 0) -> true eq(0, s(z0)) -> false eq(s(z0), 0) -> false eq(s(z0), s(z1)) -> eq(z0, z1) union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) S tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) K tuples:none Defined Rule Symbols: eq_2, union_2 Defined Pair Symbols: EQ_2, UNION_2, REACH_4, IF_REACH_1_5, IF_REACH_2_5 Compound Symbols: c3_1, c7_1, c9_2, c10_2, c11_1, c13_1, c14_2 ---------------------------------------- (9) CdtRuleRemovalProof (UPPER BOUND(ADD(n^1))) Found a reduction pair which oriented the following tuples strictly. Hence they can be removed from S. IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) We considered the (Usable) Rules: eq(0, s(z0)) -> false eq(s(z0), 0) -> false eq(s(z0), s(z1)) -> eq(z0, z1) eq(0, 0) -> true union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) And the Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) The order we found is given by the following interpretation: Polynomial interpretation : POL(0) = [1] POL(EQ(x_1, x_2)) = 0 POL(IF_REACH_1(x_1, x_2, x_3, x_4, x_5)) = x_1 + x_2 + x_3 + x_4 + x_5 POL(IF_REACH_2(x_1, x_2, x_3, x_4, x_5)) = x_1 + x_2 + x_3 + x_4 + x_5 POL(REACH(x_1, x_2, x_3, x_4)) = x_1 + x_2 + x_3 + x_4 POL(UNION(x_1, x_2)) = 0 POL(c10(x_1, x_2)) = x_1 + x_2 POL(c11(x_1)) = x_1 POL(c13(x_1)) = x_1 POL(c14(x_1, x_2)) = x_1 + x_2 POL(c3(x_1)) = x_1 POL(c7(x_1)) = x_1 POL(c9(x_1, x_2)) = x_1 + x_2 POL(edge(x_1, x_2, x_3)) = [1] + x_1 + x_2 + x_3 POL(empty) = 0 POL(eq(x_1, x_2)) = 0 POL(false) = 0 POL(s(x_1)) = [1] + x_1 POL(true) = 0 POL(union(x_1, x_2)) = x_1 + x_2 ---------------------------------------- (10) Obligation: Complexity Dependency Tuples Problem Rules: eq(0, 0) -> true eq(0, s(z0)) -> false eq(s(z0), 0) -> false eq(s(z0), s(z1)) -> eq(z0, z1) union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) S tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) K tuples: IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) Defined Rule Symbols: eq_2, union_2 Defined Pair Symbols: EQ_2, UNION_2, REACH_4, IF_REACH_1_5, IF_REACH_2_5 Compound Symbols: c3_1, c7_1, c9_2, c10_2, c11_1, c13_1, c14_2 ---------------------------------------- (11) CdtRuleRemovalProof (UPPER BOUND(ADD(n^1))) Found a reduction pair which oriented the following tuples strictly. Hence they can be removed from S. IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) We considered the (Usable) Rules: union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) And the Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) The order we found is given by the following interpretation: Polynomial interpretation : POL(0) = [1] POL(EQ(x_1, x_2)) = 0 POL(IF_REACH_1(x_1, x_2, x_3, x_4, x_5)) = [1] + x_3 + x_4 + x_5 POL(IF_REACH_2(x_1, x_2, x_3, x_4, x_5)) = x_3 + x_4 + x_5 POL(REACH(x_1, x_2, x_3, x_4)) = [1] + x_2 + x_3 + x_4 POL(UNION(x_1, x_2)) = 0 POL(c10(x_1, x_2)) = x_1 + x_2 POL(c11(x_1)) = x_1 POL(c13(x_1)) = x_1 POL(c14(x_1, x_2)) = x_1 + x_2 POL(c3(x_1)) = x_1 POL(c7(x_1)) = x_1 POL(c9(x_1, x_2)) = x_1 + x_2 POL(edge(x_1, x_2, x_3)) = [1] + x_3 POL(empty) = 0 POL(eq(x_1, x_2)) = [1] + x_1 + x_2 POL(false) = [1] POL(s(x_1)) = [1] + x_1 POL(true) = [1] POL(union(x_1, x_2)) = x_1 + x_2 ---------------------------------------- (12) Obligation: Complexity Dependency Tuples Problem Rules: eq(0, 0) -> true eq(0, s(z0)) -> false eq(s(z0), 0) -> false eq(s(z0), s(z1)) -> eq(z0, z1) union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) S tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) K tuples: IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) Defined Rule Symbols: eq_2, union_2 Defined Pair Symbols: EQ_2, UNION_2, REACH_4, IF_REACH_1_5, IF_REACH_2_5 Compound Symbols: c3_1, c7_1, c9_2, c10_2, c11_1, c13_1, c14_2 ---------------------------------------- (13) CdtRuleRemovalProof (UPPER BOUND(ADD(n^2))) Found a reduction pair which oriented the following tuples strictly. Hence they can be removed from S. UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) We considered the (Usable) Rules: union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) And the Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) The order we found is given by the following interpretation: Polynomial interpretation : POL(0) = 0 POL(EQ(x_1, x_2)) = 0 POL(IF_REACH_1(x_1, x_2, x_3, x_4, x_5)) = x_5^2 + [2]x_4*x_5 + x_4^2 + x_2*x_4 POL(IF_REACH_2(x_1, x_2, x_3, x_4, x_5)) = x_5^2 + [2]x_4*x_5 + x_4^2 + x_2*x_4 POL(REACH(x_1, x_2, x_3, x_4)) = x_4^2 + [2]x_3*x_4 + x_1*x_3 + x_3^2 POL(UNION(x_1, x_2)) = x_1 POL(c10(x_1, x_2)) = x_1 + x_2 POL(c11(x_1)) = x_1 POL(c13(x_1)) = x_1 POL(c14(x_1, x_2)) = x_1 + x_2 POL(c3(x_1)) = x_1 POL(c7(x_1)) = x_1 POL(c9(x_1, x_2)) = x_1 + x_2 POL(edge(x_1, x_2, x_3)) = [1] + x_2 + x_3 POL(empty) = 0 POL(eq(x_1, x_2)) = 0 POL(false) = 0 POL(s(x_1)) = 0 POL(true) = 0 POL(union(x_1, x_2)) = x_1 + x_2 ---------------------------------------- (14) Obligation: Complexity Dependency Tuples Problem Rules: eq(0, 0) -> true eq(0, s(z0)) -> false eq(s(z0), 0) -> false eq(s(z0), s(z1)) -> eq(z0, z1) union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) S tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) K tuples: IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) Defined Rule Symbols: eq_2, union_2 Defined Pair Symbols: EQ_2, UNION_2, REACH_4, IF_REACH_1_5, IF_REACH_2_5 Compound Symbols: c3_1, c7_1, c9_2, c10_2, c11_1, c13_1, c14_2 ---------------------------------------- (15) CdtRuleRemovalProof (UPPER BOUND(ADD(n^2))) Found a reduction pair which oriented the following tuples strictly. Hence they can be removed from S. EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) We considered the (Usable) Rules: union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) And the Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) The order we found is given by the following interpretation: Polynomial interpretation : POL(0) = 0 POL(EQ(x_1, x_2)) = [2]x_1 POL(IF_REACH_1(x_1, x_2, x_3, x_4, x_5)) = [2]x_3 + x_5^2 + [2]x_4*x_5 + [2]x_3*x_5 + x_4^2 + [2]x_3*x_4 + [2]x_2*x_4 POL(IF_REACH_2(x_1, x_2, x_3, x_4, x_5)) = x_5^2 + [2]x_4*x_5 + [2]x_3*x_5 + x_4^2 + [2]x_3*x_4 + [2]x_2*x_4 POL(REACH(x_1, x_2, x_3, x_4)) = [2]x_1 + [2]x_2 + x_4^2 + [2]x_3*x_4 + [2]x_2*x_4 + [2]x_1*x_3 + x_3^2 + [2]x_2*x_3 POL(UNION(x_1, x_2)) = 0 POL(c10(x_1, x_2)) = x_1 + x_2 POL(c11(x_1)) = x_1 POL(c13(x_1)) = x_1 POL(c14(x_1, x_2)) = x_1 + x_2 POL(c3(x_1)) = x_1 POL(c7(x_1)) = x_1 POL(c9(x_1, x_2)) = x_1 + x_2 POL(edge(x_1, x_2, x_3)) = [1] + x_2 + x_3 POL(empty) = 0 POL(eq(x_1, x_2)) = 0 POL(false) = 0 POL(s(x_1)) = [1] + x_1 POL(true) = 0 POL(union(x_1, x_2)) = x_1 + x_2 ---------------------------------------- (16) Obligation: Complexity Dependency Tuples Problem Rules: eq(0, 0) -> true eq(0, s(z0)) -> false eq(s(z0), 0) -> false eq(s(z0), s(z1)) -> eq(z0, z1) union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) S tuples: REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) K tuples: IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) Defined Rule Symbols: eq_2, union_2 Defined Pair Symbols: EQ_2, UNION_2, REACH_4, IF_REACH_1_5, IF_REACH_2_5 Compound Symbols: c3_1, c7_1, c9_2, c10_2, c11_1, c13_1, c14_2 ---------------------------------------- (17) CdtRuleRemovalProof (UPPER BOUND(ADD(n^2))) Found a reduction pair which oriented the following tuples strictly. Hence they can be removed from S. IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) We considered the (Usable) Rules: union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) And the Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) The order we found is given by the following interpretation: Polynomial interpretation : POL(0) = 0 POL(EQ(x_1, x_2)) = 0 POL(IF_REACH_1(x_1, x_2, x_3, x_4, x_5)) = [2]x_4 + x_5^2 + [2]x_4*x_5 + x_4^2 + x_2*x_4 POL(IF_REACH_2(x_1, x_2, x_3, x_4, x_5)) = x_5^2 + [2]x_4*x_5 + x_4^2 + x_2*x_4 POL(REACH(x_1, x_2, x_3, x_4)) = [2]x_3 + x_4^2 + [2]x_3*x_4 + x_1*x_3 + x_3^2 POL(UNION(x_1, x_2)) = 0 POL(c10(x_1, x_2)) = x_1 + x_2 POL(c11(x_1)) = x_1 POL(c13(x_1)) = x_1 POL(c14(x_1, x_2)) = x_1 + x_2 POL(c3(x_1)) = x_1 POL(c7(x_1)) = x_1 POL(c9(x_1, x_2)) = x_1 + x_2 POL(edge(x_1, x_2, x_3)) = [2] + x_2 + x_3 POL(empty) = 0 POL(eq(x_1, x_2)) = 0 POL(false) = 0 POL(s(x_1)) = 0 POL(true) = 0 POL(union(x_1, x_2)) = x_1 + x_2 ---------------------------------------- (18) Obligation: Complexity Dependency Tuples Problem Rules: eq(0, 0) -> true eq(0, s(z0)) -> false eq(s(z0), 0) -> false eq(s(z0), s(z1)) -> eq(z0, z1) union(empty, z0) -> z0 union(edge(z0, z1, z2), z3) -> edge(z0, z1, union(z2, z3)) Tuples: EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) S tuples: REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) K tuples: IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c13(REACH(z0, z1, z4, z5)) IF_REACH_2(false, z0, z1, edge(z2, z3, z4), z5) -> c14(REACH(z3, z1, union(z4, z5), empty), UNION(z4, z5)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) UNION(edge(z0, z1, z2), z3) -> c7(UNION(z2, z3)) EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) Defined Rule Symbols: eq_2, union_2 Defined Pair Symbols: EQ_2, UNION_2, REACH_4, IF_REACH_1_5, IF_REACH_2_5 Compound Symbols: c3_1, c7_1, c9_2, c10_2, c11_1, c13_1, c14_2 ---------------------------------------- (19) CdtKnowledgeProof (FINISHED) The following tuples could be moved from S to K by knowledge propagation: REACH(z0, z1, edge(z2, z3, z4), z5) -> c9(IF_REACH_1(eq(z0, z2), z0, z1, edge(z2, z3, z4), z5), EQ(z0, z2)) IF_REACH_1(true, z0, z1, edge(z2, z3, z4), z5) -> c10(IF_REACH_2(eq(z1, z3), z0, z1, edge(z2, z3, z4), z5), EQ(z1, z3)) IF_REACH_1(false, z0, z1, edge(z2, z3, z4), z5) -> c11(REACH(z0, z1, z4, edge(z2, z3, z5))) EQ(s(z0), s(z1)) -> c3(EQ(z0, z1)) Now S is empty ---------------------------------------- (20) BOUNDS(1, 1)