(0) Obligation:

JBC Problem based on JBC Program:
/**
* A recursive loop.
*
* All calls terminate.
*
* Julia + BinTerm prove that the call to <tt>test()</tt> terminates.
*
* @author <A HREF="mailto:fausto.spoto@univr.it">Fausto Spoto</A>
*/

public class Double {

private static void test(int n) {
for (int i = 0; i < n; i++)
test(i);
}

public static void main(String[] args) {
test(10);
}
}

(1) JBCToGraph (SOUND transformation)

Constructed TerminationGraph.

(2) Obligation:

Termination Graph based on JBC Program:
Double.main([Ljava/lang/String;)V: Graph of 31 nodes with 0 SCCs.

Double.test(I)V: Graph of 21 nodes with 1 SCC.


(3) TerminationGraphToSCCProof (SOUND transformation)

Splitted TerminationGraph to 1 SCCs.

(4) Obligation:

SCC of termination graph based on JBC Program.
SCC contains nodes from the following methods: Double.test(I)V
SCC calls the following helper methods: Double.test(I)V
Performed SCC analyses:
  • Used field analysis yielded the following read fields:
  • Marker field analysis yielded the following relations that could be markers:

(5) SCCToIDPv1Proof (SOUND transformation)

Transformed FIGraph SCCs to IDPs. Log:

Generated 19 rules for P and 21 rules for R.


P rules:
f370_0_test_Store(EOS(STATIC_370), i28, i28, matching1) → f372_0_test_Load(EOS(STATIC_372), i28, i28, 0) | =(matching1, 0)
f372_0_test_Load(EOS(STATIC_372), i28, i28, matching1) → f426_0_test_Load(EOS(STATIC_426), i28, i28, 0) | =(matching1, 0)
f426_0_test_Load(EOS(STATIC_426), i32, i32, i33) → f482_0_test_Load(EOS(STATIC_482), i32, i32, i33)
f482_0_test_Load(EOS(STATIC_482), i32, i32, i42) → f524_0_test_Load(EOS(STATIC_524), i32, i32, i42)
f524_0_test_Load(EOS(STATIC_524), i32, i32, i50) → f567_0_test_Load(EOS(STATIC_567), i32, i32, i50)
f567_0_test_Load(EOS(STATIC_567), i32, i32, i58) → f568_0_test_Load(EOS(STATIC_568), i32, i32, i58, i58)
f568_0_test_Load(EOS(STATIC_568), i32, i32, i58, i58) → f570_0_test_GE(EOS(STATIC_570), i32, i32, i58, i58, i32)
f570_0_test_GE(EOS(STATIC_570), i32, i32, i58, i58, i32) → f572_0_test_GE(EOS(STATIC_572), i32, i32, i58, i58, i32)
f572_0_test_GE(EOS(STATIC_572), i32, i32, i58, i58, i32) → f575_0_test_Load(EOS(STATIC_575), i32, i32, i58) | <(i58, i32)
f575_0_test_Load(EOS(STATIC_575), i32, i32, i58) → f578_0_test_InvokeMethod(EOS(STATIC_578), i32, i32, i58, i58)
f578_0_test_InvokeMethod(EOS(STATIC_578), i32, i32, i58, i58) → f584_1_test_InvokeMethod(f584_0_test_ConstantStackPush(EOS(STATIC_584), i58, i58), i32, i32, i58, i58)
f584_0_test_ConstantStackPush(EOS(STATIC_584), i58, i58) → f589_0_test_ConstantStackPush(EOS(STATIC_589), i58, i58)
f589_0_test_ConstantStackPush(EOS(STATIC_589), i58, i58) → f368_0_test_ConstantStackPush(EOS(STATIC_368), i58, i58)
f368_0_test_ConstantStackPush(EOS(STATIC_368), i28, i28) → f370_0_test_Store(EOS(STATIC_370), i28, i28, 0)
f596_0_test_Return(EOS(STATIC_596), i32, i32, i64, i64) → f598_0_test_Inc(EOS(STATIC_598), i32, i32, i64)
f598_0_test_Inc(EOS(STATIC_598), i32, i32, i64) → f599_0_test_JMP(EOS(STATIC_599), i32, i32, +(i64, 1)) | >=(i64, 0)
f599_0_test_JMP(EOS(STATIC_599), i32, i32, i65) → f602_0_test_Load(EOS(STATIC_602), i32, i32, i65)
f602_0_test_Load(EOS(STATIC_602), i32, i32, i65) → f567_0_test_Load(EOS(STATIC_567), i32, i32, i65)
f584_1_test_InvokeMethod(f574_0_test_Return(EOS(STATIC_574), i64), i32, i32, i64, i64) → f596_0_test_Return(EOS(STATIC_596), i32, i32, i64, i64)
R rules:
f368_0_test_ConstantStackPush(EOS(STATIC_368), i28, i28) → f370_0_test_Store(EOS(STATIC_370), i28, i28, 0)
f370_0_test_Store(EOS(STATIC_370), i28, i28, matching1) → f372_0_test_Load(EOS(STATIC_372), i28, i28, 0) | =(matching1, 0)
f372_0_test_Load(EOS(STATIC_372), i28, i28, matching1) → f426_0_test_Load(EOS(STATIC_426), i28, i28, 0) | =(matching1, 0)
f426_0_test_Load(EOS(STATIC_426), i32, i32, i33) → f482_0_test_Load(EOS(STATIC_482), i32, i32, i33)
f482_0_test_Load(EOS(STATIC_482), i32, i32, i42) → f524_0_test_Load(EOS(STATIC_524), i32, i32, i42)
f524_0_test_Load(EOS(STATIC_524), i32, i32, i50) → f567_0_test_Load(EOS(STATIC_567), i32, i32, i50)
f567_0_test_Load(EOS(STATIC_567), i32, i32, i58) → f568_0_test_Load(EOS(STATIC_568), i32, i32, i58, i58)
f568_0_test_Load(EOS(STATIC_568), i32, i32, i58, i58) → f570_0_test_GE(EOS(STATIC_570), i32, i32, i58, i58, i32)
f570_0_test_GE(EOS(STATIC_570), i32, i32, i58, i58, i32) → f571_0_test_GE(EOS(STATIC_571), i32, i32, i58, i58, i32)
f570_0_test_GE(EOS(STATIC_570), i32, i32, i58, i58, i32) → f572_0_test_GE(EOS(STATIC_572), i32, i32, i58, i58, i32)
f571_0_test_GE(EOS(STATIC_571), i32, i32, i58, i58, i32) → f574_0_test_Return(EOS(STATIC_574), i32) | >=(i58, i32)
f572_0_test_GE(EOS(STATIC_572), i32, i32, i58, i58, i32) → f575_0_test_Load(EOS(STATIC_575), i32, i32, i58) | <(i58, i32)
f575_0_test_Load(EOS(STATIC_575), i32, i32, i58) → f578_0_test_InvokeMethod(EOS(STATIC_578), i32, i32, i58, i58)
f578_0_test_InvokeMethod(EOS(STATIC_578), i32, i32, i58, i58) → f584_1_test_InvokeMethod(f584_0_test_ConstantStackPush(EOS(STATIC_584), i58, i58), i32, i32, i58, i58)
f584_0_test_ConstantStackPush(EOS(STATIC_584), i58, i58) → f589_0_test_ConstantStackPush(EOS(STATIC_589), i58, i58)
f596_0_test_Return(EOS(STATIC_596), i32, i32, i64, i64) → f598_0_test_Inc(EOS(STATIC_598), i32, i32, i64)
f598_0_test_Inc(EOS(STATIC_598), i32, i32, i64) → f599_0_test_JMP(EOS(STATIC_599), i32, i32, +(i64, 1)) | >=(i64, 0)
f599_0_test_JMP(EOS(STATIC_599), i32, i32, i65) → f602_0_test_Load(EOS(STATIC_602), i32, i32, i65)
f602_0_test_Load(EOS(STATIC_602), i32, i32, i65) → f567_0_test_Load(EOS(STATIC_567), i32, i32, i65)
f589_0_test_ConstantStackPush(EOS(STATIC_589), i58, i58) → f368_0_test_ConstantStackPush(EOS(STATIC_368), i58, i58)
f584_1_test_InvokeMethod(f574_0_test_Return(EOS(STATIC_574), i64), i32, i32, i64, i64) → f596_0_test_Return(EOS(STATIC_596), i32, i32, i64, i64)

Combined rules. Obtained 2 conditional rules for P and 4 conditional rules for R.


P rules:
f370_0_test_Store(EOS(STATIC_370), x0, x0, 0) → f584_1_test_InvokeMethod(f370_0_test_Store(EOS(STATIC_370), 0, 0, 0), x0, x0, 0, 0) | >(x0, 0)
f584_1_test_InvokeMethod(f574_0_test_Return(EOS(STATIC_574), x0), x1, x1, x0, x0) → f584_1_test_InvokeMethod(f370_0_test_Store(EOS(STATIC_370), +(x0, 1), +(x0, 1), 0), x1, x1, +(x0, 1), +(x0, 1)) | &&(>(+(x0, 1), 0), >(x1, +(x0, 1)))
R rules:
f370_0_test_Store(EOS(STATIC_370), x0, x0, 0) → f570_0_test_GE(EOS(STATIC_570), x0, x0, 0, 0, x0)
f570_0_test_GE(EOS(STATIC_570), x0, x0, x1, x1, x0) → f574_0_test_Return(EOS(STATIC_574), x0) | >=(x1, x0)
f570_0_test_GE(EOS(STATIC_570), x0, x0, x1, x1, x0) → f584_1_test_InvokeMethod(f370_0_test_Store(EOS(STATIC_370), x1, x1, 0), x0, x0, x1, x1) | <(x1, x0)
f584_1_test_InvokeMethod(f574_0_test_Return(EOS(STATIC_574), x0), x1, x1, x0, x0) → f570_0_test_GE(EOS(STATIC_570), x1, x1, +(x0, 1), +(x0, 1), x1) | >(+(x0, 1), 0)

Filtered ground terms:



f370_0_test_Store(x1, x2, x3, x4) → f370_0_test_Store(x2, x3)
Cond_f370_0_test_Store(x1, x2, x3, x4, x5) → Cond_f370_0_test_Store(x1, x3, x4)
f574_0_test_Return(x1, x2) → f574_0_test_Return(x2)
f570_0_test_GE(x1, x2, x3, x4, x5, x6) → f570_0_test_GE(x2, x3, x4, x5, x6)
Cond_f570_0_test_GE(x1, x2, x3, x4, x5, x6, x7) → Cond_f570_0_test_GE(x1, x3, x4, x5, x6, x7)
Cond_f570_0_test_GE1(x1, x2, x3, x4, x5, x6, x7) → Cond_f570_0_test_GE1(x1, x3, x4, x5, x6, x7)

Filtered duplicate args:



f370_0_test_Store(x1, x2) → f370_0_test_Store(x2)
Cond_f370_0_test_Store(x1, x2, x3) → Cond_f370_0_test_Store(x1, x3)
f584_1_test_InvokeMethod(x1, x2, x3, x4, x5) → f584_1_test_InvokeMethod(x1, x3)
Cond_f584_1_test_InvokeMethod(x1, x2, x3, x4, x5, x6) → Cond_f584_1_test_InvokeMethod(x1, x2, x4)
f570_0_test_GE(x1, x2, x3, x4, x5) → f570_0_test_GE(x4, x5)
Cond_f570_0_test_GE(x1, x2, x3, x4, x5, x6) → Cond_f570_0_test_GE(x1, x5, x6)
Cond_f570_0_test_GE1(x1, x2, x3, x4, x5, x6) → Cond_f570_0_test_GE1(x1, x5, x6)

Filtered unneeded arguments:



Cond_f570_0_test_GE(x1, x2, x3) → Cond_f570_0_test_GE(x1, x3)

Combined rules. Obtained 4 conditional rules for P and 3 conditional rules for R.


P rules:
F370_0_TEST_STORE(x0) → F584_1_TEST_INVOKEMETHOD(f370_0_test_Store(0), x0) | >(x0, 0)
F370_0_TEST_STORE(x0) → F370_0_TEST_STORE(0) | >(x0, 0)
F584_1_TEST_INVOKEMETHOD(f574_0_test_Return(x0), x1) → F584_1_TEST_INVOKEMETHOD(f370_0_test_Store(+(x0, 1)), x1) | &&(>(x0, -1), >(x1, +(x0, 1)))
F584_1_TEST_INVOKEMETHOD(f574_0_test_Return(x0), x1) → F370_0_TEST_STORE(+(x0, 1)) | &&(>(x0, -1), >(x1, +(x0, 1)))
R rules:
f570_0_test_GE(x1, x0) → f574_0_test_Return(x0) | >=(x1, x0)
f584_1_test_InvokeMethod(f574_0_test_Return(x0), x1) → f570_0_test_GE(+(x0, 1), x1) | >(x0, -1)
f570_0_test_GE(x0, x1) → f584_1_test_InvokeMethod(f570_0_test_GE(0, x0), x1) | >(x1, x0)

Finished conversion. Obtained 8 rules for P and 6 rules for R. System has predefined symbols.


P rules:
F370_0_TEST_STORE'(x0) → COND_F370_0_TEST_STORE(>(x0, 0), x0)
COND_F370_0_TEST_STORE(TRUE, x0) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0)
F370_0_TEST_STORE'(x0) → COND_F370_0_TEST_STORE1(>(x0, 0), x0)
COND_F370_0_TEST_STORE1(TRUE, x0) → F370_0_TEST_STORE'(0)
F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0), x1) → COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0, -1), >(x1, +(x0, 1))), f574_0_test_Return(x0), x1)
COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0), x1) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0, 1)), x1)
F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0), x1) → COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0, -1), >(x1, +(x0, 1))), f574_0_test_Return(x0), x1)
COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0), x1) → F370_0_TEST_STORE'(+(x0, 1))
R rules:
f570_0_test_GE(x1, x0) → Cond_f570_0_test_GE(>=(x1, x0), x1, x0)
Cond_f570_0_test_GE(TRUE, x1, x0) → f574_0_test_Return(x0)
f584_1_test_InvokeMethod(f574_0_test_Return(x0), x1) → Cond_f584_1_test_InvokeMethod(>(x0, -1), f574_0_test_Return(x0), x1)
Cond_f584_1_test_InvokeMethod(TRUE, f574_0_test_Return(x0), x1) → f570_0_test_GE(+(x0, 1), x1)
f570_0_test_GE(x0, x1) → Cond_f570_0_test_GE1(>(x1, x0), x0, x1)
Cond_f570_0_test_GE1(TRUE, x0, x1) → f584_1_test_InvokeMethod(f570_0_test_GE(0, x0), x1)

(6) Obligation:

IDP problem:
The following function symbols are pre-defined:
!=~Neq: (Integer, Integer) -> Boolean
*~Mul: (Integer, Integer) -> Integer
>=~Ge: (Integer, Integer) -> Boolean
-1~UnaryMinus: (Integer) -> Integer
|~Bwor: (Integer, Integer) -> Integer
/~Div: (Integer, Integer) -> Integer
=~Eq: (Integer, Integer) -> Boolean
~Bwxor: (Integer, Integer) -> Integer
||~Lor: (Boolean, Boolean) -> Boolean
!~Lnot: (Boolean) -> Boolean
<~Lt: (Integer, Integer) -> Boolean
-~Sub: (Integer, Integer) -> Integer
<=~Le: (Integer, Integer) -> Boolean
>~Gt: (Integer, Integer) -> Boolean
~~Bwnot: (Integer) -> Integer
%~Mod: (Integer, Integer) -> Integer
&~Bwand: (Integer, Integer) -> Integer
+~Add: (Integer, Integer) -> Integer
&&~Land: (Boolean, Boolean) -> Boolean


The following domains are used:

Integer, Boolean


The ITRS R consists of the following rules:
f570_0_test_GE(x1, x0) → Cond_f570_0_test_GE(x1 >= x0, x1, x0)
Cond_f570_0_test_GE(TRUE, x1, x0) → f574_0_test_Return(x0)
f584_1_test_InvokeMethod(f574_0_test_Return(x0), x1) → Cond_f584_1_test_InvokeMethod(x0 > -1, f574_0_test_Return(x0), x1)
Cond_f584_1_test_InvokeMethod(TRUE, f574_0_test_Return(x0), x1) → f570_0_test_GE(x0 + 1, x1)
f570_0_test_GE(x0, x1) → Cond_f570_0_test_GE1(x1 > x0, x0, x1)
Cond_f570_0_test_GE1(TRUE, x0, x1) → f584_1_test_InvokeMethod(f570_0_test_GE(0, x0), x1)

The integer pair graph contains the following rules and edges:
(0): F370_0_TEST_STORE'(x0[0]) → COND_F370_0_TEST_STORE(x0[0] > 0, x0[0])
(1): COND_F370_0_TEST_STORE(TRUE, x0[1]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0[1])
(2): F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(x0[2] > 0, x0[2])
(3): COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0)
(4): F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4]) → COND_F584_1_TEST_INVOKEMETHOD(x0[4] > -1 && x1[4] > x0[4] + 1, f574_0_test_Return(x0[4]), x1[4])
(5): COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0[5]), x1[5]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(x0[5] + 1), x1[5])
(6): F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6]) → COND_F584_1_TEST_INVOKEMETHOD1(x0[6] > -1 && x1[6] > x0[6] + 1, f574_0_test_Return(x0[6]), x1[6])
(7): COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[7]), x1[7]) → F370_0_TEST_STORE'(x0[7] + 1)

(0) -> (1), if (x0[0] > 0x0[0]* x0[1])


(1) -> (4), if (f370_0_test_Store(0) →* f574_0_test_Return(x0[4])∧x0[1]* x1[4])


(1) -> (6), if (f370_0_test_Store(0) →* f574_0_test_Return(x0[6])∧x0[1]* x1[6])


(2) -> (3), if (x0[2] > 0x0[2]* x0[3])


(3) -> (0), if (0* x0[0])


(3) -> (2), if (0* x0[2])


(4) -> (5), if (x0[4] > -1 && x1[4] > x0[4] + 1f574_0_test_Return(x0[4]) →* f574_0_test_Return(x0[5])∧x1[4]* x1[5])


(5) -> (4), if (f370_0_test_Store(x0[5] + 1) →* f574_0_test_Return(x0[4])∧x1[5]* x1[4])


(5) -> (6), if (f370_0_test_Store(x0[5] + 1) →* f574_0_test_Return(x0[6])∧x1[5]* x1[6])


(6) -> (7), if (x0[6] > -1 && x1[6] > x0[6] + 1f574_0_test_Return(x0[6]) →* f574_0_test_Return(x0[7])∧x1[6]* x1[7])


(7) -> (0), if (x0[7] + 1* x0[0])


(7) -> (2), if (x0[7] + 1* x0[2])



The set Q consists of the following terms:
f570_0_test_GE(x0, x1)
Cond_f570_0_test_GE(TRUE, x0, x1)
f584_1_test_InvokeMethod(f574_0_test_Return(x0), x1)
Cond_f584_1_test_InvokeMethod(TRUE, f574_0_test_Return(x0), x1)
Cond_f570_0_test_GE1(TRUE, x0, x1)

(7) IDPNonInfProof (SOUND transformation)

Used the following options for this NonInfProof:
IDPGPoloSolver: Range: [(-1,2)] IsNat: true Interpretation Shape Heuristic: aprove.DPFramework.IDPProblem.Processors.nonInf.poly.IdpDefaultShapeHeuristic@29f999f Constraint Generator: NonInfConstraintGenerator: PathGenerator: MetricPathGenerator: Max Left Steps: 1 Max Right Steps: 1

The constraints were generated the following way:
The DP Problem is simplified using the Induction Calculus [NONINF] with the following steps:
Note that final constraints are written in bold face.


For Pair F370_0_TEST_STORE'(x0) → COND_F370_0_TEST_STORE(>(x0, 0), x0) the following chains were created:
  • We consider the chain F370_0_TEST_STORE'(x0[0]) → COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0]), COND_F370_0_TEST_STORE(TRUE, x0[1]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0[1]) which results in the following constraint:

    (1)    (>(x0[0], 0)=TRUEx0[0]=x0[1]F370_0_TEST_STORE'(x0[0])≥NonInfC∧F370_0_TEST_STORE'(x0[0])≥COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])∧(UIncreasing(COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])), ≥))



    We simplified constraint (1) using rule (IV) which results in the following new constraint:

    (2)    (>(x0[0], 0)=TRUEF370_0_TEST_STORE'(x0[0])≥NonInfC∧F370_0_TEST_STORE'(x0[0])≥COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])∧(UIncreasing(COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])), ≥))



    We simplified constraint (2) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (3)    (0 ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])), ≥)∧[(-1)bni_42 + (-1)Bound*bni_42] + [(2)bni_42]x0[0] ≥ 0∧[(-1)bso_43] + [3]x0[0] ≥ 0)



    We simplified constraint (3) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (4)    (0 ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])), ≥)∧[(-1)bni_42 + (-1)Bound*bni_42] + [(2)bni_42]x0[0] ≥ 0∧[(-1)bso_43] + [3]x0[0] ≥ 0)



    We simplified constraint (4) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (5)    (0 ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])), ≥)∧[(-1)bni_42 + (-1)Bound*bni_42] + [(2)bni_42]x0[0] ≥ 0∧[(-1)bso_43] + [3]x0[0] ≥ 0)



    We simplified constraint (5) using rules (IDP_UNRESTRICTED_VARS), (IDP_POLY_GCD) which results in the following new constraint:

    (6)    (0 ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])), ≥)∧[(2)bni_42] ≥ 0∧[(-1)bni_42 + (-1)Bound*bni_42] ≥ 0∧[(-1)bso_43] ≥ 0∧[1] ≥ 0)







For Pair COND_F370_0_TEST_STORE(TRUE, x0) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0) the following chains were created:
  • We consider the chain F370_0_TEST_STORE'(x0[0]) → COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0]), COND_F370_0_TEST_STORE(TRUE, x0[1]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0[1]), F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4]) → COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4]) which results in the following constraint:

    (7)    (>(x0[0], 0)=TRUEx0[0]=x0[1]f370_0_test_Store(0)=f574_0_test_Return(x0[4])∧x0[1]=x1[4]COND_F370_0_TEST_STORE(TRUE, x0[1])≥NonInfC∧COND_F370_0_TEST_STORE(TRUE, x0[1])≥F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0[1])∧(UIncreasing(F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0[1])), ≥))



    We solved constraint (7) using rules (I), (II).
  • We consider the chain F370_0_TEST_STORE'(x0[0]) → COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0]), COND_F370_0_TEST_STORE(TRUE, x0[1]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0[1]), F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6]) → COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6]) which results in the following constraint:

    (8)    (>(x0[0], 0)=TRUEx0[0]=x0[1]f370_0_test_Store(0)=f574_0_test_Return(x0[6])∧x0[1]=x1[6]COND_F370_0_TEST_STORE(TRUE, x0[1])≥NonInfC∧COND_F370_0_TEST_STORE(TRUE, x0[1])≥F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0[1])∧(UIncreasing(F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0[1])), ≥))



    We solved constraint (8) using rules (I), (II).




For Pair F370_0_TEST_STORE'(x0) → COND_F370_0_TEST_STORE1(>(x0, 0), x0) the following chains were created:
  • We consider the chain F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2]), COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0) which results in the following constraint:

    (9)    (>(x0[2], 0)=TRUEx0[2]=x0[3]F370_0_TEST_STORE'(x0[2])≥NonInfC∧F370_0_TEST_STORE'(x0[2])≥COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])∧(UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥))



    We simplified constraint (9) using rule (IV) which results in the following new constraint:

    (10)    (>(x0[2], 0)=TRUEF370_0_TEST_STORE'(x0[2])≥NonInfC∧F370_0_TEST_STORE'(x0[2])≥COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])∧(UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥))



    We simplified constraint (10) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (11)    (0 ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥)∧[(-1)bni_44 + (-1)Bound*bni_44] + [(2)bni_44]x0[2] ≥ 0∧[(-1)bso_45] ≥ 0)



    We simplified constraint (11) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (12)    (0 ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥)∧[(-1)bni_44 + (-1)Bound*bni_44] + [(2)bni_44]x0[2] ≥ 0∧[(-1)bso_45] ≥ 0)



    We simplified constraint (12) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (13)    (0 ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥)∧[(-1)bni_44 + (-1)Bound*bni_44] + [(2)bni_44]x0[2] ≥ 0∧[(-1)bso_45] ≥ 0)



    We simplified constraint (13) using rule (IDP_UNRESTRICTED_VARS) which results in the following new constraint:

    (14)    (0 ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥)∧[(2)bni_44] ≥ 0∧[(-1)bni_44 + (-1)Bound*bni_44] ≥ 0∧0 ≥ 0∧[(-1)bso_45] ≥ 0)







For Pair COND_F370_0_TEST_STORE1(TRUE, x0) → F370_0_TEST_STORE'(0) the following chains were created:
  • We consider the chain F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2]), COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0), F370_0_TEST_STORE'(x0[0]) → COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0]) which results in the following constraint:

    (15)    (>(x0[2], 0)=TRUEx0[2]=x0[3]0=x0[0]COND_F370_0_TEST_STORE1(TRUE, x0[3])≥NonInfC∧COND_F370_0_TEST_STORE1(TRUE, x0[3])≥F370_0_TEST_STORE'(0)∧(UIncreasing(F370_0_TEST_STORE'(0)), ≥))



    We simplified constraint (15) using rules (III), (IV) which results in the following new constraint:

    (16)    (>(x0[2], 0)=TRUECOND_F370_0_TEST_STORE1(TRUE, x0[2])≥NonInfC∧COND_F370_0_TEST_STORE1(TRUE, x0[2])≥F370_0_TEST_STORE'(0)∧(UIncreasing(F370_0_TEST_STORE'(0)), ≥))



    We simplified constraint (16) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (17)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(-1)bni_46 + (-1)Bound*bni_46] + [(2)bni_46]x0[2] ≥ 0∧[(-1)bso_47] + [2]x0[2] ≥ 0)



    We simplified constraint (17) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (18)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(-1)bni_46 + (-1)Bound*bni_46] + [(2)bni_46]x0[2] ≥ 0∧[(-1)bso_47] + [2]x0[2] ≥ 0)



    We simplified constraint (18) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (19)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(-1)bni_46 + (-1)Bound*bni_46] + [(2)bni_46]x0[2] ≥ 0∧[(-1)bso_47] + [2]x0[2] ≥ 0)



    We simplified constraint (19) using rules (IDP_UNRESTRICTED_VARS), (IDP_POLY_GCD) which results in the following new constraint:

    (20)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(2)bni_46] ≥ 0∧[(-1)bni_46 + (-1)Bound*bni_46] ≥ 0∧[(-1)bso_47] ≥ 0∧[1] ≥ 0)



  • We consider the chain F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2]), COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0), F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2]) which results in the following constraint:

    (21)    (>(x0[2], 0)=TRUEx0[2]=x0[3]0=x0[2]1COND_F370_0_TEST_STORE1(TRUE, x0[3])≥NonInfC∧COND_F370_0_TEST_STORE1(TRUE, x0[3])≥F370_0_TEST_STORE'(0)∧(UIncreasing(F370_0_TEST_STORE'(0)), ≥))



    We simplified constraint (21) using rules (III), (IV) which results in the following new constraint:

    (22)    (>(x0[2], 0)=TRUECOND_F370_0_TEST_STORE1(TRUE, x0[2])≥NonInfC∧COND_F370_0_TEST_STORE1(TRUE, x0[2])≥F370_0_TEST_STORE'(0)∧(UIncreasing(F370_0_TEST_STORE'(0)), ≥))



    We simplified constraint (22) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (23)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(-1)bni_46 + (-1)Bound*bni_46] + [(2)bni_46]x0[2] ≥ 0∧[(-1)bso_47] + [2]x0[2] ≥ 0)



    We simplified constraint (23) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (24)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(-1)bni_46 + (-1)Bound*bni_46] + [(2)bni_46]x0[2] ≥ 0∧[(-1)bso_47] + [2]x0[2] ≥ 0)



    We simplified constraint (24) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (25)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(-1)bni_46 + (-1)Bound*bni_46] + [(2)bni_46]x0[2] ≥ 0∧[(-1)bso_47] + [2]x0[2] ≥ 0)



    We simplified constraint (25) using rules (IDP_UNRESTRICTED_VARS), (IDP_POLY_GCD) which results in the following new constraint:

    (26)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(2)bni_46] ≥ 0∧[(-1)bni_46 + (-1)Bound*bni_46] ≥ 0∧[(-1)bso_47] ≥ 0∧[1] ≥ 0)







For Pair F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0), x1) → COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0, -1), >(x1, +(x0, 1))), f574_0_test_Return(x0), x1) the following chains were created:
  • We consider the chain F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4]) → COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4]), COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0[5]), x1[5]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0[5], 1)), x1[5]) which results in the following constraint:

    (27)    (&&(>(x0[4], -1), >(x1[4], +(x0[4], 1)))=TRUEf574_0_test_Return(x0[4])=f574_0_test_Return(x0[5])∧x1[4]=x1[5]F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4])≥NonInfC∧F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4])≥COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])∧(UIncreasing(COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])), ≥))



    We simplified constraint (27) using rules (I), (II), (IV) which results in the following new constraint:

    (28)    (&&(>(x0[4], -1), >(x1[4], +(x0[4], 1)))=TRUEF584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4])≥NonInfC∧F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4])≥COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])∧(UIncreasing(COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])), ≥))



    We simplified constraint (28) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (29)    (0 ≥ 0 ⇒ (UIncreasing(COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])), ≥)∧[(2)bni_48 + (-1)Bound*bni_48] + [(2)bni_48]x1[4] + [(3)bni_48]x0[4] ≥ 0∧[2 + (-1)bso_49] + [3]x1[4] + [3]x0[4] ≥ 0)



    We simplified constraint (29) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (30)    (0 ≥ 0 ⇒ (UIncreasing(COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])), ≥)∧[(2)bni_48 + (-1)Bound*bni_48] + [(2)bni_48]x1[4] + [(3)bni_48]x0[4] ≥ 0∧[2 + (-1)bso_49] + [3]x1[4] + [3]x0[4] ≥ 0)



    We simplified constraint (30) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (31)    (0 ≥ 0 ⇒ (UIncreasing(COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])), ≥)∧[(2)bni_48 + (-1)Bound*bni_48] + [(2)bni_48]x1[4] + [(3)bni_48]x0[4] ≥ 0∧[2 + (-1)bso_49] + [3]x1[4] + [3]x0[4] ≥ 0)



    We simplified constraint (31) using rules (IDP_UNRESTRICTED_VARS), (IDP_POLY_GCD) which results in the following new constraint:

    (32)    (0 ≥ 0 ⇒ (UIncreasing(COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])), ≥)∧[(2)bni_48] ≥ 0∧[(3)bni_48] ≥ 0∧[(2)bni_48 + (-1)Bound*bni_48] ≥ 0∧[2 + (-1)bso_49] ≥ 0∧[1] ≥ 0∧[1] ≥ 0)







For Pair COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0), x1) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0, 1)), x1) the following chains were created:
  • We consider the chain F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4]) → COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4]), COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0[5]), x1[5]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0[5], 1)), x1[5]), F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4]) → COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4]) which results in the following constraint:

    (33)    (&&(>(x0[4], -1), >(x1[4], +(x0[4], 1)))=TRUEf574_0_test_Return(x0[4])=f574_0_test_Return(x0[5])∧x1[4]=x1[5]f370_0_test_Store(+(x0[5], 1))=f574_0_test_Return(x0[4]1)∧x1[5]=x1[4]1COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0[5]), x1[5])≥NonInfC∧COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0[5]), x1[5])≥F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0[5], 1)), x1[5])∧(UIncreasing(F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0[5], 1)), x1[5])), ≥))



    We solved constraint (33) using rules (I), (II).
  • We consider the chain F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4]) → COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4]), COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0[5]), x1[5]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0[5], 1)), x1[5]), F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6]) → COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6]) which results in the following constraint:

    (34)    (&&(>(x0[4], -1), >(x1[4], +(x0[4], 1)))=TRUEf574_0_test_Return(x0[4])=f574_0_test_Return(x0[5])∧x1[4]=x1[5]f370_0_test_Store(+(x0[5], 1))=f574_0_test_Return(x0[6])∧x1[5]=x1[6]COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0[5]), x1[5])≥NonInfC∧COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0[5]), x1[5])≥F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0[5], 1)), x1[5])∧(UIncreasing(F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0[5], 1)), x1[5])), ≥))



    We solved constraint (34) using rules (I), (II).




For Pair F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0), x1) → COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0, -1), >(x1, +(x0, 1))), f574_0_test_Return(x0), x1) the following chains were created:
  • We consider the chain F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6]) → COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6]), COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[7]), x1[7]) → F370_0_TEST_STORE'(+(x0[7], 1)) which results in the following constraint:

    (35)    (&&(>(x0[6], -1), >(x1[6], +(x0[6], 1)))=TRUEf574_0_test_Return(x0[6])=f574_0_test_Return(x0[7])∧x1[6]=x1[7]F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6])≥NonInfC∧F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6])≥COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])∧(UIncreasing(COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])), ≥))



    We simplified constraint (35) using rules (I), (II), (IV) which results in the following new constraint:

    (36)    (&&(>(x0[6], -1), >(x1[6], +(x0[6], 1)))=TRUEF584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6])≥NonInfC∧F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6])≥COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])∧(UIncreasing(COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])), ≥))



    We simplified constraint (36) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (37)    (0 ≥ 0 ⇒ (UIncreasing(COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])), ≥)∧[(2)bni_50 + (-1)Bound*bni_50] + [(2)bni_50]x1[6] + [(3)bni_50]x0[6] ≥ 0∧[(-1)bso_51] + x1[6] ≥ 0)



    We simplified constraint (37) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (38)    (0 ≥ 0 ⇒ (UIncreasing(COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])), ≥)∧[(2)bni_50 + (-1)Bound*bni_50] + [(2)bni_50]x1[6] + [(3)bni_50]x0[6] ≥ 0∧[(-1)bso_51] + x1[6] ≥ 0)



    We simplified constraint (38) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (39)    (0 ≥ 0 ⇒ (UIncreasing(COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])), ≥)∧[(2)bni_50 + (-1)Bound*bni_50] + [(2)bni_50]x1[6] + [(3)bni_50]x0[6] ≥ 0∧[(-1)bso_51] + x1[6] ≥ 0)



    We simplified constraint (39) using rule (IDP_UNRESTRICTED_VARS) which results in the following new constraint:

    (40)    (0 ≥ 0 ⇒ (UIncreasing(COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])), ≥)∧[(2)bni_50] ≥ 0∧[(3)bni_50] ≥ 0∧[(2)bni_50 + (-1)Bound*bni_50] ≥ 0∧[1] ≥ 0∧0 ≥ 0∧[(-1)bso_51] ≥ 0)







For Pair COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0), x1) → F370_0_TEST_STORE'(+(x0, 1)) the following chains were created:
  • We consider the chain F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6]) → COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6]), COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[7]), x1[7]) → F370_0_TEST_STORE'(+(x0[7], 1)), F370_0_TEST_STORE'(x0[0]) → COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0]) which results in the following constraint:

    (41)    (&&(>(x0[6], -1), >(x1[6], +(x0[6], 1)))=TRUEf574_0_test_Return(x0[6])=f574_0_test_Return(x0[7])∧x1[6]=x1[7]+(x0[7], 1)=x0[0]COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[7]), x1[7])≥NonInfC∧COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[7]), x1[7])≥F370_0_TEST_STORE'(+(x0[7], 1))∧(UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥))



    We simplified constraint (41) using rules (I), (II), (III), (IV) which results in the following new constraint:

    (42)    (&&(>(x0[6], -1), >(x1[6], +(x0[6], 1)))=TRUECOND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[6]), x1[6])≥NonInfC∧COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[6]), x1[6])≥F370_0_TEST_STORE'(+(x0[6], 1))∧(UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥))



    We simplified constraint (42) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (43)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥)∧[(2)bni_52 + (-1)Bound*bni_52] + [bni_52]x1[6] + [(3)bni_52]x0[6] ≥ 0∧[3 + (-1)bso_53] + x1[6] + [3]x0[6] ≥ 0)



    We simplified constraint (43) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (44)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥)∧[(2)bni_52 + (-1)Bound*bni_52] + [bni_52]x1[6] + [(3)bni_52]x0[6] ≥ 0∧[3 + (-1)bso_53] + x1[6] + [3]x0[6] ≥ 0)



    We simplified constraint (44) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (45)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥)∧[(2)bni_52 + (-1)Bound*bni_52] + [bni_52]x1[6] + [(3)bni_52]x0[6] ≥ 0∧[3 + (-1)bso_53] + x1[6] + [3]x0[6] ≥ 0)



    We simplified constraint (45) using rules (IDP_UNRESTRICTED_VARS), (IDP_POLY_GCD) which results in the following new constraint:

    (46)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥)∧[bni_52] ≥ 0∧[(3)bni_52] ≥ 0∧[(2)bni_52 + (-1)Bound*bni_52] ≥ 0∧[1] ≥ 0∧[3 + (-1)bso_53] ≥ 0∧[1] ≥ 0)



  • We consider the chain F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6]) → COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6]), COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[7]), x1[7]) → F370_0_TEST_STORE'(+(x0[7], 1)), F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2]) which results in the following constraint:

    (47)    (&&(>(x0[6], -1), >(x1[6], +(x0[6], 1)))=TRUEf574_0_test_Return(x0[6])=f574_0_test_Return(x0[7])∧x1[6]=x1[7]+(x0[7], 1)=x0[2]COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[7]), x1[7])≥NonInfC∧COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[7]), x1[7])≥F370_0_TEST_STORE'(+(x0[7], 1))∧(UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥))



    We simplified constraint (47) using rules (I), (II), (III), (IV) which results in the following new constraint:

    (48)    (&&(>(x0[6], -1), >(x1[6], +(x0[6], 1)))=TRUECOND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[6]), x1[6])≥NonInfC∧COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[6]), x1[6])≥F370_0_TEST_STORE'(+(x0[6], 1))∧(UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥))



    We simplified constraint (48) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (49)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥)∧[(2)bni_52 + (-1)Bound*bni_52] + [bni_52]x1[6] + [(3)bni_52]x0[6] ≥ 0∧[3 + (-1)bso_53] + x1[6] + [3]x0[6] ≥ 0)



    We simplified constraint (49) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (50)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥)∧[(2)bni_52 + (-1)Bound*bni_52] + [bni_52]x1[6] + [(3)bni_52]x0[6] ≥ 0∧[3 + (-1)bso_53] + x1[6] + [3]x0[6] ≥ 0)



    We simplified constraint (50) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (51)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥)∧[(2)bni_52 + (-1)Bound*bni_52] + [bni_52]x1[6] + [(3)bni_52]x0[6] ≥ 0∧[3 + (-1)bso_53] + x1[6] + [3]x0[6] ≥ 0)



    We simplified constraint (51) using rules (IDP_UNRESTRICTED_VARS), (IDP_POLY_GCD) which results in the following new constraint:

    (52)    (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥)∧[bni_52] ≥ 0∧[(3)bni_52] ≥ 0∧[(2)bni_52 + (-1)Bound*bni_52] ≥ 0∧[1] ≥ 0∧[3 + (-1)bso_53] ≥ 0∧[1] ≥ 0)







To summarize, we get the following constraints P for the following pairs.
  • F370_0_TEST_STORE'(x0) → COND_F370_0_TEST_STORE(>(x0, 0), x0)
    • (0 ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])), ≥)∧[(2)bni_42] ≥ 0∧[(-1)bni_42 + (-1)Bound*bni_42] ≥ 0∧[(-1)bso_43] ≥ 0∧[1] ≥ 0)

  • COND_F370_0_TEST_STORE(TRUE, x0) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0)

  • F370_0_TEST_STORE'(x0) → COND_F370_0_TEST_STORE1(>(x0, 0), x0)
    • (0 ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥)∧[(2)bni_44] ≥ 0∧[(-1)bni_44 + (-1)Bound*bni_44] ≥ 0∧0 ≥ 0∧[(-1)bso_45] ≥ 0)

  • COND_F370_0_TEST_STORE1(TRUE, x0) → F370_0_TEST_STORE'(0)
    • (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(2)bni_46] ≥ 0∧[(-1)bni_46 + (-1)Bound*bni_46] ≥ 0∧[(-1)bso_47] ≥ 0∧[1] ≥ 0)
    • (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(2)bni_46] ≥ 0∧[(-1)bni_46 + (-1)Bound*bni_46] ≥ 0∧[(-1)bso_47] ≥ 0∧[1] ≥ 0)

  • F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0), x1) → COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0, -1), >(x1, +(x0, 1))), f574_0_test_Return(x0), x1)
    • (0 ≥ 0 ⇒ (UIncreasing(COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])), ≥)∧[(2)bni_48] ≥ 0∧[(3)bni_48] ≥ 0∧[(2)bni_48 + (-1)Bound*bni_48] ≥ 0∧[2 + (-1)bso_49] ≥ 0∧[1] ≥ 0∧[1] ≥ 0)

  • COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0), x1) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0, 1)), x1)

  • F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0), x1) → COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0, -1), >(x1, +(x0, 1))), f574_0_test_Return(x0), x1)
    • (0 ≥ 0 ⇒ (UIncreasing(COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])), ≥)∧[(2)bni_50] ≥ 0∧[(3)bni_50] ≥ 0∧[(2)bni_50 + (-1)Bound*bni_50] ≥ 0∧[1] ≥ 0∧0 ≥ 0∧[(-1)bso_51] ≥ 0)

  • COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0), x1) → F370_0_TEST_STORE'(+(x0, 1))
    • (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥)∧[bni_52] ≥ 0∧[(3)bni_52] ≥ 0∧[(2)bni_52 + (-1)Bound*bni_52] ≥ 0∧[1] ≥ 0∧[3 + (-1)bso_53] ≥ 0∧[1] ≥ 0)
    • (0 ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(+(x0[7], 1))), ≥)∧[bni_52] ≥ 0∧[(3)bni_52] ≥ 0∧[(2)bni_52 + (-1)Bound*bni_52] ≥ 0∧[1] ≥ 0∧[3 + (-1)bso_53] ≥ 0∧[1] ≥ 0)




The constraints for P> respective Pbound are constructed from P where we just replace every occurence of "t ≥ s" in P by "t > s" respective "t ≥ c". Here c stands for the fresh constant used for Pbound.
Using the following integer polynomial ordering the resulting constraints can be solved
Polynomial interpretation over integers with natural coefficients for non-tuple symbols [NONINF][POLO]:

POL(TRUE) = 0   
POL(FALSE) = 0   
POL(f570_0_test_GE(x1, x2)) = 0   
POL(Cond_f570_0_test_GE(x1, x2, x3)) = 0   
POL(>=(x1, x2)) = 0   
POL(f574_0_test_Return(x1)) = [1] + [3]x1   
POL(f584_1_test_InvokeMethod(x1, x2)) = 0   
POL(Cond_f584_1_test_InvokeMethod(x1, x2, x3)) = 0   
POL(>(x1, x2)) = 0   
POL(-1) = 0   
POL(+(x1, x2)) = 0   
POL(1) = 0   
POL(Cond_f570_0_test_GE1(x1, x2, x3)) = 0   
POL(0) = 0   
POL(F370_0_TEST_STORE'(x1)) = [-1] + [2]x1   
POL(COND_F370_0_TEST_STORE(x1, x2)) = [-1] + [-1]x2   
POL(F584_1_TEST_INVOKEMETHOD'(x1, x2)) = [1] + [2]x2 + x1   
POL(f370_0_test_Store(x1)) = 0   
POL(COND_F370_0_TEST_STORE1(x1, x2)) = [-1] + [2]x2   
POL(COND_F584_1_TEST_INVOKEMETHOD(x1, x2, x3)) = [-1]x3 + x1   
POL(&&(x1, x2)) = 0   
POL(COND_F584_1_TEST_INVOKEMETHOD1(x1, x2, x3)) = [1] + x3 + x2 + x1   

The following pairs are in P>:

COND_F370_0_TEST_STORE(TRUE, x0[1]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0[1])
F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4]) → COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])
COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0[5]), x1[5]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0[5], 1)), x1[5])
COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[7]), x1[7]) → F370_0_TEST_STORE'(+(x0[7], 1))

The following pairs are in Pbound:

F370_0_TEST_STORE'(x0[0]) → COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])
COND_F370_0_TEST_STORE(TRUE, x0[1]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(0), x0[1])
F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])
COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0)
F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[4]), x1[4]) → COND_F584_1_TEST_INVOKEMETHOD(&&(>(x0[4], -1), >(x1[4], +(x0[4], 1))), f574_0_test_Return(x0[4]), x1[4])
COND_F584_1_TEST_INVOKEMETHOD(TRUE, f574_0_test_Return(x0[5]), x1[5]) → F584_1_TEST_INVOKEMETHOD'(f370_0_test_Store(+(x0[5], 1)), x1[5])
F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6]) → COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])
COND_F584_1_TEST_INVOKEMETHOD1(TRUE, f574_0_test_Return(x0[7]), x1[7]) → F370_0_TEST_STORE'(+(x0[7], 1))

The following pairs are in P:

F370_0_TEST_STORE'(x0[0]) → COND_F370_0_TEST_STORE(>(x0[0], 0), x0[0])
F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])
COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0)
F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6]) → COND_F584_1_TEST_INVOKEMETHOD1(&&(>(x0[6], -1), >(x1[6], +(x0[6], 1))), f574_0_test_Return(x0[6]), x1[6])

At least the following rules have been oriented under context sensitive arithmetic replacement:

&&(TRUE, TRUE)1TRUE1
&&(TRUE, FALSE)1FALSE1
&&(FALSE, TRUE)1FALSE1
&&(FALSE, FALSE)1FALSE1

(8) Obligation:

IDP problem:
The following function symbols are pre-defined:
!=~Neq: (Integer, Integer) -> Boolean
*~Mul: (Integer, Integer) -> Integer
>=~Ge: (Integer, Integer) -> Boolean
-1~UnaryMinus: (Integer) -> Integer
|~Bwor: (Integer, Integer) -> Integer
/~Div: (Integer, Integer) -> Integer
=~Eq: (Integer, Integer) -> Boolean
~Bwxor: (Integer, Integer) -> Integer
||~Lor: (Boolean, Boolean) -> Boolean
!~Lnot: (Boolean) -> Boolean
<~Lt: (Integer, Integer) -> Boolean
-~Sub: (Integer, Integer) -> Integer
<=~Le: (Integer, Integer) -> Boolean
>~Gt: (Integer, Integer) -> Boolean
~~Bwnot: (Integer) -> Integer
%~Mod: (Integer, Integer) -> Integer
&~Bwand: (Integer, Integer) -> Integer
+~Add: (Integer, Integer) -> Integer
&&~Land: (Boolean, Boolean) -> Boolean


The following domains are used:

Integer, Boolean


The ITRS R consists of the following rules:
f570_0_test_GE(x1, x0) → Cond_f570_0_test_GE(x1 >= x0, x1, x0)
Cond_f570_0_test_GE(TRUE, x1, x0) → f574_0_test_Return(x0)
f584_1_test_InvokeMethod(f574_0_test_Return(x0), x1) → Cond_f584_1_test_InvokeMethod(x0 > -1, f574_0_test_Return(x0), x1)
Cond_f584_1_test_InvokeMethod(TRUE, f574_0_test_Return(x0), x1) → f570_0_test_GE(x0 + 1, x1)
f570_0_test_GE(x0, x1) → Cond_f570_0_test_GE1(x1 > x0, x0, x1)
Cond_f570_0_test_GE1(TRUE, x0, x1) → f584_1_test_InvokeMethod(f570_0_test_GE(0, x0), x1)

The integer pair graph contains the following rules and edges:
(0): F370_0_TEST_STORE'(x0[0]) → COND_F370_0_TEST_STORE(x0[0] > 0, x0[0])
(2): F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(x0[2] > 0, x0[2])
(3): COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0)
(6): F584_1_TEST_INVOKEMETHOD'(f574_0_test_Return(x0[6]), x1[6]) → COND_F584_1_TEST_INVOKEMETHOD1(x0[6] > -1 && x1[6] > x0[6] + 1, f574_0_test_Return(x0[6]), x1[6])

(3) -> (0), if (0* x0[0])


(3) -> (2), if (0* x0[2])


(2) -> (3), if (x0[2] > 0x0[2]* x0[3])



The set Q consists of the following terms:
f570_0_test_GE(x0, x1)
Cond_f570_0_test_GE(TRUE, x0, x1)
f584_1_test_InvokeMethod(f574_0_test_Return(x0), x1)
Cond_f584_1_test_InvokeMethod(TRUE, f574_0_test_Return(x0), x1)
Cond_f570_0_test_GE1(TRUE, x0, x1)

(9) IDependencyGraphProof (EQUIVALENT transformation)

The approximation of the Dependency Graph [LPAR04,FROCOS05,EDGSTAR] contains 1 SCC with 2 less nodes.

(10) Obligation:

IDP problem:
The following function symbols are pre-defined:
!=~Neq: (Integer, Integer) -> Boolean
*~Mul: (Integer, Integer) -> Integer
>=~Ge: (Integer, Integer) -> Boolean
-1~UnaryMinus: (Integer) -> Integer
|~Bwor: (Integer, Integer) -> Integer
/~Div: (Integer, Integer) -> Integer
=~Eq: (Integer, Integer) -> Boolean
~Bwxor: (Integer, Integer) -> Integer
||~Lor: (Boolean, Boolean) -> Boolean
!~Lnot: (Boolean) -> Boolean
<~Lt: (Integer, Integer) -> Boolean
-~Sub: (Integer, Integer) -> Integer
<=~Le: (Integer, Integer) -> Boolean
>~Gt: (Integer, Integer) -> Boolean
~~Bwnot: (Integer) -> Integer
%~Mod: (Integer, Integer) -> Integer
&~Bwand: (Integer, Integer) -> Integer
+~Add: (Integer, Integer) -> Integer
&&~Land: (Boolean, Boolean) -> Boolean


The following domains are used:

Integer


The ITRS R consists of the following rules:
f570_0_test_GE(x1, x0) → Cond_f570_0_test_GE(x1 >= x0, x1, x0)
Cond_f570_0_test_GE(TRUE, x1, x0) → f574_0_test_Return(x0)
f584_1_test_InvokeMethod(f574_0_test_Return(x0), x1) → Cond_f584_1_test_InvokeMethod(x0 > -1, f574_0_test_Return(x0), x1)
Cond_f584_1_test_InvokeMethod(TRUE, f574_0_test_Return(x0), x1) → f570_0_test_GE(x0 + 1, x1)
f570_0_test_GE(x0, x1) → Cond_f570_0_test_GE1(x1 > x0, x0, x1)
Cond_f570_0_test_GE1(TRUE, x0, x1) → f584_1_test_InvokeMethod(f570_0_test_GE(0, x0), x1)

The integer pair graph contains the following rules and edges:
(3): COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0)
(2): F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(x0[2] > 0, x0[2])

(3) -> (2), if (0* x0[2])


(2) -> (3), if (x0[2] > 0x0[2]* x0[3])



The set Q consists of the following terms:
f570_0_test_GE(x0, x1)
Cond_f570_0_test_GE(TRUE, x0, x1)
f584_1_test_InvokeMethod(f574_0_test_Return(x0), x1)
Cond_f584_1_test_InvokeMethod(TRUE, f574_0_test_Return(x0), x1)
Cond_f570_0_test_GE1(TRUE, x0, x1)

(11) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(12) Obligation:

IDP problem:
The following function symbols are pre-defined:
!=~Neq: (Integer, Integer) -> Boolean
*~Mul: (Integer, Integer) -> Integer
>=~Ge: (Integer, Integer) -> Boolean
-1~UnaryMinus: (Integer) -> Integer
|~Bwor: (Integer, Integer) -> Integer
/~Div: (Integer, Integer) -> Integer
=~Eq: (Integer, Integer) -> Boolean
~Bwxor: (Integer, Integer) -> Integer
||~Lor: (Boolean, Boolean) -> Boolean
!~Lnot: (Boolean) -> Boolean
<~Lt: (Integer, Integer) -> Boolean
-~Sub: (Integer, Integer) -> Integer
<=~Le: (Integer, Integer) -> Boolean
>~Gt: (Integer, Integer) -> Boolean
~~Bwnot: (Integer) -> Integer
%~Mod: (Integer, Integer) -> Integer
&~Bwand: (Integer, Integer) -> Integer
+~Add: (Integer, Integer) -> Integer
&&~Land: (Boolean, Boolean) -> Boolean


The following domains are used:

Integer


R is empty.

The integer pair graph contains the following rules and edges:
(3): COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0)
(2): F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(x0[2] > 0, x0[2])

(3) -> (2), if (0* x0[2])


(2) -> (3), if (x0[2] > 0x0[2]* x0[3])



The set Q consists of the following terms:
f570_0_test_GE(x0, x1)
Cond_f570_0_test_GE(TRUE, x0, x1)
f584_1_test_InvokeMethod(f574_0_test_Return(x0), x1)
Cond_f584_1_test_InvokeMethod(TRUE, f574_0_test_Return(x0), x1)
Cond_f570_0_test_GE1(TRUE, x0, x1)

(13) IDPNonInfProof (SOUND transformation)

Used the following options for this NonInfProof:
IDPGPoloSolver: Range: [(-1,2)] IsNat: false Interpretation Shape Heuristic: aprove.DPFramework.IDPProblem.Processors.nonInf.poly.IdpDefaultShapeHeuristic@1ee5c7ab Constraint Generator: NonInfConstraintGenerator: PathGenerator: MetricPathGenerator: Max Left Steps: 1 Max Right Steps: 1

The constraints were generated the following way:
The DP Problem is simplified using the Induction Calculus [NONINF] with the following steps:
Note that final constraints are written in bold face.


For Pair COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0) the following chains were created:
  • We consider the chain F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2]), COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0), F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2]) which results in the following constraint:

    (1)    (>(x0[2], 0)=TRUEx0[2]=x0[3]0=x0[2]1COND_F370_0_TEST_STORE1(TRUE, x0[3])≥NonInfC∧COND_F370_0_TEST_STORE1(TRUE, x0[3])≥F370_0_TEST_STORE'(0)∧(UIncreasing(F370_0_TEST_STORE'(0)), ≥))



    We simplified constraint (1) using rules (III), (IV) which results in the following new constraint:

    (2)    (>(x0[2], 0)=TRUECOND_F370_0_TEST_STORE1(TRUE, x0[2])≥NonInfC∧COND_F370_0_TEST_STORE1(TRUE, x0[2])≥F370_0_TEST_STORE'(0)∧(UIncreasing(F370_0_TEST_STORE'(0)), ≥))



    We simplified constraint (2) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (3)    (x0[2] + [-1] ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(2)bni_9 + (-1)Bound*bni_9] ≥ 0∧[(-1)bso_10] ≥ 0)



    We simplified constraint (3) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (4)    (x0[2] + [-1] ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(2)bni_9 + (-1)Bound*bni_9] ≥ 0∧[(-1)bso_10] ≥ 0)



    We simplified constraint (4) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (5)    (x0[2] + [-1] ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(2)bni_9 + (-1)Bound*bni_9] ≥ 0∧[(-1)bso_10] ≥ 0)



    We simplified constraint (5) using rule (IDP_SMT_SPLIT) which results in the following new constraint:

    (6)    (x0[2] ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(2)bni_9 + (-1)Bound*bni_9] ≥ 0∧[(-1)bso_10] ≥ 0)







For Pair F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2]) the following chains were created:
  • We consider the chain F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2]), COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0) which results in the following constraint:

    (7)    (>(x0[2], 0)=TRUEx0[2]=x0[3]F370_0_TEST_STORE'(x0[2])≥NonInfC∧F370_0_TEST_STORE'(x0[2])≥COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])∧(UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥))



    We simplified constraint (7) using rule (IV) which results in the following new constraint:

    (8)    (>(x0[2], 0)=TRUEF370_0_TEST_STORE'(x0[2])≥NonInfC∧F370_0_TEST_STORE'(x0[2])≥COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])∧(UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥))



    We simplified constraint (8) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (9)    (x0[2] + [-1] ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥)∧[(2)bni_11 + (-1)Bound*bni_11] + [bni_11]x0[2] ≥ 0∧[(-1)bso_12] + x0[2] ≥ 0)



    We simplified constraint (9) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (10)    (x0[2] + [-1] ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥)∧[(2)bni_11 + (-1)Bound*bni_11] + [bni_11]x0[2] ≥ 0∧[(-1)bso_12] + x0[2] ≥ 0)



    We simplified constraint (10) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (11)    (x0[2] + [-1] ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥)∧[(2)bni_11 + (-1)Bound*bni_11] + [bni_11]x0[2] ≥ 0∧[(-1)bso_12] + x0[2] ≥ 0)



    We simplified constraint (11) using rule (IDP_SMT_SPLIT) which results in the following new constraint:

    (12)    (x0[2] ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥)∧[(3)bni_11 + (-1)Bound*bni_11] + [bni_11]x0[2] ≥ 0∧[1 + (-1)bso_12] + x0[2] ≥ 0)







To summarize, we get the following constraints P for the following pairs.
  • COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0)
    • (x0[2] ≥ 0 ⇒ (UIncreasing(F370_0_TEST_STORE'(0)), ≥)∧[(2)bni_9 + (-1)Bound*bni_9] ≥ 0∧[(-1)bso_10] ≥ 0)

  • F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])
    • (x0[2] ≥ 0 ⇒ (UIncreasing(COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])), ≥)∧[(3)bni_11 + (-1)Bound*bni_11] + [bni_11]x0[2] ≥ 0∧[1 + (-1)bso_12] + x0[2] ≥ 0)




The constraints for P> respective Pbound are constructed from P where we just replace every occurence of "t ≥ s" in P by "t > s" respective "t ≥ c". Here c stands for the fresh constant used for Pbound.
Using the following integer polynomial ordering the resulting constraints can be solved
Polynomial interpretation over integers[POLO]:

POL(TRUE) = 0   
POL(FALSE) = 0   
POL(COND_F370_0_TEST_STORE1(x1, x2)) = [2]   
POL(F370_0_TEST_STORE'(x1)) = [2] + x1   
POL(0) = 0   
POL(>(x1, x2)) = 0   

The following pairs are in P>:

F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])

The following pairs are in Pbound:

COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0)
F370_0_TEST_STORE'(x0[2]) → COND_F370_0_TEST_STORE1(>(x0[2], 0), x0[2])

The following pairs are in P:

COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0)

There are no usable rules.

(14) Obligation:

IDP problem:
The following function symbols are pre-defined:
!=~Neq: (Integer, Integer) -> Boolean
*~Mul: (Integer, Integer) -> Integer
>=~Ge: (Integer, Integer) -> Boolean
-1~UnaryMinus: (Integer) -> Integer
|~Bwor: (Integer, Integer) -> Integer
/~Div: (Integer, Integer) -> Integer
=~Eq: (Integer, Integer) -> Boolean
~Bwxor: (Integer, Integer) -> Integer
||~Lor: (Boolean, Boolean) -> Boolean
!~Lnot: (Boolean) -> Boolean
<~Lt: (Integer, Integer) -> Boolean
-~Sub: (Integer, Integer) -> Integer
<=~Le: (Integer, Integer) -> Boolean
>~Gt: (Integer, Integer) -> Boolean
~~Bwnot: (Integer) -> Integer
%~Mod: (Integer, Integer) -> Integer
&~Bwand: (Integer, Integer) -> Integer
+~Add: (Integer, Integer) -> Integer
&&~Land: (Boolean, Boolean) -> Boolean


The following domains are used:
none


R is empty.

The integer pair graph contains the following rules and edges:
(3): COND_F370_0_TEST_STORE1(TRUE, x0[3]) → F370_0_TEST_STORE'(0)


The set Q consists of the following terms:
f570_0_test_GE(x0, x1)
Cond_f570_0_test_GE(TRUE, x0, x1)
f584_1_test_InvokeMethod(f574_0_test_Return(x0), x1)
Cond_f584_1_test_InvokeMethod(TRUE, f574_0_test_Return(x0), x1)
Cond_f570_0_test_GE1(TRUE, x0, x1)

(15) IDependencyGraphProof (EQUIVALENT transformation)

The approximation of the Dependency Graph [LPAR04,FROCOS05,EDGSTAR] contains 0 SCCs with 1 less node.

(16) TRUE