0 JBC
↳1 JBCToGraph (⇒, 120 ms)
↳2 JBCTerminationGraph
↳3 TerminationGraphToSCCProof (⇒, 0 ms)
↳4 JBCTerminationSCC
↳5 SCCToIDPv1Proof (⇒, 100 ms)
↳6 IDP
↳7 IDPNonInfProof (⇒, 10 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:
126_0_main_ArrayLength(EOS(STATIC_126), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1))) → 128_0_main_ConstantStackPush(EOS(STATIC_128), java.lang.Object(ARRAY(i1)), i1) | >=(i1, 0)
128_0_main_ConstantStackPush(EOS(STATIC_128), java.lang.Object(ARRAY(i1)), i1) → 129_0_main_IntArithmetic(EOS(STATIC_129), java.lang.Object(ARRAY(i1)), i1, 1)
129_0_main_IntArithmetic(EOS(STATIC_129), java.lang.Object(ARRAY(i1)), i1, matching1) → 131_0_main_Store(EOS(STATIC_131), java.lang.Object(ARRAY(i1)), +(i1, 1)) | &&(>=(i1, 0), =(matching1, 1))
131_0_main_Store(EOS(STATIC_131), java.lang.Object(ARRAY(i1)), i5) → 133_0_main_Load(EOS(STATIC_133), java.lang.Object(ARRAY(i1)), i5)
133_0_main_Load(EOS(STATIC_133), java.lang.Object(ARRAY(i1)), i5) → 134_0_main_Load(EOS(STATIC_134), java.lang.Object(ARRAY(i1)), i5, java.lang.Object(ARRAY(i1)))
134_0_main_Load(EOS(STATIC_134), java.lang.Object(ARRAY(i1)), i5, java.lang.Object(ARRAY(i1))) → 136_0_main_New(EOS(STATIC_136), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
136_0_main_New(EOS(STATIC_136), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 138_0_main_Duplicate(EOS(STATIC_138), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
138_0_main_Duplicate(EOS(STATIC_138), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 139_0_main_InvokeMethod(EOS(STATIC_139), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
139_0_main_InvokeMethod(EOS(STATIC_139), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 140_0_<init>_Load(EOS(STATIC_140), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
140_0_<init>_Load(EOS(STATIC_140), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 142_0_<init>_InvokeMethod(EOS(STATIC_142), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
142_0_<init>_InvokeMethod(EOS(STATIC_142), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 144_0_<init>_Load(EOS(STATIC_144), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
144_0_<init>_Load(EOS(STATIC_144), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 145_0_<init>_ConstantStackPush(EOS(STATIC_145), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
145_0_<init>_ConstantStackPush(EOS(STATIC_145), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 147_0_<init>_FieldAccess(EOS(STATIC_147), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
147_0_<init>_FieldAccess(EOS(STATIC_147), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 149_0_<init>_Load(EOS(STATIC_149), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
149_0_<init>_Load(EOS(STATIC_149), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 151_0_<init>_ConstantStackPush(EOS(STATIC_151), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
151_0_<init>_ConstantStackPush(EOS(STATIC_151), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 152_0_<init>_FieldAccess(EOS(STATIC_152), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
152_0_<init>_FieldAccess(EOS(STATIC_152), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 154_0_<init>_Load(EOS(STATIC_154), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
154_0_<init>_Load(EOS(STATIC_154), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 156_0_<init>_ConstantStackPush(EOS(STATIC_156), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
156_0_<init>_ConstantStackPush(EOS(STATIC_156), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 158_0_<init>_ArrayCreate(EOS(STATIC_158), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
158_0_<init>_ArrayCreate(EOS(STATIC_158), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 160_0_<init>_FieldAccess(EOS(STATIC_160), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
160_0_<init>_FieldAccess(EOS(STATIC_160), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 163_0_<init>_Return(EOS(STATIC_163), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
163_0_<init>_Return(EOS(STATIC_163), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 164_0_main_ArrayAccess(EOS(STATIC_164), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
164_0_main_ArrayAccess(EOS(STATIC_164), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 165_0_main_ArrayAccess(EOS(STATIC_165), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
165_0_main_ArrayAccess(EOS(STATIC_165), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 166_0_main_ArrayAccess(EOS(STATIC_166), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5)
166_0_main_ArrayAccess(EOS(STATIC_166), java.lang.Object(ARRAY(i1)), java.lang.Object(ARRAY(i1)), i5) → 168_0_main_JMP(EOS(STATIC_168), java.lang.Object(ARRAY(i1))) | <(i5, i1)
168_0_main_JMP(EOS(STATIC_168), java.lang.Object(ARRAY(i1))) → 180_0_main_Load(EOS(STATIC_180), java.lang.Object(ARRAY(i1)))
180_0_main_Load(EOS(STATIC_180), java.lang.Object(ARRAY(i1))) → 123_0_main_Load(EOS(STATIC_123), java.lang.Object(ARRAY(i1)))
123_0_main_Load(EOS(STATIC_123), java.lang.Object(ARRAY(i1))) → 126_0_main_ArrayLength(EOS(STATIC_126), 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:
126_0_main_ArrayLength(EOS(STATIC_126), java.lang.Object(ARRAY(x0)), java.lang.Object(ARRAY(x0))) → 126_0_main_ArrayLength(EOS(STATIC_126), java.lang.Object(ARRAY(x0)), java.lang.Object(ARRAY(x0))) | &&(>(+(x0, 1), 0), >(x0, +(x0, 1)))
R rules:
Filtered ground terms:
126_0_main_ArrayLength(x1, x2, x3) → 126_0_main_ArrayLength(x2, x3)
EOS(x1) → EOS
Cond_126_0_main_ArrayLength(x1, x2, x3, x4) → Cond_126_0_main_ArrayLength(x1, x3, x4)
Filtered duplicate args:
126_0_main_ArrayLength(x1, x2) → 126_0_main_ArrayLength(x2)
Cond_126_0_main_ArrayLength(x1, x2, x3) → Cond_126_0_main_ArrayLength(x1, x3)
Combined rules. Obtained 1 conditional rules for P and 0 conditional rules for R.
P rules:
126_0_main_ArrayLength(java.lang.Object(ARRAY(x0))) → 126_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:
126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0))) → COND_126_0_MAIN_ARRAYLENGTH(&&(>(x0, -1), >(x0, +(x0, 1))), java.lang.Object(ARRAY(x0)))
COND_126_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0))) → 126_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)) ⇒ 126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0])))≥NonInfC∧126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0])))≥COND_126_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))∧(UIncreasing(COND_126_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 ⇒ 126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0])))≥NonInfC∧126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0])))≥COND_126_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))∧(UIncreasing(COND_126_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_126_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_126_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_126_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_126_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[1])))≥NonInfC∧COND_126_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[1])))≥126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))∧(UIncreasing(126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))), ≥))
(7) (>(x0[0], -1)=TRUE∧>(x0[0], +(x0[0], 1))=TRUE ⇒ COND_126_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[0])))≥NonInfC∧COND_126_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[0])))≥126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0])))∧(UIncreasing(126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))), ≥))
(8) (x0[0] ≥ 0∧[-2] ≥ 0 ⇒ (UIncreasing(126_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(126_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(126_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(126_0_MAIN_ARRAYLENGTH(x1)) = [-1] + [-1]x1
POL(java.lang.Object(x1)) = [-1] + [-1]x1
POL(ARRAY(x1)) = [-1] + [-1]x1
POL(COND_126_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]
126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0]))) → COND_126_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))
COND_126_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[1]))) → 126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[1])))
126_0_MAIN_ARRAYLENGTH(java.lang.Object(ARRAY(x0[0]))) → COND_126_0_MAIN_ARRAYLENGTH(&&(>(x0[0], -1), >(x0[0], +(x0[0], 1))), java.lang.Object(ARRAY(x0[0])))
COND_126_0_MAIN_ARRAYLENGTH(TRUE, java.lang.Object(ARRAY(x0[1]))) → 126_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 |