0 JBC
↳1 JBCToGraph (⇒, 80 ms)
↳2 JBCTerminationGraph
↳3 TerminationGraphToSCCProof (⇒, 0 ms)
↳4 JBCTerminationSCC
↳5 SCCToIDPv1Proof (⇒, 150 ms)
↳6 IDP
↳7 IDPNonInfProof (⇒, 30 ms)
↳8 IDP
↳9 IDependencyGraphProof (⇔, 0 ms)
↳10 TRUE
public class StupidArray {
public static void main(String[] args) {
int i = 0;
while (true) {
i = args.length + 1;
args[i] = new String();
}
}
}
Generated 28 rules for P and 0 rules for R.
P rules:
142_0_main_ArrayLength(EOS(STATIC_142), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1))) → 144_0_main_ConstantStackPush(EOS(STATIC_144), java.lang.Object(ARRAY(i1)), i1) | >=(i1, 0)
144_0_main_ConstantStackPush(EOS(STATIC_144), java.lang.Object(ARRAY(i1)), i1) → 146_0_main_IntArithmetic(EOS(STATIC_146), java.lang.Object(ARRAY(i1)), i1, 1)
146_0_main_IntArithmetic(EOS(STATIC_146), java.lang.Object(ARRAY(i1)), i1, matching1) → 148_0_main_Store(EOS(STATIC_148), java.lang.Object(ARRAY(i1)), +(i1, 1)) | &&(>=(i1, 0), =(matching1, 1))
148_0_main_Store(EOS(STATIC_148), java.lang.Object(ARRAY(i1)), i5) → 150_0_main_Load(EOS(STATIC_150), java.lang.Object(ARRAY(i1)), i5)
150_0_main_Load(EOS(STATIC_150), java.lang.Object(ARRAY(i1)), i5) → 152_0_main_Load(EOS(STATIC_152), java.lang.Object(ARRAY(i1)), i5, java.lang.Object(ARRAY(i1)))
152_0_main_Load(EOS(STATIC_152), java.lang.Object(ARRAY(i1)), i5, java.lang.Object(ARRAY(i1))) → 154_0_main_New(EOS(STATIC_154), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
154_0_main_New(EOS(STATIC_154), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 157_0_main_Duplicate(EOS(STATIC_157), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
157_0_main_Duplicate(EOS(STATIC_157), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 159_0_main_InvokeMethod(EOS(STATIC_159), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
159_0_main_InvokeMethod(EOS(STATIC_159), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 161_0_<init>_Load(EOS(STATIC_161), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
161_0_<init>_Load(EOS(STATIC_161), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 163_0_<init>_InvokeMethod(EOS(STATIC_163), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
163_0_<init>_InvokeMethod(EOS(STATIC_163), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 166_0_<init>_Load(EOS(STATIC_166), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
166_0_<init>_Load(EOS(STATIC_166), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 168_0_<init>_ConstantStackPush(EOS(STATIC_168), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
168_0_<init>_ConstantStackPush(EOS(STATIC_168), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 171_0_<init>_FieldAccess(EOS(STATIC_171), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
171_0_<init>_FieldAccess(EOS(STATIC_171), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 174_0_<init>_Load(EOS(STATIC_174), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
174_0_<init>_Load(EOS(STATIC_174), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 175_0_<init>_ConstantStackPush(EOS(STATIC_175), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
175_0_<init>_ConstantStackPush(EOS(STATIC_175), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 178_0_<init>_FieldAccess(EOS(STATIC_178), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
178_0_<init>_FieldAccess(EOS(STATIC_178), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 181_0_<init>_Load(EOS(STATIC_181), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
181_0_<init>_Load(EOS(STATIC_181), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 183_0_<init>_ConstantStackPush(EOS(STATIC_183), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
183_0_<init>_ConstantStackPush(EOS(STATIC_183), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 186_0_<init>_ArrayCreate(EOS(STATIC_186), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
186_0_<init>_ArrayCreate(EOS(STATIC_186), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 189_0_<init>_FieldAccess(EOS(STATIC_189), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
189_0_<init>_FieldAccess(EOS(STATIC_189), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 194_0_<init>_Return(EOS(STATIC_194), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
194_0_<init>_Return(EOS(STATIC_194), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 197_0_main_ArrayAccess(EOS(STATIC_197), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
197_0_main_ArrayAccess(EOS(STATIC_197), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 199_0_main_ArrayAccess(EOS(STATIC_199), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
199_0_main_ArrayAccess(EOS(STATIC_199), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 202_0_main_ArrayAccess(EOS(STATIC_202), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
202_0_main_ArrayAccess(EOS(STATIC_202), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 209_0_main_JMP(EOS(STATIC_209), java.lang.Object(ARRAY(i1))) | <(i5, i1)
209_0_main_JMP(EOS(STATIC_209), java.lang.Object(ARRAY(i1))) → 216_0_main_Load(EOS(STATIC_216), java.lang.Object(ARRAY(i1)))
216_0_main_Load(EOS(STATIC_216), java.lang.Object(ARRAY(i1))) → 139_0_main_Load(EOS(STATIC_139), java.lang.Object(ARRAY(i1)))
139_0_main_Load(EOS(STATIC_139), java.lang.Object(ARRAY(i1))) → 142_0_main_ArrayLength(EOS(STATIC_142), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)))
R rules:
Combined rules. Obtained 1 conditional rules for P and 0 conditional rules for R.
P rules:
142_0_main_ArrayLength(EOS(STATIC_142), java.lang.Object(ARRAY(x0)), java.lang.Object(ARRAY(x0))) → 142_0_main_ArrayLength(EOS(STATIC_142), java.lang.Object(ARRAY(x0)), java.lang.Object(ARRAY(x0))) | &&(>(+(x0, 1), 0), >(x0, +(x0, 1)))
R rules:
Filtered ground terms:
142_0_main_ArrayLength(x1, x2, x3) → 142_0_main_ArrayLength(x2, x3)
EOS(x1) → EOS
Cond_142_0_main_ArrayLength(x1, x2, x3, x4) → Cond_142_0_main_ArrayLength(x1, x3, x4)
Filtered duplicate args:
142_0_main_ArrayLength(x1, x2) → 142_0_main_ArrayLength(x2)
Cond_142_0_main_ArrayLength(x1, x2, x3) → Cond_142_0_main_ArrayLength(x1, x3)
Combined rules. Obtained 1 conditional rules for P and 0 conditional rules for R.
P rules:
142_0_main_ArrayLength(java.lang.Object(ARRAY(x0))) → 142_0_main_ArrayLength(java.lang.Object(ARRAY(x0))) | &&(>(x0, -1), >(x0, +(x0, 1)))
R rules:
Finished conversion. Obtained 2 rules for P and 0 rules for R. System has predefined symbols.
P rules:
142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0))) → COND_142_0_MAIN_ARRAYLENGTH(&&(>(x0, -1), >(x0, +(x0, 1))), java.lang.Object(ARRAY(x0)))
COND_142_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0))) → 142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0)))
R rules:
!= | ~ | 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 |
Boolean, Integer
(0) -> (1), if (x0[0] > -1 && x0[0] > x0[0] + 1 ∧java.lang.Object(ARRAY(x0[0])) →* java.lang.Object(ARRAY(x0[1])))
(1) -> (0), if (java.lang.Object(ARRAY(x0[1])) →* java.lang.Object(ARRAY(x0[0])))
(1) (java.lang.Object(ARRAY(x0[1]))=java.lang.Object(ARRAY(x0[0]))∧&&(>(x0[0], -1), >(x0[0], +(x0[0], 1)))=TRUE∧java.lang.Object(ARRAY(x0[0]))=java.lang.Object(ARRAY(x0[1]1)) ⇒ 142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0])))≥NonInfC∧142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0])))≥COND_142_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))∧(UIncreasing(COND_142_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))), ≥))
(2) (>(x0[0], -1)=TRUE∧>(x0[0], +(x0[0], 1))=TRUE ⇒ 142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0])))≥NonInfC∧142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0])))≥COND_142_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))∧(UIncreasing(COND_142_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))), ≥))
(3) (x0[0] ≥ 0∧[-2] ≥ 0 ⇒ (UIncreasing(COND_142_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))), ≥)∧[(-1)bni_14 + (-1)Bound*bni_14] + [(-1)bni_14]x0[0] ≥ 0∧[-1 + (-1)bso_15] ≥ 0)
(4) (x0[0] ≥ 0∧[-2] ≥ 0 ⇒ (UIncreasing(COND_142_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))), ≥)∧[(-1)bni_14 + (-1)Bound*bni_14] + [(-1)bni_14]x0[0] ≥ 0∧[-1 + (-1)bso_15] ≥ 0)
(5) (x0[0] ≥ 0∧[-2] ≥ 0 ⇒ (UIncreasing(COND_142_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))), ≥)∧[(-1)bni_14 + (-1)Bound*bni_14] + [(-1)bni_14]x0[0] ≥ 0∧[-1 + (-1)bso_15] ≥ 0)
(6) (&&(>(x0[0], -1), >(x0[0], +(x0[0], 1)))=TRUE∧java.lang.Object(ARRAY(x0[0]))=java.lang.Object(ARRAY(x0[1]))∧java.lang.Object(ARRAY(x0[1]))=java.lang.Object(ARRAY(x0[0]1)) ⇒ COND_142_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[1])))≥NonInfC∧COND_142_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[1])))≥142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))∧(UIncreasing(142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))), ≥))
(7) (>(x0[0], -1)=TRUE∧>(x0[0], +(x0[0], 1))=TRUE ⇒ COND_142_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[0])))≥NonInfC∧COND_142_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[0])))≥142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0])))∧(UIncreasing(142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))), ≥))
(8) (x0[0] ≥ 0∧[-2] ≥ 0 ⇒ (UIncreasing(142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))), ≥)∧[(-1)bni_16 + (-1)Bound*bni_16] + [(-1)bni_16]x0[0] ≥ 0∧[(-1)bso_17] ≥ 0)
(9) (x0[0] ≥ 0∧[-2] ≥ 0 ⇒ (UIncreasing(142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))), ≥)∧[(-1)bni_16 + (-1)Bound*bni_16] + [(-1)bni_16]x0[0] ≥ 0∧[(-1)bso_17] ≥ 0)
(10) (x0[0] ≥ 0∧[-2] ≥ 0 ⇒ (UIncreasing(142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))), ≥)∧[(-1)bni_16 + (-1)Bound*bni_16] + [(-1)bni_16]x0[0] ≥ 0∧[(-1)bso_17] ≥ 0)
POL(TRUE) = 0
POL(FALSE) = 0
POL(142_0_MAIN_ARRAYLENGTH(x1)) = [-1] + [-1]x1
POL(java.lang.Object(x1)) = [-1] + [-1]x1
POL(ARRAY(x1)) = [-1] + [-1]x1
POL(COND_142_0_MAIN_ARRAYLENGTH(x1, x2)) = [-1] + [-1]x2 + [-1]x1
POL(&&(x1, x2)) = [-1]
POL(>(x1, x2)) = [-1]
POL(-1) = [-1]
POL(+(x1, x2)) = x1 + x2
POL(1) = [1]
142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0]))) → COND_142_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))
COND_142_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[1]))) → 142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))
142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0]))) → COND_142_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))
COND_142_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[1]))) → 142_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))
!= | ~ | 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 |