6.35/2.62 YES 6.35/2.63 proof of /export/starexec/sandbox/benchmark/theBenchmark.jar 6.35/2.63 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 6.35/2.63 6.35/2.63 6.35/2.63 termination of the given Bare JBC problem could be proven: 6.35/2.63 6.35/2.63 (0) Bare JBC problem 6.35/2.63 (1) BareJBCToJBCProof [EQUIVALENT, 96 ms] 6.35/2.63 (2) JBC problem 6.35/2.63 (3) JBCToGraph [EQUIVALENT, 307 ms] 6.35/2.63 (4) JBCTerminationGraph 6.35/2.63 (5) TerminationGraphToSCCProof [SOUND, 0 ms] 6.35/2.63 (6) JBCTerminationSCC 6.35/2.63 (7) SCCToIRSProof [SOUND, 127 ms] 6.35/2.63 (8) IRSwT 6.35/2.63 (9) IRSFormatTransformerProof [EQUIVALENT, 0 ms] 6.35/2.63 (10) IRSwT 6.35/2.63 (11) IRSwTTerminationDigraphProof [EQUIVALENT, 41 ms] 6.35/2.63 (12) IRSwT 6.35/2.63 (13) IntTRSCompressionProof [EQUIVALENT, 0 ms] 6.35/2.63 (14) IRSwT 6.35/2.63 (15) TempFilterProof [SOUND, 38 ms] 6.35/2.63 (16) IntTRS 6.35/2.63 (17) RankingReductionPairProof [EQUIVALENT, 31 ms] 6.35/2.63 (18) YES 6.35/2.63 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (0) 6.35/2.63 Obligation: 6.35/2.63 need to prove termination of the following program: 6.35/2.63 public class IntRTA { 6.35/2.63 // only wrap a primitive int 6.35/2.63 private int val; 6.35/2.63 6.35/2.63 // count up to the value 6.35/2.63 // in "limit" 6.35/2.63 public static void count( 6.35/2.63 IntRTA orig, IntRTA limit) { 6.35/2.63 6.35/2.63 if (orig == null 6.35/2.63 || limit == null) { 6.35/2.63 return; 6.35/2.63 } 6.35/2.63 6.35/2.63 // introduce sharing 6.35/2.63 IntRTA copy = orig; 6.35/2.63 6.35/2.63 while (orig.val < limit.val) { 6.35/2.63 copy.val++; 6.35/2.63 } 6.35/2.63 } 6.35/2.63 6.35/2.63 public static void main(String[] args) { 6.35/2.63 Random.args = args; 6.35/2.63 IntRTA x = new IntRTA(); 6.35/2.63 x.val = Random.random(); 6.35/2.63 IntRTA y = new IntRTA(); 6.35/2.63 y.val = Random.random(); 6.35/2.63 count(x, y); 6.35/2.63 } 6.35/2.63 } 6.35/2.63 6.35/2.63 6.35/2.63 public class Random { 6.35/2.63 static String[] args; 6.35/2.63 static int index = 0; 6.35/2.63 6.35/2.63 public static int random() { 6.35/2.63 String string = args[index]; 6.35/2.63 index++; 6.35/2.63 return string.length(); 6.35/2.63 } 6.35/2.63 } 6.35/2.63 6.35/2.63 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (1) BareJBCToJBCProof (EQUIVALENT) 6.35/2.63 initialized classpath 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (2) 6.35/2.63 Obligation: 6.35/2.63 need to prove termination of the following program: 6.35/2.63 public class IntRTA { 6.35/2.63 // only wrap a primitive int 6.35/2.63 private int val; 6.35/2.63 6.35/2.63 // count up to the value 6.35/2.63 // in "limit" 6.35/2.63 public static void count( 6.35/2.63 IntRTA orig, IntRTA limit) { 6.35/2.63 6.35/2.63 if (orig == null 6.35/2.63 || limit == null) { 6.35/2.63 return; 6.35/2.63 } 6.35/2.63 6.35/2.63 // introduce sharing 6.35/2.63 IntRTA copy = orig; 6.35/2.63 6.35/2.63 while (orig.val < limit.val) { 6.35/2.63 copy.val++; 6.35/2.63 } 6.35/2.63 } 6.35/2.63 6.35/2.63 public static void main(String[] args) { 6.35/2.63 Random.args = args; 6.35/2.63 IntRTA x = new IntRTA(); 6.35/2.63 x.val = Random.random(); 6.35/2.63 IntRTA y = new IntRTA(); 6.35/2.63 y.val = Random.random(); 6.35/2.63 count(x, y); 6.35/2.63 } 6.35/2.63 } 6.35/2.63 6.35/2.63 6.35/2.63 public class Random { 6.35/2.63 static String[] args; 6.35/2.63 static int index = 0; 6.35/2.63 6.35/2.63 public static int random() { 6.35/2.63 String string = args[index]; 6.35/2.63 index++; 6.35/2.63 return string.length(); 6.35/2.63 } 6.35/2.63 } 6.35/2.63 6.35/2.63 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (3) JBCToGraph (EQUIVALENT) 6.35/2.63 Constructed TerminationGraph. 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (4) 6.35/2.63 Obligation: 6.35/2.63 Termination Graph based on JBC Program: 6.35/2.63 IntRTA.main([Ljava/lang/String;)V: Graph of 207 nodes with 1 SCC. 6.35/2.63 6.35/2.63 6.35/2.63 6.35/2.63 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (5) TerminationGraphToSCCProof (SOUND) 6.35/2.63 Splitted TerminationGraph to 1 SCCs. 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (6) 6.35/2.63 Obligation: 6.35/2.63 SCC of termination graph based on JBC Program. 6.35/2.63 SCC contains nodes from the following methods: IntRTA.main([Ljava/lang/String;)V 6.35/2.63 SCC calls the following helper methods: 6.35/2.63 Performed SCC analyses: 6.35/2.63 *Used field analysis yielded the following read fields: 6.35/2.63 *IntRTA: [val] 6.35/2.63 *Marker field analysis yielded the following relations that could be markers: 6.35/2.63 *IntRTA.val > i19 (Introduced counter i64) 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (7) SCCToIRSProof (SOUND) 6.35/2.63 Transformed FIGraph SCCs to intTRSs. Log: 6.35/2.63 Generated rules. Obtained 14 IRulesP rules: 6.35/2.63 f375_0_count_FieldAccess(EOS(STATIC_375), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i64) -> f378_0_count_Load(EOS(STATIC_378), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i19, i64) :|: TRUE 6.35/2.63 f378_0_count_Load(EOS(STATIC_378), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i19, i64) -> f381_0_count_FieldAccess(EOS(STATIC_381), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i19, java.lang.Object(IntRTA(EOC, i42)), i64) :|: TRUE 6.35/2.63 f381_0_count_FieldAccess(EOS(STATIC_381), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i19, java.lang.Object(IntRTA(EOC, i42)), i64) -> f383_0_count_GE(EOS(STATIC_383), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i19, i42, i64) :|: TRUE 6.35/2.63 f383_0_count_GE(EOS(STATIC_383), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i19, i42, i64) -> f388_0_count_GE(EOS(STATIC_388), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i19, i42, i64) :|: i19 < i42 6.35/2.63 f388_0_count_GE(EOS(STATIC_388), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i19, i42, i64) -> f394_0_count_Load(EOS(STATIC_394), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i64) :|: i19 < i42 6.35/2.63 f394_0_count_Load(EOS(STATIC_394), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i64) -> f400_0_count_Duplicate(EOS(STATIC_400), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i64) :|: TRUE 6.35/2.63 f400_0_count_Duplicate(EOS(STATIC_400), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i64) -> f405_0_count_FieldAccess(EOS(STATIC_405), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i64) :|: TRUE 6.35/2.63 f405_0_count_FieldAccess(EOS(STATIC_405), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i64) -> f407_0_count_ConstantStackPush(EOS(STATIC_407), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i19, i64) :|: TRUE 6.35/2.63 f407_0_count_ConstantStackPush(EOS(STATIC_407), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i19, i64) -> f409_0_count_IntArithmetic(EOS(STATIC_409), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i19, 1, i64) :|: TRUE 6.35/2.63 f409_0_count_IntArithmetic(EOS(STATIC_409), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i19, matching1, i64) -> f410_0_count_FieldAccess(EOS(STATIC_410), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i19 + 1, i64) :|: i19 >= 0 && matching1 = 1 6.35/2.63 f410_0_count_FieldAccess(EOS(STATIC_410), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i45, i64) -> f414_0_count_JMP(EOS(STATIC_414), java.lang.Object(IntRTA(EOC, i45)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i45)), i64 + 1) :|: i64 >= 0 6.35/2.63 f414_0_count_JMP(EOS(STATIC_414), java.lang.Object(IntRTA(EOC, i45)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i45)), i64) -> f452_0_count_Load(EOS(STATIC_452), java.lang.Object(IntRTA(EOC, i45)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i45)), i64) :|: TRUE 6.35/2.63 f452_0_count_Load(EOS(STATIC_452), java.lang.Object(IntRTA(EOC, i45)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i45)), i64) -> f372_0_count_Load(EOS(STATIC_372), java.lang.Object(IntRTA(EOC, i45)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i45)), i64) :|: TRUE 6.35/2.63 f372_0_count_Load(EOS(STATIC_372), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), i64) -> f375_0_count_FieldAccess(EOS(STATIC_375), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i42)), java.lang.Object(IntRTA(EOC, i19)), java.lang.Object(IntRTA(EOC, i19)), i64) :|: TRUE 6.35/2.63 Combined rules. Obtained 1 IRulesP rules: 6.35/2.63 f375_0_count_FieldAccess(EOS(STATIC_375), java.lang.Object(IntRTA(EOC, i19:0)), java.lang.Object(IntRTA(EOC, i42:0)), java.lang.Object(IntRTA(EOC, i19:0)), java.lang.Object(IntRTA(EOC, i19:0)), i64:0) -> f375_0_count_FieldAccess(EOS(STATIC_375), java.lang.Object(IntRTA(EOC, i19:0 + 1)), java.lang.Object(IntRTA(EOC, i42:0)), java.lang.Object(IntRTA(EOC, i19:0 + 1)), java.lang.Object(IntRTA(EOC, i19:0 + 1)), i64:0 + 1) :|: i42:0 > i19:0 && i64:0 > -1 && i19:0 > -1 6.35/2.63 Filtered constant ground arguments: 6.35/2.63 f375_0_count_FieldAccess(x1, x2, x3, x4, x5, x6) -> f375_0_count_FieldAccess(x2, x3, x4, x5, x6) 6.35/2.63 EOS(x1) -> EOS 6.35/2.63 IntRTA(x1, x2) -> IntRTA(x2) 6.35/2.63 Filtered duplicate arguments: 6.35/2.63 f375_0_count_FieldAccess(x1, x2, x3, x4, x5) -> f375_0_count_FieldAccess(x2, x4, x5) 6.35/2.63 Finished conversion. Obtained 1 rules.P rules: 6.35/2.63 f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0)), java.lang.Object(IntRTA(i19:0)), i64:0, i42:0, i19:0) -> f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0)), java.lang.Object(IntRTA(i19:0 + 1)), i64:0 + 1, i42:0, i19:0 + 1) :|: i64:0 > -1 && i19:0 > -1 && i42:0 > i19:0 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (8) 6.35/2.63 Obligation: 6.35/2.63 Rules: 6.35/2.63 f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0)), java.lang.Object(IntRTA(i19:0)), i64:0, i42:0, i19:0) -> f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0)), java.lang.Object(IntRTA(i19:0 + 1)), i64:0 + 1, i42:0, i19:0 + 1) :|: i64:0 > -1 && i19:0 > -1 && i42:0 > i19:0 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (9) IRSFormatTransformerProof (EQUIVALENT) 6.35/2.63 Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (10) 6.35/2.63 Obligation: 6.35/2.63 Rules: 6.35/2.63 f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0)), java.lang.Object(IntRTA(i19:0)), i64:0, i42:0, i19:0) -> f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0)), java.lang.Object(IntRTA(arith1)), arith, i42:0, arith1) :|: i64:0 > -1 && i19:0 > -1 && i42:0 > i19:0 && arith = i64:0 + 1 && arith1 = i19:0 + 1 && arith1 = i19:0 + 1 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (11) IRSwTTerminationDigraphProof (EQUIVALENT) 6.35/2.63 Constructed termination digraph! 6.35/2.63 Nodes: 6.35/2.63 (1) f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0)), java.lang.Object(IntRTA(i19:0)), i64:0, i42:0, i19:0) -> f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0)), java.lang.Object(IntRTA(arith1)), arith, i42:0, arith1) :|: i64:0 > -1 && i19:0 > -1 && i42:0 > i19:0 && arith = i64:0 + 1 && arith1 = i19:0 + 1 && arith1 = i19:0 + 1 6.35/2.63 6.35/2.63 Arcs: 6.35/2.63 (1) -> (1) 6.35/2.63 6.35/2.63 This digraph is fully evaluated! 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (12) 6.35/2.63 Obligation: 6.35/2.63 6.35/2.63 Termination digraph: 6.35/2.63 Nodes: 6.35/2.63 (1) f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0)), java.lang.Object(IntRTA(i19:0)), i64:0, i42:0, i19:0) -> f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0)), java.lang.Object(IntRTA(arith1)), arith, i42:0, arith1) :|: i64:0 > -1 && i19:0 > -1 && i42:0 > i19:0 && arith = i64:0 + 1 && arith1 = i19:0 + 1 && arith1 = i19:0 + 1 6.35/2.63 6.35/2.63 Arcs: 6.35/2.63 (1) -> (1) 6.35/2.63 6.35/2.63 This digraph is fully evaluated! 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (13) IntTRSCompressionProof (EQUIVALENT) 6.35/2.63 Compressed rules. 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (14) 6.35/2.63 Obligation: 6.35/2.63 Rules: 6.35/2.63 f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0:0)), java.lang.Object(IntRTA(i19:0:0)), i64:0:0, i42:0:0, i19:0:0) -> f375_0_count_FieldAccess(java.lang.Object(IntRTA(i42:0:0)), java.lang.Object(IntRTA(i19:0:0 + 1)), i64:0:0 + 1, i42:0:0, i19:0:0 + 1) :|: i64:0:0 > -1 && i19:0:0 > -1 && i42:0:0 > i19:0:0 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (15) TempFilterProof (SOUND) 6.35/2.63 Used the following sort dictionary for filtering: 6.35/2.63 f375_0_count_FieldAccess(VARIABLE, VARIABLE, INTEGER, INTEGER, INTEGER) 6.35/2.63 java.lang.Object(VARIABLE) 6.35/2.63 IntRTA(INTEGER) 6.35/2.63 Replaced non-predefined constructor symbols by 0. 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (16) 6.35/2.63 Obligation: 6.35/2.63 Rules: 6.35/2.63 f375_0_count_FieldAccess(c, c1, i64:0:0, i42:0:0, i19:0:0) -> f375_0_count_FieldAccess(c2, c3, c4, i42:0:0, c5) :|: c5 = i19:0:0 + 1 && (c4 = i64:0:0 + 1 && (c3 = 0 && (c2 = 0 && (c1 = 0 && c = 0)))) && (i64:0:0 > -1 && i19:0:0 > -1 && i42:0:0 > i19:0:0) 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (17) RankingReductionPairProof (EQUIVALENT) 6.35/2.63 Interpretation: 6.35/2.63 [ f375_0_count_FieldAccess ] = -1*f375_0_count_FieldAccess_5 + f375_0_count_FieldAccess_4 6.35/2.63 6.35/2.63 The following rules are decreasing: 6.35/2.63 f375_0_count_FieldAccess(c, c1, i64:0:0, i42:0:0, i19:0:0) -> f375_0_count_FieldAccess(c2, c3, c4, i42:0:0, c5) :|: c5 = i19:0:0 + 1 && (c4 = i64:0:0 + 1 && (c3 = 0 && (c2 = 0 && (c1 = 0 && c = 0)))) && (i64:0:0 > -1 && i19:0:0 > -1 && i42:0:0 > i19:0:0) 6.35/2.63 6.35/2.63 The following rules are bounded: 6.35/2.63 f375_0_count_FieldAccess(c, c1, i64:0:0, i42:0:0, i19:0:0) -> f375_0_count_FieldAccess(c2, c3, c4, i42:0:0, c5) :|: c5 = i19:0:0 + 1 && (c4 = i64:0:0 + 1 && (c3 = 0 && (c2 = 0 && (c1 = 0 && c = 0)))) && (i64:0:0 > -1 && i19:0:0 > -1 && i42:0:0 > i19:0:0) 6.35/2.63 6.35/2.63 6.35/2.63 ---------------------------------------- 6.35/2.63 6.35/2.63 (18) 6.35/2.63 YES 6.50/2.67 EOF