(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:
7022_0_add_Load(EOS(STATIC_7022), matching1, matching2, i344, i344) → 7023_0_add_GT(EOS(STATIC_7023), 1000, 1000, i344, i344, 1000) | &&(=(matching1, 1000), =(matching2, 1000))
7023_0_add_GT(EOS(STATIC_7023), matching1, matching2, i350, i350, matching3) → 7024_0_add_GT(EOS(STATIC_7024), 1000, 1000, i350, i350, 1000) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
7024_0_add_GT(EOS(STATIC_7024), matching1, matching2, i350, i350, matching3) → 7027_0_add_Load(EOS(STATIC_7027), 1000, 1000, i350) | &&(&&(&&(<=(i350, 1000), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000))
7027_0_add_Load(EOS(STATIC_7027), matching1, matching2, i350) → 7029_0_add_Load(EOS(STATIC_7029), 1000, 1000, i350) | &&(=(matching1, 1000), =(matching2, 1000))
7029_0_add_Load(EOS(STATIC_7029), matching1, matching2, i350) → 7031_0_add_IntArithmetic(EOS(STATIC_7031), 1000, 1000, i350, i350) | &&(=(matching1, 1000), =(matching2, 1000))
7031_0_add_IntArithmetic(EOS(STATIC_7031), matching1, matching2, i350, i350) → 7034_0_add_Store(EOS(STATIC_7034), 1000, 1000, i350) | &&(&&(>=(i350, 0), =(matching1, 1000)), =(matching2, 1000))
7034_0_add_Store(EOS(STATIC_7034), matching1, matching2, i350) → 7036_0_add_Load(EOS(STATIC_7036), 1000, 1000, i350) | &&(=(matching1, 1000), =(matching2, 1000))
7036_0_add_Load(EOS(STATIC_7036), matching1, matching2, i350) → 7038_0_add_Load(EOS(STATIC_7038), 1000, 1000, i350) | &&(=(matching1, 1000), =(matching2, 1000))
7038_0_add_Load(EOS(STATIC_7038), matching1, matching2, i350) → 7040_0_add_InvokeMethod(EOS(STATIC_7040), 1000, 1000, i350) | &&(=(matching1, 1000), =(matching2, 1000))
7040_0_add_InvokeMethod(EOS(STATIC_7040), matching1, matching2, i350) → 7041_0_incr_Load(EOS(STATIC_7041), 1000, 1000, i350, i350) | &&(=(matching1, 1000), =(matching2, 1000))
7041_0_incr_Load(EOS(STATIC_7041), matching1, matching2, i350, i350) → 7042_0_incr_ConstantStackPush(EOS(STATIC_7042), 1000, 1000, i350, i350) | &&(=(matching1, 1000), =(matching2, 1000))
7042_0_incr_ConstantStackPush(EOS(STATIC_7042), matching1, matching2, i350, i350) → 7043_0_incr_IntArithmetic(EOS(STATIC_7043), 1000, 1000, i350, i350, 3) | &&(=(matching1, 1000), =(matching2, 1000))
7043_0_incr_IntArithmetic(EOS(STATIC_7043), matching1, matching2, i350, i350, matching3) → 7044_0_incr_Duplicate(EOS(STATIC_7044), 1000, 1000, i350, +(i350, 3)) | &&(&&(&&(>=(i350, 0), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 3))
7044_0_incr_Duplicate(EOS(STATIC_7044), matching1, matching2, i350, i357) → 7045_0_incr_Store(EOS(STATIC_7045), 1000, 1000, i350, i357, i357) | &&(=(matching1, 1000), =(matching2, 1000))
7045_0_incr_Store(EOS(STATIC_7045), matching1, matching2, i350, i357, i357) → 7046_0_incr_Return(EOS(STATIC_7046), 1000, 1000, i350, i357) | &&(=(matching1, 1000), =(matching2, 1000))
7046_0_incr_Return(EOS(STATIC_7046), matching1, matching2, i350, i357) → 7048_0_add_Store(EOS(STATIC_7048), 1000, 1000, i357) | &&(=(matching1, 1000), =(matching2, 1000))
7048_0_add_Store(EOS(STATIC_7048), matching1, matching2, i357) → 7049_0_add_JMP(EOS(STATIC_7049), 1000, 1000, i357) | &&(=(matching1, 1000), =(matching2, 1000))
7049_0_add_JMP(EOS(STATIC_7049), matching1, matching2, i357) → 7051_0_add_Load(EOS(STATIC_7051), 1000, 1000, i357) | &&(=(matching1, 1000), =(matching2, 1000))
7051_0_add_Load(EOS(STATIC_7051), matching1, matching2, i357) → 7020_0_add_Load(EOS(STATIC_7020), 1000, 1000, i357) | &&(=(matching1, 1000), =(matching2, 1000))
7020_0_add_Load(EOS(STATIC_7020), matching1, matching2, i344) → 7022_0_add_Load(EOS(STATIC_7022), 1000, 1000, i344, i344) | &&(=(matching1, 1000), =(matching2, 1000))
R rules:

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


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

Filtered ground terms:



7022_0_add_Load(x1, x2, x3, x4, x5) → 7022_0_add_Load(x4, x5)
EOS(x1) → EOS
Cond_7022_0_add_Load(x1, x2, x3, x4, x5, x6) → Cond_7022_0_add_Load(x1, x5, x6)

Filtered duplicate args:



7022_0_add_Load(x1, x2) → 7022_0_add_Load(x2)
Cond_7022_0_add_Load(x1, x2, x3) → Cond_7022_0_add_Load(x1, x3)

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


P rules:
7022_0_add_Load(x2) → 7022_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:
7022_0_ADD_LOAD(x2) → COND_7022_0_ADD_LOAD(&&(>(x2, -1), <=(x2, 1000)), x2)
COND_7022_0_ADD_LOAD(TRUE, x2) → 7022_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): 7022_0_ADD_LOAD(x2[0]) → COND_7022_0_ADD_LOAD(x2[0] > -1 && x2[0] <= 1000, x2[0])
(1): COND_7022_0_ADD_LOAD(TRUE, x2[1]) → 7022_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@2db8b241 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 7022_0_ADD_LOAD(x2) → COND_7022_0_ADD_LOAD(&&(>(x2, -1), <=(x2, 1000)), x2) the following chains were created:
  • We consider the chain 7022_0_ADD_LOAD(x2[0]) → COND_7022_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0]), COND_7022_0_ADD_LOAD(TRUE, x2[1]) → 7022_0_ADD_LOAD(+(x2[1], 3)) which results in the following constraint:

    (1)    (&&(>(x2[0], -1), <=(x2[0], 1000))=TRUEx2[0]=x2[1]7022_0_ADD_LOAD(x2[0])≥NonInfC∧7022_0_ADD_LOAD(x2[0])≥COND_7022_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])∧(UIncreasing(COND_7022_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)=TRUE7022_0_ADD_LOAD(x2[0])≥NonInfC∧7022_0_ADD_LOAD(x2[0])≥COND_7022_0_ADD_LOAD(&&(>(x2[0], -1), <=(x2[0], 1000)), x2[0])∧(UIncreasing(COND_7022_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_7022_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_7022_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_7022_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_7022_0_ADD_LOAD(TRUE, x2) → 7022_0_ADD_LOAD(+(x2, 3)) the following chains were created:
  • We consider the chain COND_7022_0_ADD_LOAD(TRUE, x2[1]) → 7022_0_ADD_LOAD(+(x2[1], 3)) which results in the following constraint:

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



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

    (7)    ((UIncreasing(7022_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(7022_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(7022_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(7022_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.
  • 7022_0_ADD_LOAD(x2) → COND_7022_0_ADD_LOAD(&&(>(x2, -1), <=(x2, 1000)), x2)
    • (x2[0] ≥ 0∧[1000] + [-1]x2[0] ≥ 0 ⇒ (UIncreasing(COND_7022_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_7022_0_ADD_LOAD(TRUE, x2) → 7022_0_ADD_LOAD(+(x2, 3))
    • ((UIncreasing(7022_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(7022_0_ADD_LOAD(x1)) = [1] + [-1]x1   
POL(COND_7022_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>:

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

The following pairs are in Pbound:

7022_0_ADD_LOAD(x2[0]) → COND_7022_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_7022_0_ADD_LOAD(TRUE, x2[1]) → 7022_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:
4692_0_add_Load(EOS(STATIC_4692), matching1, matching2, matching3, i115, i115) → 4694_0_add_GT(EOS(STATIC_4694), 1000, 1000, 1000, i115, i115, 1000) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4694_0_add_GT(EOS(STATIC_4694), matching1, matching2, matching3, i121, i121, matching4) → 4695_0_add_GT(EOS(STATIC_4695), 1000, 1000, 1000, i121, i121, 1000) | &&(&&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 1000))
4695_0_add_GT(EOS(STATIC_4695), matching1, matching2, matching3, i121, i121, matching4) → 4697_0_add_Load(EOS(STATIC_4697), 1000, 1000, 1000, i121) | &&(&&(&&(&&(<=(i121, 1000), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 1000))
4697_0_add_Load(EOS(STATIC_4697), matching1, matching2, matching3, i121) → 4700_0_add_Load(EOS(STATIC_4700), 1000, 1000, 1000, i121) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4700_0_add_Load(EOS(STATIC_4700), matching1, matching2, matching3, i121) → 4703_0_add_IntArithmetic(EOS(STATIC_4703), 1000, 1000, 1000, i121, i121) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4703_0_add_IntArithmetic(EOS(STATIC_4703), matching1, matching2, matching3, i121, i121) → 4705_0_add_Store(EOS(STATIC_4705), 1000, 1000, 1000, i121) | &&(&&(&&(>=(i121, 0), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000))
4705_0_add_Store(EOS(STATIC_4705), matching1, matching2, matching3, i121) → 4708_0_add_Load(EOS(STATIC_4708), 1000, 1000, 1000, i121) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4708_0_add_Load(EOS(STATIC_4708), matching1, matching2, matching3, i121) → 4710_0_add_Load(EOS(STATIC_4710), 1000, 1000, 1000, i121) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4710_0_add_Load(EOS(STATIC_4710), matching1, matching2, matching3, i121) → 4712_0_add_InvokeMethod(EOS(STATIC_4712), 1000, 1000, 1000, i121) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4712_0_add_InvokeMethod(EOS(STATIC_4712), matching1, matching2, matching3, i121) → 4715_0_incr_Load(EOS(STATIC_4715), 1000, 1000, 1000, i121, i121) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4715_0_incr_Load(EOS(STATIC_4715), matching1, matching2, matching3, i121, i121) → 4717_0_incr_ConstantStackPush(EOS(STATIC_4717), 1000, 1000, 1000, i121, i121) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4717_0_incr_ConstantStackPush(EOS(STATIC_4717), matching1, matching2, matching3, i121, i121) → 4720_0_incr_IntArithmetic(EOS(STATIC_4720), 1000, 1000, 1000, i121, i121, 2) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4720_0_incr_IntArithmetic(EOS(STATIC_4720), matching1, matching2, matching3, i121, i121, matching4) → 4722_0_incr_Duplicate(EOS(STATIC_4722), 1000, 1000, 1000, i121, +(i121, 2)) | &&(&&(&&(&&(>=(i121, 0), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 2))
4722_0_incr_Duplicate(EOS(STATIC_4722), matching1, matching2, matching3, i121, i126) → 4723_0_incr_Store(EOS(STATIC_4723), 1000, 1000, 1000, i121, i126, i126) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4723_0_incr_Store(EOS(STATIC_4723), matching1, matching2, matching3, i121, i126, i126) → 4726_0_incr_Return(EOS(STATIC_4726), 1000, 1000, 1000, i121, i126) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4726_0_incr_Return(EOS(STATIC_4726), matching1, matching2, matching3, i121, i126) → 4728_0_add_Store(EOS(STATIC_4728), 1000, 1000, 1000, i126) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4728_0_add_Store(EOS(STATIC_4728), matching1, matching2, matching3, i126) → 4730_0_add_JMP(EOS(STATIC_4730), 1000, 1000, 1000, i126) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4730_0_add_JMP(EOS(STATIC_4730), matching1, matching2, matching3, i126) → 4734_0_add_Load(EOS(STATIC_4734), 1000, 1000, 1000, i126) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4734_0_add_Load(EOS(STATIC_4734), matching1, matching2, matching3, i126) → 4691_0_add_Load(EOS(STATIC_4691), 1000, 1000, 1000, i126) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
4691_0_add_Load(EOS(STATIC_4691), matching1, matching2, matching3, i115) → 4692_0_add_Load(EOS(STATIC_4692), 1000, 1000, 1000, i115, i115) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
R rules:

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


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

Filtered ground terms:



4692_0_add_Load(x1, x2, x3, x4, x5, x6) → 4692_0_add_Load(x5, x6)
EOS(x1) → EOS
Cond_4692_0_add_Load(x1, x2, x3, x4, x5, x6, x7) → Cond_4692_0_add_Load(x1, x6, x7)

Filtered duplicate args:



4692_0_add_Load(x1, x2) → 4692_0_add_Load(x2)
Cond_4692_0_add_Load(x1, x2, x3) → Cond_4692_0_add_Load(x1, x3)

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


P rules:
4692_0_add_Load(x3) → 4692_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:
4692_0_ADD_LOAD(x3) → COND_4692_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3)
COND_4692_0_ADD_LOAD(TRUE, x3) → 4692_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): 4692_0_ADD_LOAD(x3[0]) → COND_4692_0_ADD_LOAD(x3[0] > -1 && x3[0] <= 1000, x3[0])
(1): COND_4692_0_ADD_LOAD(TRUE, x3[1]) → 4692_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@2db8b241 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 4692_0_ADD_LOAD(x3) → COND_4692_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3) the following chains were created:
  • We consider the chain 4692_0_ADD_LOAD(x3[0]) → COND_4692_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0]), COND_4692_0_ADD_LOAD(TRUE, x3[1]) → 4692_0_ADD_LOAD(+(x3[1], 2)) which results in the following constraint:

    (1)    (&&(>(x3[0], -1), <=(x3[0], 1000))=TRUEx3[0]=x3[1]4692_0_ADD_LOAD(x3[0])≥NonInfC∧4692_0_ADD_LOAD(x3[0])≥COND_4692_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])∧(UIncreasing(COND_4692_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)=TRUE4692_0_ADD_LOAD(x3[0])≥NonInfC∧4692_0_ADD_LOAD(x3[0])≥COND_4692_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])∧(UIncreasing(COND_4692_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_4692_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_4692_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_4692_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_4692_0_ADD_LOAD(TRUE, x3) → 4692_0_ADD_LOAD(+(x3, 2)) the following chains were created:
  • We consider the chain COND_4692_0_ADD_LOAD(TRUE, x3[1]) → 4692_0_ADD_LOAD(+(x3[1], 2)) which results in the following constraint:

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



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

    (7)    ((UIncreasing(4692_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(4692_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(4692_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(4692_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.
  • 4692_0_ADD_LOAD(x3) → COND_4692_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3)
    • (x3[0] ≥ 0∧[1000] + [-1]x3[0] ≥ 0 ⇒ (UIncreasing(COND_4692_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_4692_0_ADD_LOAD(TRUE, x3) → 4692_0_ADD_LOAD(+(x3, 2))
    • ((UIncreasing(4692_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(4692_0_ADD_LOAD(x1)) = [-1] + [-1]x1   
POL(COND_4692_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_4692_0_ADD_LOAD(TRUE, x3[1]) → 4692_0_ADD_LOAD(+(x3[1], 2))

The following pairs are in Pbound:

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

The following pairs are in P:

4692_0_ADD_LOAD(x3[0]) → COND_4692_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): 4692_0_ADD_LOAD(x3[0]) → COND_4692_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_4692_0_ADD_LOAD(TRUE, x3[1]) → 4692_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:
334_0_add_Load(EOS(STATIC_334), matching1, matching2, matching3, i18, i18) → 340_0_add_GT(EOS(STATIC_340), 1000, 1000, 1000, i18, i18, 1000) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
340_0_add_GT(EOS(STATIC_340), matching1, matching2, matching3, i22, i22, matching4) → 342_0_add_GT(EOS(STATIC_342), 1000, 1000, 1000, i22, i22, 1000) | &&(&&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 1000))
342_0_add_GT(EOS(STATIC_342), matching1, matching2, matching3, i22, i22, matching4) → 346_0_add_Load(EOS(STATIC_346), 1000, 1000, 1000, i22) | &&(&&(&&(&&(<=(i22, 1000), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 1000))
346_0_add_Load(EOS(STATIC_346), 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) → 354_0_add_IntArithmetic(EOS(STATIC_354), 1000, 1000, 1000, i22, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
354_0_add_IntArithmetic(EOS(STATIC_354), matching1, matching2, matching3, i22, i22) → 358_0_add_Store(EOS(STATIC_358), 1000, 1000, 1000, i22) | &&(&&(&&(>=(i22, 0), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000))
358_0_add_Store(EOS(STATIC_358), matching1, matching2, matching3, i22) → 363_0_add_Load(EOS(STATIC_363), 1000, 1000, 1000, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
363_0_add_Load(EOS(STATIC_363), matching1, matching2, matching3, i22) → 367_0_add_Load(EOS(STATIC_367), 1000, 1000, 1000, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
367_0_add_Load(EOS(STATIC_367), matching1, matching2, matching3, i22) → 372_0_add_InvokeMethod(EOS(STATIC_372), 1000, 1000, 1000, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
372_0_add_InvokeMethod(EOS(STATIC_372), matching1, matching2, matching3, i22) → 376_0_incr_Load(EOS(STATIC_376), 1000, 1000, 1000, i22, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
376_0_incr_Load(EOS(STATIC_376), matching1, matching2, matching3, i22, i22) → 381_0_incr_ConstantStackPush(EOS(STATIC_381), 1000, 1000, 1000, i22, i22) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
381_0_incr_ConstantStackPush(EOS(STATIC_381), matching1, matching2, matching3, i22, i22) → 385_0_incr_IntArithmetic(EOS(STATIC_385), 1000, 1000, 1000, i22, i22, 1) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
385_0_incr_IntArithmetic(EOS(STATIC_385), matching1, matching2, matching3, i22, i22, matching4) → 389_0_incr_Duplicate(EOS(STATIC_389), 1000, 1000, 1000, i22, +(i22, 1)) | &&(&&(&&(&&(>=(i22, 0), =(matching1, 1000)), =(matching2, 1000)), =(matching3, 1000)), =(matching4, 1))
389_0_incr_Duplicate(EOS(STATIC_389), matching1, matching2, matching3, i22, i24) → 391_0_incr_Store(EOS(STATIC_391), 1000, 1000, 1000, i22, i24, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
391_0_incr_Store(EOS(STATIC_391), matching1, matching2, matching3, i22, i24, i24) → 396_0_incr_Return(EOS(STATIC_396), 1000, 1000, 1000, i22, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
396_0_incr_Return(EOS(STATIC_396), matching1, matching2, matching3, i22, i24) → 401_0_add_Store(EOS(STATIC_401), 1000, 1000, 1000, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
401_0_add_Store(EOS(STATIC_401), matching1, matching2, matching3, i24) → 406_0_add_JMP(EOS(STATIC_406), 1000, 1000, 1000, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
406_0_add_JMP(EOS(STATIC_406), matching1, matching2, matching3, i24) → 425_0_add_Load(EOS(STATIC_425), 1000, 1000, 1000, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
425_0_add_Load(EOS(STATIC_425), matching1, matching2, matching3, i24) → 331_0_add_Load(EOS(STATIC_331), 1000, 1000, 1000, i24) | &&(&&(=(matching1, 1000), =(matching2, 1000)), =(matching3, 1000))
331_0_add_Load(EOS(STATIC_331), matching1, matching2, matching3, i18) → 334_0_add_Load(EOS(STATIC_334), 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:
334_0_add_Load(EOS(STATIC_334), 1000, 1000, 1000, x3, x3) → 334_0_add_Load(EOS(STATIC_334), 1000, 1000, 1000, +(x3, 1), +(x3, 1)) | &&(>(+(x3, 1), 0), <=(x3, 1000))
R rules:

Filtered ground terms:



334_0_add_Load(x1, x2, x3, x4, x5, x6) → 334_0_add_Load(x5, x6)
EOS(x1) → EOS
Cond_334_0_add_Load(x1, x2, x3, x4, x5, x6, x7) → Cond_334_0_add_Load(x1, x6, x7)

Filtered duplicate args:



334_0_add_Load(x1, x2) → 334_0_add_Load(x2)
Cond_334_0_add_Load(x1, x2, x3) → Cond_334_0_add_Load(x1, x3)

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


P rules:
334_0_add_Load(x3) → 334_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:
334_0_ADD_LOAD(x3) → COND_334_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3)
COND_334_0_ADD_LOAD(TRUE, x3) → 334_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): 334_0_ADD_LOAD(x3[0]) → COND_334_0_ADD_LOAD(x3[0] > -1 && x3[0] <= 1000, x3[0])
(1): COND_334_0_ADD_LOAD(TRUE, x3[1]) → 334_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@2db8b241 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 334_0_ADD_LOAD(x3) → COND_334_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3) the following chains were created:
  • We consider the chain 334_0_ADD_LOAD(x3[0]) → COND_334_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0]), COND_334_0_ADD_LOAD(TRUE, x3[1]) → 334_0_ADD_LOAD(+(x3[1], 1)) which results in the following constraint:

    (1)    (&&(>(x3[0], -1), <=(x3[0], 1000))=TRUEx3[0]=x3[1]334_0_ADD_LOAD(x3[0])≥NonInfC∧334_0_ADD_LOAD(x3[0])≥COND_334_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])∧(UIncreasing(COND_334_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)=TRUE334_0_ADD_LOAD(x3[0])≥NonInfC∧334_0_ADD_LOAD(x3[0])≥COND_334_0_ADD_LOAD(&&(>(x3[0], -1), <=(x3[0], 1000)), x3[0])∧(UIncreasing(COND_334_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_334_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_334_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_334_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_334_0_ADD_LOAD(TRUE, x3) → 334_0_ADD_LOAD(+(x3, 1)) the following chains were created:
  • We consider the chain COND_334_0_ADD_LOAD(TRUE, x3[1]) → 334_0_ADD_LOAD(+(x3[1], 1)) which results in the following constraint:

    (6)    (COND_334_0_ADD_LOAD(TRUE, x3[1])≥NonInfC∧COND_334_0_ADD_LOAD(TRUE, x3[1])≥334_0_ADD_LOAD(+(x3[1], 1))∧(UIncreasing(334_0_ADD_LOAD(+(x3[1], 1))), ≥))



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

    (7)    ((UIncreasing(334_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(334_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(334_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(334_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.
  • 334_0_ADD_LOAD(x3) → COND_334_0_ADD_LOAD(&&(>(x3, -1), <=(x3, 1000)), x3)
    • (x3[0] ≥ 0∧[1000] + [-1]x3[0] ≥ 0 ⇒ (UIncreasing(COND_334_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_334_0_ADD_LOAD(TRUE, x3) → 334_0_ADD_LOAD(+(x3, 1))
    • ((UIncreasing(334_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(334_0_ADD_LOAD(x1)) = [-1] + [-1]x1   
POL(COND_334_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_334_0_ADD_LOAD(TRUE, x3[1]) → 334_0_ADD_LOAD(+(x3[1], 1))

The following pairs are in Pbound:

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

The following pairs are in P:

334_0_ADD_LOAD(x3[0]) → COND_334_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): 334_0_ADD_LOAD(x3[0]) → COND_334_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_334_0_ADD_LOAD(TRUE, x3[1]) → 334_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