9.59/3.97 YES 9.59/3.98 proof of /export/starexec/sandbox/benchmark/theBenchmark.jar 9.59/3.98 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 9.59/3.98 9.59/3.98 9.59/3.98 termination of the given Bare JBC problem could be proven: 9.59/3.98 9.59/3.98 (0) Bare JBC problem 9.59/3.98 (1) BareJBCToJBCProof [EQUIVALENT, 96 ms] 9.59/3.98 (2) JBC problem 9.59/3.98 (3) JBCToGraph [EQUIVALENT, 375 ms] 9.59/3.98 (4) JBCTerminationGraph 9.59/3.98 (5) TerminationGraphToSCCProof [SOUND, 0 ms] 9.59/3.98 (6) JBCTerminationSCC 9.59/3.98 (7) SCCToIRSProof [SOUND, 83 ms] 9.59/3.98 (8) IRSwT 9.59/3.98 (9) IRSFormatTransformerProof [EQUIVALENT, 0 ms] 9.59/3.98 (10) IRSwT 9.59/3.98 (11) IRSwTTerminationDigraphProof [EQUIVALENT, 12 ms] 9.59/3.98 (12) AND 9.59/3.98 (13) IRSwT 9.59/3.98 (14) IntTRSCompressionProof [EQUIVALENT, 0 ms] 9.59/3.98 (15) IRSwT 9.59/3.98 (16) TempFilterProof [SOUND, 13 ms] 9.59/3.98 (17) IntTRS 9.59/3.98 (18) PolynomialOrderProcessor [EQUIVALENT, 0 ms] 9.59/3.98 (19) YES 9.59/3.98 (20) IRSwT 9.59/3.98 (21) IntTRSCompressionProof [EQUIVALENT, 0 ms] 9.59/3.98 (22) IRSwT 9.59/3.98 (23) TempFilterProof [SOUND, 3 ms] 9.59/3.98 (24) IntTRS 9.59/3.98 (25) PolynomialOrderProcessor [EQUIVALENT, 0 ms] 9.59/3.98 (26) YES 9.59/3.98 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (0) 9.59/3.98 Obligation: 9.59/3.98 need to prove termination of the following program: 9.59/3.98 /** 9.59/3.98 * Example taken from "A Term Rewriting Approach to the Automated Termination 9.59/3.98 * Analysis of Imperative Programs" (http://www.cs.unm.edu/~spf/papers/2009-02.pdf) 9.59/3.98 * and converted to Java. 9.59/3.98 */ 9.59/3.98 9.59/3.98 public class PastaB10 { 9.59/3.98 public static void main(String[] args) { 9.59/3.98 Random.args = args; 9.59/3.98 int x = Random.random(); 9.59/3.98 int y = Random.random(); 9.59/3.98 9.59/3.98 while (x + y > 0) { 9.59/3.98 if (x > 0) { 9.59/3.98 x--; 9.59/3.98 } else if (y > 0) { 9.59/3.98 y--; 9.59/3.98 } else { 9.59/3.98 continue; 9.59/3.98 } 9.59/3.98 } 9.59/3.98 } 9.59/3.98 } 9.59/3.98 9.59/3.98 9.59/3.98 public class Random { 9.59/3.98 static String[] args; 9.59/3.98 static int index = 0; 9.59/3.98 9.59/3.98 public static int random() { 9.59/3.98 String string = args[index]; 9.59/3.98 index++; 9.59/3.98 return string.length(); 9.59/3.98 } 9.59/3.98 } 9.59/3.98 9.59/3.98 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (1) BareJBCToJBCProof (EQUIVALENT) 9.59/3.98 initialized classpath 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (2) 9.59/3.98 Obligation: 9.59/3.98 need to prove termination of the following program: 9.59/3.98 /** 9.59/3.98 * Example taken from "A Term Rewriting Approach to the Automated Termination 9.59/3.98 * Analysis of Imperative Programs" (http://www.cs.unm.edu/~spf/papers/2009-02.pdf) 9.59/3.98 * and converted to Java. 9.59/3.98 */ 9.59/3.98 9.59/3.98 public class PastaB10 { 9.59/3.98 public static void main(String[] args) { 9.59/3.98 Random.args = args; 9.59/3.98 int x = Random.random(); 9.59/3.98 int y = Random.random(); 9.59/3.98 9.59/3.98 while (x + y > 0) { 9.59/3.98 if (x > 0) { 9.59/3.98 x--; 9.59/3.98 } else if (y > 0) { 9.59/3.98 y--; 9.59/3.98 } else { 9.59/3.98 continue; 9.59/3.98 } 9.59/3.98 } 9.59/3.98 } 9.59/3.98 } 9.59/3.98 9.59/3.98 9.59/3.98 public class Random { 9.59/3.98 static String[] args; 9.59/3.98 static int index = 0; 9.59/3.98 9.59/3.98 public static int random() { 9.59/3.98 String string = args[index]; 9.59/3.98 index++; 9.59/3.98 return string.length(); 9.59/3.98 } 9.59/3.98 } 9.59/3.98 9.59/3.98 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (3) JBCToGraph (EQUIVALENT) 9.59/3.98 Constructed TerminationGraph. 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (4) 9.59/3.98 Obligation: 9.59/3.98 Termination Graph based on JBC Program: 9.59/3.98 PastaB10.main([Ljava/lang/String;)V: Graph of 187 nodes with 1 SCC. 9.59/3.98 9.59/3.98 9.59/3.98 9.59/3.98 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (5) TerminationGraphToSCCProof (SOUND) 9.59/3.98 Splitted TerminationGraph to 1 SCCs. 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (6) 9.59/3.98 Obligation: 9.59/3.98 SCC of termination graph based on JBC Program. 9.59/3.98 SCC contains nodes from the following methods: PastaB10.main([Ljava/lang/String;)V 9.59/3.98 SCC calls the following helper methods: 9.59/3.98 Performed SCC analyses: 9.59/3.98 *Used field analysis yielded the following read fields: 9.59/3.98 9.59/3.98 *Marker field analysis yielded the following relations that could be markers: 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (7) SCCToIRSProof (SOUND) 9.59/3.98 Transformed FIGraph SCCs to intTRSs. Log: 9.59/3.98 Generated rules. Obtained 22 IRulesP rules: 9.59/3.98 f362_0_main_Load(EOS(STATIC_362), i19, i50, i19) -> f371_0_main_IntArithmetic(EOS(STATIC_371), i19, i50, i19, i50) :|: TRUE 9.59/3.98 f371_0_main_IntArithmetic(EOS(STATIC_371), i19, i50, i19, i50) -> f385_0_main_LE(EOS(STATIC_385), i19, i50, i19 + i50) :|: i19 >= 0 && i50 >= 0 9.59/3.98 f385_0_main_LE(EOS(STATIC_385), i19, i50, i62) -> f398_0_main_LE(EOS(STATIC_398), i19, i50, i62) :|: TRUE 9.59/3.98 f398_0_main_LE(EOS(STATIC_398), i19, i50, i62) -> f432_0_main_Load(EOS(STATIC_432), i19, i50) :|: i62 > 0 9.59/3.98 f432_0_main_Load(EOS(STATIC_432), i19, i50) -> f451_0_main_LE(EOS(STATIC_451), i19, i50, i19) :|: TRUE 9.59/3.98 f451_0_main_LE(EOS(STATIC_451), matching1, i50, matching2) -> f460_0_main_LE(EOS(STATIC_460), 0, i50, 0) :|: TRUE && matching1 = 0 && matching2 = 0 9.59/3.98 f451_0_main_LE(EOS(STATIC_451), i72, i50, i72) -> f461_0_main_LE(EOS(STATIC_461), i72, i50, i72) :|: TRUE 9.59/3.98 f460_0_main_LE(EOS(STATIC_460), matching1, i50, matching2) -> f481_0_main_Load(EOS(STATIC_481), 0, i50) :|: 0 <= 0 && matching1 = 0 && matching2 = 0 9.59/3.98 f481_0_main_Load(EOS(STATIC_481), matching1, i50) -> f492_0_main_LE(EOS(STATIC_492), 0, i50, i50) :|: TRUE && matching1 = 0 9.59/3.98 f492_0_main_LE(EOS(STATIC_492), matching1, matching2, matching3) -> f507_0_main_LE(EOS(STATIC_507), 0, 0, 0) :|: TRUE && matching1 = 0 && matching2 = 0 && matching3 = 0 9.59/3.98 f492_0_main_LE(EOS(STATIC_492), matching1, i80, i80) -> f508_0_main_LE(EOS(STATIC_508), 0, i80, i80) :|: TRUE && matching1 = 0 9.59/3.98 f507_0_main_LE(EOS(STATIC_507), matching1, matching2, matching3) -> f1261_0_main_Load(EOS(STATIC_1261), 0, 0) :|: 0 <= 0 && matching1 = 0 && matching2 = 0 && matching3 = 0 9.59/3.98 f1261_0_main_Load(EOS(STATIC_1261), matching1, matching2) -> f351_0_main_Load(EOS(STATIC_351), 0, 0) :|: TRUE && matching1 = 0 && matching2 = 0 9.59/3.98 f351_0_main_Load(EOS(STATIC_351), i19, i50) -> f362_0_main_Load(EOS(STATIC_362), i19, i50, i19) :|: TRUE 9.59/3.98 f508_0_main_LE(EOS(STATIC_508), matching1, i80, i80) -> f1268_0_main_Inc(EOS(STATIC_1268), 0, i80) :|: i80 > 0 && matching1 = 0 9.59/3.98 f1268_0_main_Inc(EOS(STATIC_1268), matching1, i80) -> f9262_0_main_JMP(EOS(STATIC_9262), 0, i80 + -1) :|: TRUE && matching1 = 0 9.59/3.98 f9262_0_main_JMP(EOS(STATIC_9262), matching1, i1395) -> f9265_0_main_Load(EOS(STATIC_9265), 0, i1395) :|: TRUE && matching1 = 0 9.59/3.98 f9265_0_main_Load(EOS(STATIC_9265), matching1, i1395) -> f351_0_main_Load(EOS(STATIC_351), 0, i1395) :|: TRUE && matching1 = 0 9.59/3.98 f461_0_main_LE(EOS(STATIC_461), i72, i50, i72) -> f483_0_main_Inc(EOS(STATIC_483), i72, i50) :|: i72 > 0 9.59/3.98 f483_0_main_Inc(EOS(STATIC_483), i72, i50) -> f495_0_main_JMP(EOS(STATIC_495), i72 + -1, i50) :|: TRUE 9.59/3.98 f495_0_main_JMP(EOS(STATIC_495), i78, i50) -> f651_0_main_Load(EOS(STATIC_651), i78, i50) :|: TRUE 9.59/3.98 f651_0_main_Load(EOS(STATIC_651), i78, i50) -> f351_0_main_Load(EOS(STATIC_351), i78, i50) :|: TRUE 9.59/3.98 Combined rules. Obtained 2 IRulesP rules: 9.59/3.98 f362_0_main_Load(EOS(STATIC_362), i19:0, i50:0, i19:0) -> f362_0_main_Load(EOS(STATIC_362), i19:0 - 1, i50:0, i19:0 - 1) :|: i19:0 > 0 && i19:0 + i50:0 > 0 && i50:0 > -1 9.59/3.98 f362_0_main_Load(EOS(STATIC_362), 0, i50:0, 0) -> f362_0_main_Load(EOS(STATIC_362), 0, i50:0 - 1, 0) :|: i50:0 > 0 9.59/3.98 Filtered constant ground arguments: 9.59/3.98 f362_0_main_Load(x1, x2, x3, x4) -> f362_0_main_Load(x2, x3, x4) 9.59/3.98 EOS(x1) -> EOS 9.59/3.98 Filtered duplicate arguments: 9.59/3.98 f362_0_main_Load(x1, x2, x3) -> f362_0_main_Load(x2, x3) 9.59/3.98 Finished conversion. Obtained 2 rules.P rules: 9.59/3.98 f362_0_main_Load(i50:0, i19:0) -> f362_0_main_Load(i50:0, i19:0 - 1) :|: i19:0 + i50:0 > 0 && i50:0 > -1 && i19:0 > 0 9.59/3.98 f362_0_main_Load(i50:0, cons_0) -> f362_0_main_Load(i50:0 - 1, 0) :|: i50:0 > 0 && cons_0 = 0 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (8) 9.59/3.98 Obligation: 9.59/3.98 Rules: 9.59/3.98 f362_0_main_Load(i50:0, i19:0) -> f362_0_main_Load(i50:0, i19:0 - 1) :|: i19:0 + i50:0 > 0 && i50:0 > -1 && i19:0 > 0 9.59/3.98 f362_0_main_Load(x, x1) -> f362_0_main_Load(x - 1, 0) :|: x > 0 && x1 = 0 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (9) IRSFormatTransformerProof (EQUIVALENT) 9.59/3.98 Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (10) 9.59/3.98 Obligation: 9.59/3.98 Rules: 9.59/3.98 f362_0_main_Load(i50:0, i19:0) -> f362_0_main_Load(i50:0, arith) :|: i19:0 + i50:0 > 0 && i50:0 > -1 && i19:0 > 0 && arith = i19:0 - 1 9.59/3.98 f362_0_main_Load(x2, x3) -> f362_0_main_Load(x4, 0) :|: x2 > 0 && x3 = 0 && x4 = x2 - 1 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (11) IRSwTTerminationDigraphProof (EQUIVALENT) 9.59/3.98 Constructed termination digraph! 9.59/3.98 Nodes: 9.59/3.98 (1) f362_0_main_Load(i50:0, i19:0) -> f362_0_main_Load(i50:0, arith) :|: i19:0 + i50:0 > 0 && i50:0 > -1 && i19:0 > 0 && arith = i19:0 - 1 9.59/3.98 (2) f362_0_main_Load(x2, x3) -> f362_0_main_Load(x4, 0) :|: x2 > 0 && x3 = 0 && x4 = x2 - 1 9.59/3.98 9.59/3.98 Arcs: 9.59/3.98 (1) -> (1), (2) 9.59/3.98 (2) -> (2) 9.59/3.98 9.59/3.98 This digraph is fully evaluated! 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (12) 9.59/3.98 Complex Obligation (AND) 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (13) 9.59/3.98 Obligation: 9.59/3.98 9.59/3.98 Termination digraph: 9.59/3.98 Nodes: 9.59/3.98 (1) f362_0_main_Load(i50:0, i19:0) -> f362_0_main_Load(i50:0, arith) :|: i19:0 + i50:0 > 0 && i50:0 > -1 && i19:0 > 0 && arith = i19:0 - 1 9.59/3.98 9.59/3.98 Arcs: 9.59/3.98 (1) -> (1) 9.59/3.98 9.59/3.98 This digraph is fully evaluated! 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (14) IntTRSCompressionProof (EQUIVALENT) 9.59/3.98 Compressed rules. 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (15) 9.59/3.98 Obligation: 9.59/3.98 Rules: 9.59/3.98 f362_0_main_Load(i50:0:0, i19:0:0) -> f362_0_main_Load(i50:0:0, i19:0:0 - 1) :|: i19:0:0 + i50:0:0 > 0 && i50:0:0 > -1 && i19:0:0 > 0 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (16) TempFilterProof (SOUND) 9.59/3.98 Used the following sort dictionary for filtering: 9.59/3.98 f362_0_main_Load(INTEGER, INTEGER) 9.59/3.98 Replaced non-predefined constructor symbols by 0. 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (17) 9.59/3.98 Obligation: 9.59/3.98 Rules: 9.59/3.98 f362_0_main_Load(i50:0:0, i19:0:0) -> f362_0_main_Load(i50:0:0, c) :|: c = i19:0:0 - 1 && (i19:0:0 + i50:0:0 > 0 && i50:0:0 > -1 && i19:0:0 > 0) 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (18) PolynomialOrderProcessor (EQUIVALENT) 9.59/3.98 Found the following polynomial interpretation: 9.59/3.98 [f362_0_main_Load(x, x1)] = x + x1 9.59/3.98 9.59/3.98 The following rules are decreasing: 9.59/3.98 f362_0_main_Load(i50:0:0, i19:0:0) -> f362_0_main_Load(i50:0:0, c) :|: c = i19:0:0 - 1 && (i19:0:0 + i50:0:0 > 0 && i50:0:0 > -1 && i19:0:0 > 0) 9.59/3.98 The following rules are bounded: 9.59/3.98 f362_0_main_Load(i50:0:0, i19:0:0) -> f362_0_main_Load(i50:0:0, c) :|: c = i19:0:0 - 1 && (i19:0:0 + i50:0:0 > 0 && i50:0:0 > -1 && i19:0:0 > 0) 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (19) 9.59/3.98 YES 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (20) 9.59/3.98 Obligation: 9.59/3.98 9.59/3.98 Termination digraph: 9.59/3.98 Nodes: 9.59/3.98 (1) f362_0_main_Load(x2, x3) -> f362_0_main_Load(x4, 0) :|: x2 > 0 && x3 = 0 && x4 = x2 - 1 9.59/3.98 9.59/3.98 Arcs: 9.59/3.98 (1) -> (1) 9.59/3.98 9.59/3.98 This digraph is fully evaluated! 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (21) IntTRSCompressionProof (EQUIVALENT) 9.59/3.98 Compressed rules. 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (22) 9.59/3.98 Obligation: 9.59/3.98 Rules: 9.59/3.98 f362_0_main_Load(x2:0, cons_0) -> f362_0_main_Load(x2:0 - 1, 0) :|: x2:0 > 0 && cons_0 = 0 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (23) TempFilterProof (SOUND) 9.59/3.98 Used the following sort dictionary for filtering: 9.59/3.98 f362_0_main_Load(INTEGER, VARIABLE) 9.59/3.98 Replaced non-predefined constructor symbols by 0. 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (24) 9.59/3.98 Obligation: 9.59/3.98 Rules: 9.59/3.98 f362_0_main_Load(x2:0, c) -> f362_0_main_Load(c1, c2) :|: c2 = 0 && (c1 = x2:0 - 1 && c = 0) && (x2:0 > 0 && cons_0 = 0) 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (25) PolynomialOrderProcessor (EQUIVALENT) 9.59/3.98 Found the following polynomial interpretation: 9.59/3.98 [f362_0_main_Load(x, x1)] = x + c1*x1 9.59/3.98 9.59/3.98 The following rules are decreasing: 9.59/3.98 f362_0_main_Load(x2:0, c) -> f362_0_main_Load(c1, c2) :|: c2 = 0 && (c1 = x2:0 - 1 && c = 0) && (x2:0 > 0 && cons_0 = 0) 9.59/3.98 The following rules are bounded: 9.59/3.98 f362_0_main_Load(x2:0, c) -> f362_0_main_Load(c1, c2) :|: c2 = 0 && (c1 = x2:0 - 1 && c = 0) && (x2:0 > 0 && cons_0 = 0) 9.59/3.98 9.59/3.98 ---------------------------------------- 9.59/3.98 9.59/3.98 (26) 9.59/3.98 YES 9.86/4.02 EOF