(0) Obligation:

JBC Problem based on JBC Program:
Manifest-Version: 1.0 Created-By: 1.6.0_16 (Sun Microsystems Inc.) Main-Class: example_1/Test
package example_1;

public class A {

int incr(int i) {
return i=i+1;
}
}


package example_1;

public class B extends A {
int incr(int i) {
return i = i+2;
}
}



package example_1;

public class C extends B {
int incr(int i) {
return i=i+3;
}
}


package example_1;

public class Test {

public int add(int n,A o){
int res=0;
int i=0;
while (i<=n){
res=res+i;
i=o.incr(i);
}
return res;
}

public static void main(String[] args) {
int test = 1000;
Test testClass = new Test();
A a = new A();
int result1 = testClass.add(test,a);
a = new B();
int result2 = testClass.add(test,a);
a = new C();
int result3 = testClass.add(test,a);
// System.out.println("Result: "+result1 + result2 + result3);
}
}


(1) JBCToGraph (SOUND transformation)

Constructed TerminationGraph.

(2) Obligation:

Termination Graph based on JBC Program:
example_1.Test.main([Ljava/lang/String;)V: Graph of 177 nodes with 3 SCCs.


(3) TerminationGraphToSCCProof (SOUND transformation)

Splitted TerminationGraph to 3 SCCss.

(4) Complex Obligation (AND)

(5) Obligation:

SCC of termination graph based on JBC Program.
SCC contains nodes from the following methods: example_1.Test.main([Ljava/lang/String;)V
SCC calls the following helper methods:
Performed SCC analyses: UsedFieldsAnalysis

(6) SCCToIDPv1Proof (SOUND transformation)

Transformed FIGraph SCCs to IDPs. Log:

Generated 20 rules for P and 0 rules for R.


P rules:
1041_0_add_Load(EOS(STATIC_1041), matching1, matching2, i111, i111) → 1045_0_add_GT(EOS(STATIC_1045), 1000, 1000, i111, i111, 1000) | &&(=(matching1, 1000), =(matching2, 1000))
1045_0_add_GT(EOS(STATIC_1045), matching1, matching2, i117, i117, matching3) → 1046_0_add_GT(EOS(STATIC_1046), 1000, 1000, i117, i117, 1000) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
1046_0_add_GT(EOS(STATIC_1046), matching1, matching2, i117, i117, matching3) → 1049_0_add_Load(EOS(STATIC_1049), 1000, 1000, i117) | &&(&&(&&(<=(i117, 1000), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000))
1049_0_add_Load(EOS(STATIC_1049), matching1, matching2, i117) → 1053_0_add_Load(EOS(STATIC_1053), 1000, 1000, i117) | &&(=(matching1, 1000), =(matching2, 1000))
1053_0_add_Load(EOS(STATIC_1053), matching1, matching2, i117) → 1057_0_add_IntArithmetic(EOS(STATIC_1057), 1000, 1000, i117, i117) | &&(=(matching1, 1000), =(matching2, 1000))
1057_0_add_IntArithmetic(EOS(STATIC_1057), matching1, matching2, i117, i117) → 1061_0_add_Store(EOS(STATIC_1061), 1000, 1000, i117) | &&(&&(>=(i117, 0), =(matching1, 1000)), =(matching2, 1000))
1061_0_add_Store(EOS(STATIC_1061), matching1, matching2, i117) → 1064_0_add_Load(EOS(STATIC_1064), 1000, 1000, i117) | &&(=(matching1, 1000), =(matching2, 1000))
1064_0_add_Load(EOS(STATIC_1064), matching1, matching2, i117) → 1068_0_add_Load(EOS(STATIC_1068), 1000, 1000, i117) | &&(=(matching1, 1000), =(matching2, 1000))
1068_0_add_Load(EOS(STATIC_1068), matching1, matching2, i117) → 1070_0_add_InvokeMethod(EOS(STATIC_1070), 1000, 1000, i117) | &&(=(matching1, 1000), =(matching2, 1000))
1070_0_add_InvokeMethod(EOS(STATIC_1070), matching1, matching2, i117) → 1071_0_incr_Load(EOS(STATIC_1071), 1000, 1000, i117, i117) | &&(=(matching1, 1000), =(matching2, 1000))
1071_0_incr_Load(EOS(STATIC_1071), matching1, matching2, i117, i117) → 1073_0_incr_ConstantStackPush(EOS(STATIC_1073), 1000, 1000, i117, i117) | &&(=(matching1, 1000), =(matching2, 1000))
1073_0_incr_ConstantStackPush(EOS(STATIC_1073), matching1, matching2, i117, i117) → 1074_0_incr_IntArithmetic(EOS(STATIC_1074), 1000, 1000, i117, i117, 3) | &&(=(matching1, 1000), =(matching2, 1000))
1074_0_incr_IntArithmetic(EOS(STATIC_1074), matching1, matching2, i117, i117, matching3) → 1076_0_incr_Duplicate(EOS(STATIC_1076), 1000, 1000, i117, +(i117, 3)) | &&(&&(&&(>=(i117, 0), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 3))
1076_0_incr_Duplicate(EOS(STATIC_1076), matching1, matching2, i117, i124) → 1077_0_incr_Store(EOS(STATIC_1077), 1000, 1000, i117, i124, i124) | &&(=(matching1, 1000), =(matching2, 1000))
1077_0_incr_Store(EOS(STATIC_1077), matching1, matching2, i117, i124, i124) → 1079_0_incr_Return(EOS(STATIC_1079), 1000, 1000, i117, i124) | &&(=(matching1, 1000), =(matching2, 1000))
1079_0_incr_Return(EOS(STATIC_1079), matching1, matching2, i117, i124) → 1081_0_add_Store(EOS(STATIC_1081), 1000, 1000, i124) | &&(=(matching1, 1000), =(matching2, 1000))
1081_0_add_Store(EOS(STATIC_1081), matching1, matching2, i124) → 1083_0_add_JMP(EOS(STATIC_1083), 1000, 1000, i124) | &&(=(matching1, 1000), =(matching2, 1000))
1083_0_add_JMP(EOS(STATIC_1083), matching1, matching2, i124) → 1086_0_add_Load(EOS(STATIC_1086), 1000, 1000, i124) | &&(=(matching1, 1000), =(matching2, 1000))
1086_0_add_Load(EOS(STATIC_1086), matching1, matching2, i124) → 1038_0_add_Load(EOS(STATIC_1038), 1000, 1000, i124) | &&(=(matching1, 1000), =(matching2, 1000))
1038_0_add_Load(EOS(STATIC_1038), matching1, matching2, i111) → 1041_0_add_Load(EOS(STATIC_1041), 1000, 1000, i111, i111) | &&(=(matching1, 1000), =(matching2, 1000))
R rules:

Combined rules. Obtained 1 conditional rules for P and 0 conditional rules for R.


P rules:
1041_0_add_Load(EOS(STATIC_1041), 1000, 1000, x2, x2) → 1041_0_add_Load(EOS(STATIC_1041), 1000, 1000, +(x2, 3), +(x2, 3)) | &&(>(+(x2, 1), 0), <=(x2, 1000))
R rules:

Filtered ground terms:



1041_0_add_Load(x1, x2, x3, x4, x5) → 1041_0_add_Load(x4, x5)
EOS(x1) → EOS
Cond_1041_0_add_Load(x1, x2, x3, x4, x5, x6) → Cond_1041_0_add_Load(x1, x5, x6)

Filtered duplicate args:



1041_0_add_Load(x1, x2) → 1041_0_add_Load(x2)
Cond_1041_0_add_Load(x1, x2, x3) → Cond_1041_0_add_Load(x1, x3)

Combined rules. Obtained 1 conditional rules for P and 0 conditional rules for R.


P rules:
1041_0_add_Load(x2) → 1041_0_add_Load(+(x2, 3)) | &&(>(x2, -1), <=(x2, 1000))
R rules:

Finished conversion. Obtained 2 rules for P and 0 rules for R. System has predefined symbols.


P rules:
1041_0_ADD_LOAD(x2) → COND_1041_0_ADD_LOAD(&&(>(x2, -1), <=(x2, 1000)), x2)
COND_1041_0_ADD_LOAD(TRUE, x2) → 1041_0_ADD_LOAD(+(x2, 3))
R rules:

(7) 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:

Boolean, Integer


R is empty.

The integer pair graph contains the following rules and edges:
(0): 1041_0_ADD_LOAD(x2[0]) → COND_1041_0_ADD_LOAD(x2[0] > -1 && x2[0] <= 1000, x2[0])
(1): COND_1041_0_ADD_LOAD(TRUE, x2[1]) → 1041_0_ADD_LOAD(x2[1] + 3)

(0) -> (1), if (x2[0] > -1 && x2[0] <= 1000x2[0]* x2[1])


(1) -> (0), if (x2[1] + 3* x2[0])



The set Q is empty.

(8) 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.IdpCand1ShapeHeuristic@5b27a891 Constraint Generator: NonInfConstraintGenerator: PathGenerator: MetricPathGenerator: Max Left Steps: 0 Max Right Steps: 0

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 1041_0_ADD_LOAD(x2) → COND_1041_0_ADD_LOAD(&&(>(x2, -1), <=(x2, 1000)), x2) the following chains were created:
  • We consider the chain 1041_0_ADD_LOAD(x2[0]) → COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0]), COND_1041_0_ADD_LOAD(TRUE, x2[1]) → 1041_0_ADD_LOAD(+(x2[1], 3)) which results in the following constraint:

    (1)    (&&(>(x2[0], -1), <=(x2[0], 1000))=TRUEx2[0]=x2[1]1041_0_ADD_LOAD(x2[0])≥NonInfC∧1041_0_ADD_LOAD(x2[0])≥COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])∧(UIncreasing(COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])), ≥))



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

    (2)    (>(x2[0], -1)=TRUE<=(x2[0], 1000)=TRUE1041_0_ADD_LOAD(x2[0])≥NonInfC∧1041_0_ADD_LOAD(x2[0])≥COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])∧(UIncreasing(COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])), ≥))



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

    (3)    (x2[0] ≥ 0∧[1000] + [-1]x2[0] ≥ 0 ⇒ (UIncreasing(COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])), ≥)∧[bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x2[0] ≥ 0∧[2 + (-1)bso_11] ≥ 0)



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

    (4)    (x2[0] ≥ 0∧[1000] + [-1]x2[0] ≥ 0 ⇒ (UIncreasing(COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])), ≥)∧[bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x2[0] ≥ 0∧[2 + (-1)bso_11] ≥ 0)



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

    (5)    (x2[0] ≥ 0∧[1000] + [-1]x2[0] ≥ 0 ⇒ (UIncreasing(COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])), ≥)∧[bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x2[0] ≥ 0∧[2 + (-1)bso_11] ≥ 0)







For Pair COND_1041_0_ADD_LOAD(TRUE, x2) → 1041_0_ADD_LOAD(+(x2, 3)) the following chains were created:
  • We consider the chain COND_1041_0_ADD_LOAD(TRUE, x2[1]) → 1041_0_ADD_LOAD(+(x2[1], 3)) which results in the following constraint:

    (6)    (COND_1041_0_ADD_LOAD(TRUE, x2[1])≥NonInfC∧COND_1041_0_ADD_LOAD(TRUE, x2[1])≥1041_0_ADD_LOAD(+(x2[1], 3))∧(UIncreasing(1041_0_ADD_LOAD(+(x2[1], 3))), ≥))



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

    (7)    ((UIncreasing(1041_0_ADD_LOAD(+(x2[1], 3))), ≥)∧[bni_12] = 0∧[1 + (-1)bso_13] ≥ 0)



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

    (8)    ((UIncreasing(1041_0_ADD_LOAD(+(x2[1], 3))), ≥)∧[bni_12] = 0∧[1 + (-1)bso_13] ≥ 0)



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

    (9)    ((UIncreasing(1041_0_ADD_LOAD(+(x2[1], 3))), ≥)∧[bni_12] = 0∧[1 + (-1)bso_13] ≥ 0)



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

    (10)    ((UIncreasing(1041_0_ADD_LOAD(+(x2[1], 3))), ≥)∧[bni_12] = 0∧0 = 0∧[1 + (-1)bso_13] ≥ 0)







To summarize, we get the following constraints P for the following pairs.
  • 1041_0_ADD_LOAD(x2) → COND_1041_0_ADD_LOAD(&&(>(x2, -1), <=(x2, 1000)), x2)
    • (x2[0] ≥ 0∧[1000] + [-1]x2[0] ≥ 0 ⇒ (UIncreasing(COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])), ≥)∧[bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x2[0] ≥ 0∧[2 + (-1)bso_11] ≥ 0)

  • COND_1041_0_ADD_LOAD(TRUE, x2) → 1041_0_ADD_LOAD(+(x2, 3))
    • ((UIncreasing(1041_0_ADD_LOAD(+(x2[1], 3))), ≥)∧[bni_12] = 0∧0 = 0∧[1 + (-1)bso_13] ≥ 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(1041_0_ADD_LOAD(x1)) = [1] + [-1]x1   
POL(COND_1041_0_ADD_LOAD(x1, x2)) = [-1] + [-1]x2   
POL(&&(x1, x2)) = [-1]   
POL(>(x1, x2)) = [-1]   
POL(-1) = [-1]   
POL(<=(x1, x2)) = [-1]   
POL(1000) = [1000]   
POL(+(x1, x2)) = x1 + x2   
POL(3) = [3]   

The following pairs are in P>:

1041_0_ADD_LOAD(x2[0]) → COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])
COND_1041_0_ADD_LOAD(TRUE, x2[1]) → 1041_0_ADD_LOAD(+(x2[1], 3))

The following pairs are in Pbound:

1041_0_ADD_LOAD(x2[0]) → COND_1041_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])

The following pairs are in P:
none

There are no usable rules.

(9) 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:
(1): COND_1041_0_ADD_LOAD(TRUE, x2[1]) → 1041_0_ADD_LOAD(x2[1] + 3)


The set Q is empty.

(10) IDependencyGraphProof (EQUIVALENT transformation)

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

(11) TRUE

(12) Obligation:

SCC of termination graph based on JBC Program.
SCC contains nodes from the following methods: example_1.Test.main([Ljava/lang/String;)V
SCC calls the following helper methods:
Performed SCC analyses: UsedFieldsAnalysis

(13) SCCToIDPv1Proof (SOUND transformation)

Transformed FIGraph SCCs to IDPs. Log:

Generated 20 rules for P and 0 rules for R.


P rules:
740_0_add_Load(EOS(STATIC_740), matching1, matching2, matching3, i59, i59) → 743_0_add_GT(EOS(STATIC_743), 1000, 1000, 1000, i59, i59, 1000) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
743_0_add_GT(EOS(STATIC_743), matching1, matching2, matching3, i65, i65, matching4) → 745_0_add_GT(EOS(STATIC_745), 1000, 1000, 1000, i65, i65, 1000) | &&(&&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 1000))
745_0_add_GT(EOS(STATIC_745), matching1, matching2, matching3, i65, i65, matching4) → 749_0_add_Load(EOS(STATIC_749), 1000, 1000, 1000, i65) | &&(&&(&&(&&(<=(i65, 1000), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 1000))
749_0_add_Load(EOS(STATIC_749), matching1, matching2, matching3, i65) → 753_0_add_Load(EOS(STATIC_753), 1000, 1000, 1000, i65) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
753_0_add_Load(EOS(STATIC_753), matching1, matching2, matching3, i65) → 757_0_add_IntArithmetic(EOS(STATIC_757), 1000, 1000, 1000, i65, i65) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
757_0_add_IntArithmetic(EOS(STATIC_757), matching1, matching2, matching3, i65, i65) → 761_0_add_Store(EOS(STATIC_761), 1000, 1000, 1000, i65) | &&(&&(&&(>=(i65, 0), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000))
761_0_add_Store(EOS(STATIC_761), matching1, matching2, matching3, i65) → 765_0_add_Load(EOS(STATIC_765), 1000, 1000, 1000, i65) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
765_0_add_Load(EOS(STATIC_765), matching1, matching2, matching3, i65) → 769_0_add_Load(EOS(STATIC_769), 1000, 1000, 1000, i65) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
769_0_add_Load(EOS(STATIC_769), matching1, matching2, matching3, i65) → 773_0_add_InvokeMethod(EOS(STATIC_773), 1000, 1000, 1000, i65) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
773_0_add_InvokeMethod(EOS(STATIC_773), matching1, matching2, matching3, i65) → 776_0_incr_Load(EOS(STATIC_776), 1000, 1000, 1000, i65, i65) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
776_0_incr_Load(EOS(STATIC_776), matching1, matching2, matching3, i65, i65) → 780_0_incr_ConstantStackPush(EOS(STATIC_780), 1000, 1000, 1000, i65, i65) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
780_0_incr_ConstantStackPush(EOS(STATIC_780), matching1, matching2, matching3, i65, i65) → 784_0_incr_IntArithmetic(EOS(STATIC_784), 1000, 1000, 1000, i65, i65, 2) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
784_0_incr_IntArithmetic(EOS(STATIC_784), matching1, matching2, matching3, i65, i65, matching4) → 787_0_incr_Duplicate(EOS(STATIC_787), 1000, 1000, 1000, i65, +(i65, 2)) | &&(&&(&&(&&(>=(i65, 0), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 2))
787_0_incr_Duplicate(EOS(STATIC_787), matching1, matching2, matching3, i65, i70) → 788_0_incr_Store(EOS(STATIC_788), 1000, 1000, 1000, i65, i70, i70) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
788_0_incr_Store(EOS(STATIC_788), matching1, matching2, matching3, i65, i70, i70) → 792_0_incr_Return(EOS(STATIC_792), 1000, 1000, 1000, i65, i70) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
792_0_incr_Return(EOS(STATIC_792), matching1, matching2, matching3, i65, i70) → 795_0_add_Store(EOS(STATIC_795), 1000, 1000, 1000, i70) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
795_0_add_Store(EOS(STATIC_795), matching1, matching2, matching3, i70) → 797_0_add_JMP(EOS(STATIC_797), 1000, 1000, 1000, i70) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
797_0_add_JMP(EOS(STATIC_797), matching1, matching2, matching3, i70) → 802_0_add_Load(EOS(STATIC_802), 1000, 1000, 1000, i70) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
802_0_add_Load(EOS(STATIC_802), matching1, matching2, matching3, i70) → 736_0_add_Load(EOS(STATIC_736), 1000, 1000, 1000, i70) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
736_0_add_Load(EOS(STATIC_736), matching1, matching2, matching3, i59) → 740_0_add_Load(EOS(STATIC_740), 1000, 1000, 1000, i59, i59) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
R rules:

Combined rules. Obtained 1 conditional rules for P and 0 conditional rules for R.


P rules:
740_0_add_Load(EOS(STATIC_740), 1000, 1000, 1000, x3, x3) → 740_0_add_Load(EOS(STATIC_740), 1000, 1000, 1000, +(x3, 2), +(x3, 2)) | &&(>(+(x3, 1), 0), <=(x3, 1000))
R rules:

Filtered ground terms:



740_0_add_Load(x1, x2, x3, x4, x5, x6) → 740_0_add_Load(x5, x6)
EOS(x1) → EOS
Cond_740_0_add_Load(x1, x2, x3, x4, x5, x6, x7) → Cond_740_0_add_Load(x1, x6, x7)

Filtered duplicate args:



740_0_add_Load(x1, x2) → 740_0_add_Load(x2)
Cond_740_0_add_Load(x1, x2, x3) → Cond_740_0_add_Load(x1, x3)

Combined rules. Obtained 1 conditional rules for P and 0 conditional rules for R.


P rules:
740_0_add_Load(x3) → 740_0_add_Load(+(x3, 2)) | &&(>(x3, -1), <=(x3, 1000))
R rules:

Finished conversion. Obtained 2 rules for P and 0 rules for R. System has predefined symbols.


P rules:
740_0_ADD_LOAD(x3) → COND_740_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3)
COND_740_0_ADD_LOAD(TRUE, x3) → 740_0_ADD_LOAD(+(x3, 2))
R 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:

Boolean, Integer


R is empty.

The integer pair graph contains the following rules and edges:
(0): 740_0_ADD_LOAD(x3[0]) → COND_740_0_ADD_LOAD(x3[0] > -1 && x3[0] <= 1000, x3[0])
(1): COND_740_0_ADD_LOAD(TRUE, x3[1]) → 740_0_ADD_LOAD(x3[1] + 2)

(0) -> (1), if (x3[0] > -1 && x3[0] <= 1000x3[0]* x3[1])


(1) -> (0), if (x3[1] + 2* x3[0])



The set Q is empty.

(15) 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.IdpCand1ShapeHeuristic@5b27a891 Constraint Generator: NonInfConstraintGenerator: PathGenerator: MetricPathGenerator: Max Left Steps: 0 Max Right Steps: 0

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 740_0_ADD_LOAD(x3) → COND_740_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3) the following chains were created:
  • We consider the chain 740_0_ADD_LOAD(x3[0]) → COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0]), COND_740_0_ADD_LOAD(TRUE, x3[1]) → 740_0_ADD_LOAD(+(x3[1], 2)) which results in the following constraint:

    (1)    (&&(>(x3[0], -1), <=(x3[0], 1000))=TRUEx3[0]=x3[1]740_0_ADD_LOAD(x3[0])≥NonInfC∧740_0_ADD_LOAD(x3[0])≥COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])∧(UIncreasing(COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥))



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

    (2)    (>(x3[0], -1)=TRUE<=(x3[0], 1000)=TRUE740_0_ADD_LOAD(x3[0])≥NonInfC∧740_0_ADD_LOAD(x3[0])≥COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])∧(UIncreasing(COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥))



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

    (3)    (x3[0] ≥ 0∧[1000] + [-1]x3[0] ≥ 0 ⇒ (UIncreasing(COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥)∧[(-1)bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x3[0] ≥ 0∧[(-1)bso_11] ≥ 0)



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

    (4)    (x3[0] ≥ 0∧[1000] + [-1]x3[0] ≥ 0 ⇒ (UIncreasing(COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥)∧[(-1)bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x3[0] ≥ 0∧[(-1)bso_11] ≥ 0)



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

    (5)    (x3[0] ≥ 0∧[1000] + [-1]x3[0] ≥ 0 ⇒ (UIncreasing(COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥)∧[(-1)bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x3[0] ≥ 0∧[(-1)bso_11] ≥ 0)







For Pair COND_740_0_ADD_LOAD(TRUE, x3) → 740_0_ADD_LOAD(+(x3, 2)) the following chains were created:
  • We consider the chain COND_740_0_ADD_LOAD(TRUE, x3[1]) → 740_0_ADD_LOAD(+(x3[1], 2)) which results in the following constraint:

    (6)    (COND_740_0_ADD_LOAD(TRUE, x3[1])≥NonInfC∧COND_740_0_ADD_LOAD(TRUE, x3[1])≥740_0_ADD_LOAD(+(x3[1], 2))∧(UIncreasing(740_0_ADD_LOAD(+(x3[1], 2))), ≥))



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

    (7)    ((UIncreasing(740_0_ADD_LOAD(+(x3[1], 2))), ≥)∧[bni_12] = 0∧[2 + (-1)bso_13] ≥ 0)



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

    (8)    ((UIncreasing(740_0_ADD_LOAD(+(x3[1], 2))), ≥)∧[bni_12] = 0∧[2 + (-1)bso_13] ≥ 0)



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

    (9)    ((UIncreasing(740_0_ADD_LOAD(+(x3[1], 2))), ≥)∧[bni_12] = 0∧[2 + (-1)bso_13] ≥ 0)



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

    (10)    ((UIncreasing(740_0_ADD_LOAD(+(x3[1], 2))), ≥)∧[bni_12] = 0∧0 = 0∧[2 + (-1)bso_13] ≥ 0)







To summarize, we get the following constraints P for the following pairs.
  • 740_0_ADD_LOAD(x3) → COND_740_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3)
    • (x3[0] ≥ 0∧[1000] + [-1]x3[0] ≥ 0 ⇒ (UIncreasing(COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥)∧[(-1)bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x3[0] ≥ 0∧[(-1)bso_11] ≥ 0)

  • COND_740_0_ADD_LOAD(TRUE, x3) → 740_0_ADD_LOAD(+(x3, 2))
    • ((UIncreasing(740_0_ADD_LOAD(+(x3[1], 2))), ≥)∧[bni_12] = 0∧0 = 0∧[2 + (-1)bso_13] ≥ 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(740_0_ADD_LOAD(x1)) = [-1] + [-1]x1   
POL(COND_740_0_ADD_LOAD(x1, x2)) = [-1] + [-1]x2   
POL(&&(x1, x2)) = [-1]   
POL(>(x1, x2)) = [-1]   
POL(-1) = [-1]   
POL(<=(x1, x2)) = [-1]   
POL(1000) = [1000]   
POL(+(x1, x2)) = x1 + x2   
POL(2) = [2]   

The following pairs are in P>:

COND_740_0_ADD_LOAD(TRUE, x3[1]) → 740_0_ADD_LOAD(+(x3[1], 2))

The following pairs are in Pbound:

740_0_ADD_LOAD(x3[0]) → COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])

The following pairs are in P:

740_0_ADD_LOAD(x3[0]) → COND_740_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])

There are no usable rules.

(16) Complex Obligation (AND)

(17) 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:

Boolean, Integer


R is empty.

The integer pair graph contains the following rules and edges:
(0): 740_0_ADD_LOAD(x3[0]) → COND_740_0_ADD_LOAD(x3[0] > -1 && x3[0] <= 1000, x3[0])


The set Q is empty.

(18) IDependencyGraphProof (EQUIVALENT transformation)

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

(19) TRUE

(20) 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:
(1): COND_740_0_ADD_LOAD(TRUE, x3[1]) → 740_0_ADD_LOAD(x3[1] + 2)


The set Q is empty.

(21) IDependencyGraphProof (EQUIVALENT transformation)

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

(22) TRUE

(23) Obligation:

SCC of termination graph based on JBC Program.
SCC contains nodes from the following methods: example_1.Test.main([Ljava/lang/String;)V
SCC calls the following helper methods:
Performed SCC analyses: UsedFieldsAnalysis

(24) SCCToIDPv1Proof (SOUND transformation)

Transformed FIGraph SCCs to IDPs. Log:

Generated 20 rules for P and 0 rules for R.


P rules:
330_0_add_Load(EOS(STATIC_330), matching1, matching2, matching3, i18, i18) → 337_0_add_GT(EOS(STATIC_337), 1000, 1000, 1000, i18, i18, 1000) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
337_0_add_GT(EOS(STATIC_337), matching1, matching2, matching3, i22, i22, matching4) → 341_0_add_GT(EOS(STATIC_341), 1000, 1000, 1000, i22, i22, 1000) | &&(&&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 1000))
341_0_add_GT(EOS(STATIC_341), matching1, matching2, matching3, i22, i22, matching4) → 344_0_add_Load(EOS(STATIC_344), 1000, 1000, 1000, i22) | &&(&&(&&(&&(<=(i22, 1000), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 1000))
344_0_add_Load(EOS(STATIC_344), matching1, matching2, matching3, i22) → 350_0_add_Load(EOS(STATIC_350), 1000, 1000, 1000, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
350_0_add_Load(EOS(STATIC_350), matching1, matching2, matching3, i22) → 355_0_add_IntArithmetic(EOS(STATIC_355), 1000, 1000, 1000, i22, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
355_0_add_IntArithmetic(EOS(STATIC_355), matching1, matching2, matching3, i22, i22) → 360_0_add_Store(EOS(STATIC_360), 1000, 1000, 1000, i22) | &&(&&(&&(>=(i22, 0), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000))
360_0_add_Store(EOS(STATIC_360), matching1, matching2, matching3, i22) → 365_0_add_Load(EOS(STATIC_365), 1000, 1000, 1000, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
365_0_add_Load(EOS(STATIC_365), matching1, matching2, matching3, i22) → 370_0_add_Load(EOS(STATIC_370), 1000, 1000, 1000, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
370_0_add_Load(EOS(STATIC_370), matching1, matching2, matching3, i22) → 375_0_add_InvokeMethod(EOS(STATIC_375), 1000, 1000, 1000, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
375_0_add_InvokeMethod(EOS(STATIC_375), matching1, matching2, matching3, i22) → 381_0_incr_Load(EOS(STATIC_381), 1000, 1000, 1000, i22, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
381_0_incr_Load(EOS(STATIC_381), matching1, matching2, matching3, i22, i22) → 386_0_incr_ConstantStackPush(EOS(STATIC_386), 1000, 1000, 1000, i22, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
386_0_incr_ConstantStackPush(EOS(STATIC_386), matching1, matching2, matching3, i22, i22) → 391_0_incr_IntArithmetic(EOS(STATIC_391), 1000, 1000, 1000, i22, i22, 1) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
391_0_incr_IntArithmetic(EOS(STATIC_391), matching1, matching2, matching3, i22, i22, matching4) → 396_0_incr_Duplicate(EOS(STATIC_396), 1000, 1000, 1000, i22, +(i22, 1)) | &&(&&(&&(&&(>=(i22, 0), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 1))
396_0_incr_Duplicate(EOS(STATIC_396), matching1, matching2, matching3, i22, i24) → 399_0_incr_Store(EOS(STATIC_399), 1000, 1000, 1000, i22, i24, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
399_0_incr_Store(EOS(STATIC_399), matching1, matching2, matching3, i22, i24, i24) → 405_0_incr_Return(EOS(STATIC_405), 1000, 1000, 1000, i22, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
405_0_incr_Return(EOS(STATIC_405), matching1, matching2, matching3, i22, i24) → 411_0_add_Store(EOS(STATIC_411), 1000, 1000, 1000, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
411_0_add_Store(EOS(STATIC_411), matching1, matching2, matching3, i24) → 415_0_add_JMP(EOS(STATIC_415), 1000, 1000, 1000, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
415_0_add_JMP(EOS(STATIC_415), matching1, matching2, matching3, i24) → 422_0_add_Load(EOS(STATIC_422), 1000, 1000, 1000, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
422_0_add_Load(EOS(STATIC_422), matching1, matching2, matching3, i24) → 326_0_add_Load(EOS(STATIC_326), 1000, 1000, 1000, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
326_0_add_Load(EOS(STATIC_326), matching1, matching2, matching3, i18) → 330_0_add_Load(EOS(STATIC_330), 1000, 1000, 1000, i18, i18) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
R rules:

Combined rules. Obtained 1 conditional rules for P and 0 conditional rules for R.


P rules:
330_0_add_Load(EOS(STATIC_330), 1000, 1000, 1000, x3, x3) → 330_0_add_Load(EOS(STATIC_330), 1000, 1000, 1000, +(x3, 1), +(x3, 1)) | &&(>(+(x3, 1), 0), <=(x3, 1000))
R rules:

Filtered ground terms:



330_0_add_Load(x1, x2, x3, x4, x5, x6) → 330_0_add_Load(x5, x6)
EOS(x1) → EOS
Cond_330_0_add_Load(x1, x2, x3, x4, x5, x6, x7) → Cond_330_0_add_Load(x1, x6, x7)

Filtered duplicate args:



330_0_add_Load(x1, x2) → 330_0_add_Load(x2)
Cond_330_0_add_Load(x1, x2, x3) → Cond_330_0_add_Load(x1, x3)

Combined rules. Obtained 1 conditional rules for P and 0 conditional rules for R.


P rules:
330_0_add_Load(x3) → 330_0_add_Load(+(x3, 1)) | &&(>(x3, -1), <=(x3, 1000))
R rules:

Finished conversion. Obtained 2 rules for P and 0 rules for R. System has predefined symbols.


P rules:
330_0_ADD_LOAD(x3) → COND_330_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3)
COND_330_0_ADD_LOAD(TRUE, x3) → 330_0_ADD_LOAD(+(x3, 1))
R rules:

(25) 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:

Boolean, Integer


R is empty.

The integer pair graph contains the following rules and edges:
(0): 330_0_ADD_LOAD(x3[0]) → COND_330_0_ADD_LOAD(x3[0] > -1 && x3[0] <= 1000, x3[0])
(1): COND_330_0_ADD_LOAD(TRUE, x3[1]) → 330_0_ADD_LOAD(x3[1] + 1)

(0) -> (1), if (x3[0] > -1 && x3[0] <= 1000x3[0]* x3[1])


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



The set Q is empty.

(26) 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.IdpCand1ShapeHeuristic@5b27a891 Constraint Generator: NonInfConstraintGenerator: PathGenerator: MetricPathGenerator: Max Left Steps: 0 Max Right Steps: 0

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 330_0_ADD_LOAD(x3) → COND_330_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3) the following chains were created:
  • We consider the chain 330_0_ADD_LOAD(x3[0]) → COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0]), COND_330_0_ADD_LOAD(TRUE, x3[1]) → 330_0_ADD_LOAD(+(x3[1], 1)) which results in the following constraint:

    (1)    (&&(>(x3[0], -1), <=(x3[0], 1000))=TRUEx3[0]=x3[1]330_0_ADD_LOAD(x3[0])≥NonInfC∧330_0_ADD_LOAD(x3[0])≥COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])∧(UIncreasing(COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥))



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

    (2)    (>(x3[0], -1)=TRUE<=(x3[0], 1000)=TRUE330_0_ADD_LOAD(x3[0])≥NonInfC∧330_0_ADD_LOAD(x3[0])≥COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])∧(UIncreasing(COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥))



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

    (3)    (x3[0] ≥ 0∧[1000] + [-1]x3[0] ≥ 0 ⇒ (UIncreasing(COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥)∧[(-1)bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x3[0] ≥ 0∧[(-1)bso_11] ≥ 0)



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

    (4)    (x3[0] ≥ 0∧[1000] + [-1]x3[0] ≥ 0 ⇒ (UIncreasing(COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥)∧[(-1)bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x3[0] ≥ 0∧[(-1)bso_11] ≥ 0)



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

    (5)    (x3[0] ≥ 0∧[1000] + [-1]x3[0] ≥ 0 ⇒ (UIncreasing(COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥)∧[(-1)bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x3[0] ≥ 0∧[(-1)bso_11] ≥ 0)







For Pair COND_330_0_ADD_LOAD(TRUE, x3) → 330_0_ADD_LOAD(+(x3, 1)) the following chains were created:
  • We consider the chain COND_330_0_ADD_LOAD(TRUE, x3[1]) → 330_0_ADD_LOAD(+(x3[1], 1)) which results in the following constraint:

    (6)    (COND_330_0_ADD_LOAD(TRUE, x3[1])≥NonInfC∧COND_330_0_ADD_LOAD(TRUE, x3[1])≥330_0_ADD_LOAD(+(x3[1], 1))∧(UIncreasing(330_0_ADD_LOAD(+(x3[1], 1))), ≥))



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

    (7)    ((UIncreasing(330_0_ADD_LOAD(+(x3[1], 1))), ≥)∧[bni_12] = 0∧[1 + (-1)bso_13] ≥ 0)



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

    (8)    ((UIncreasing(330_0_ADD_LOAD(+(x3[1], 1))), ≥)∧[bni_12] = 0∧[1 + (-1)bso_13] ≥ 0)



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

    (9)    ((UIncreasing(330_0_ADD_LOAD(+(x3[1], 1))), ≥)∧[bni_12] = 0∧[1 + (-1)bso_13] ≥ 0)



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

    (10)    ((UIncreasing(330_0_ADD_LOAD(+(x3[1], 1))), ≥)∧[bni_12] = 0∧0 = 0∧[1 + (-1)bso_13] ≥ 0)







To summarize, we get the following constraints P for the following pairs.
  • 330_0_ADD_LOAD(x3) → COND_330_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3)
    • (x3[0] ≥ 0∧[1000] + [-1]x3[0] ≥ 0 ⇒ (UIncreasing(COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])), ≥)∧[(-1)bni_10 + (-1)Bound*bni_10] + [(-1)bni_10]x3[0] ≥ 0∧[(-1)bso_11] ≥ 0)

  • COND_330_0_ADD_LOAD(TRUE, x3) → 330_0_ADD_LOAD(+(x3, 1))
    • ((UIncreasing(330_0_ADD_LOAD(+(x3[1], 1))), ≥)∧[bni_12] = 0∧0 = 0∧[1 + (-1)bso_13] ≥ 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(330_0_ADD_LOAD(x1)) = [-1] + [-1]x1   
POL(COND_330_0_ADD_LOAD(x1, x2)) = [-1] + [-1]x2   
POL(&&(x1, x2)) = [-1]   
POL(>(x1, x2)) = [-1]   
POL(-1) = [-1]   
POL(<=(x1, x2)) = [-1]   
POL(1000) = [1000]   
POL(+(x1, x2)) = x1 + x2   
POL(1) = [1]   

The following pairs are in P>:

COND_330_0_ADD_LOAD(TRUE, x3[1]) → 330_0_ADD_LOAD(+(x3[1], 1))

The following pairs are in Pbound:

330_0_ADD_LOAD(x3[0]) → COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])

The following pairs are in P:

330_0_ADD_LOAD(x3[0]) → COND_330_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])

There are no usable rules.

(27) Complex Obligation (AND)

(28) 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:

Boolean, Integer


R is empty.

The integer pair graph contains the following rules and edges:
(0): 330_0_ADD_LOAD(x3[0]) → COND_330_0_ADD_LOAD(x3[0] > -1 && x3[0] <= 1000, x3[0])


The set Q is empty.

(29) IDependencyGraphProof (EQUIVALENT transformation)

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

(30) TRUE

(31) 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:
(1): COND_330_0_ADD_LOAD(TRUE, x3[1]) → 330_0_ADD_LOAD(x3[1] + 1)


The set Q is empty.

(32) IDependencyGraphProof (EQUIVALENT transformation)

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

(33) TRUE