6.66/2.66 YES 6.66/2.68 proof of /export/starexec/sandbox/benchmark/theBenchmark.jar 6.66/2.68 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 6.66/2.68 6.66/2.68 6.66/2.68 termination of the given Bare JBC problem could be proven: 6.66/2.68 6.66/2.68 (0) Bare JBC problem 6.66/2.68 (1) BareJBCToJBCProof [EQUIVALENT, 96 ms] 6.66/2.68 (2) JBC problem 6.66/2.68 (3) JBCToGraph [EQUIVALENT, 321 ms] 6.66/2.68 (4) JBCTerminationGraph 6.66/2.68 (5) TerminationGraphToSCCProof [SOUND, 0 ms] 6.66/2.68 (6) JBCTerminationSCC 6.66/2.68 (7) SCCToIRSProof [SOUND, 109 ms] 6.66/2.68 (8) IRSwT 6.66/2.68 (9) IRSFormatTransformerProof [EQUIVALENT, 0 ms] 6.66/2.68 (10) IRSwT 6.66/2.68 (11) IRSwTTerminationDigraphProof [EQUIVALENT, 22 ms] 6.66/2.68 (12) IRSwT 6.66/2.68 (13) IntTRSCompressionProof [EQUIVALENT, 0 ms] 6.66/2.68 (14) IRSwT 6.66/2.68 (15) FilterProof [EQUIVALENT, 0 ms] 6.66/2.68 (16) IntTRS 6.66/2.68 (17) IntTRSCompressionProof [EQUIVALENT, 0 ms] 6.66/2.68 (18) IntTRS 6.66/2.68 (19) PolynomialOrderProcessor [EQUIVALENT, 0 ms] 6.66/2.68 (20) YES 6.66/2.68 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (0) 6.66/2.68 Obligation: 6.66/2.68 need to prove termination of the following program: 6.66/2.68 public class LogIterative { 6.66/2.68 public static int log(int x, int y) { 6.66/2.68 int res = 0; 6.66/2.68 while (x >= y && y > 1) { 6.66/2.68 res++; 6.66/2.68 x = x/y; 6.66/2.68 } 6.66/2.68 return res; 6.66/2.68 } 6.66/2.68 6.66/2.68 public static void main(String[] args) { 6.66/2.68 Random.args = args; 6.66/2.68 int x = Random.random(); 6.66/2.68 int y = Random.random(); 6.66/2.68 log(x, y); 6.66/2.68 } 6.66/2.68 } 6.66/2.68 6.66/2.68 6.66/2.68 public class Random { 6.66/2.68 static String[] args; 6.66/2.68 static int index = 0; 6.66/2.68 6.66/2.68 public static int random() { 6.66/2.68 String string = args[index]; 6.66/2.68 index++; 6.66/2.68 return string.length(); 6.66/2.68 } 6.66/2.68 } 6.66/2.68 6.66/2.68 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (1) BareJBCToJBCProof (EQUIVALENT) 6.66/2.68 initialized classpath 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (2) 6.66/2.68 Obligation: 6.66/2.68 need to prove termination of the following program: 6.66/2.68 public class LogIterative { 6.66/2.68 public static int log(int x, int y) { 6.66/2.68 int res = 0; 6.66/2.68 while (x >= y && y > 1) { 6.66/2.68 res++; 6.66/2.68 x = x/y; 6.66/2.68 } 6.66/2.68 return res; 6.66/2.68 } 6.66/2.68 6.66/2.68 public static void main(String[] args) { 6.66/2.68 Random.args = args; 6.66/2.68 int x = Random.random(); 6.66/2.68 int y = Random.random(); 6.66/2.68 log(x, y); 6.66/2.68 } 6.66/2.68 } 6.66/2.68 6.66/2.68 6.66/2.68 public class Random { 6.66/2.68 static String[] args; 6.66/2.68 static int index = 0; 6.66/2.68 6.66/2.68 public static int random() { 6.66/2.68 String string = args[index]; 6.66/2.68 index++; 6.66/2.68 return string.length(); 6.66/2.68 } 6.66/2.68 } 6.66/2.68 6.66/2.68 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (3) JBCToGraph (EQUIVALENT) 6.66/2.68 Constructed TerminationGraph. 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (4) 6.66/2.68 Obligation: 6.66/2.68 Termination Graph based on JBC Program: 6.66/2.68 LogIterative.main([Ljava/lang/String;)V: Graph of 195 nodes with 1 SCC. 6.66/2.68 6.66/2.68 6.66/2.68 6.66/2.68 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (5) TerminationGraphToSCCProof (SOUND) 6.66/2.68 Splitted TerminationGraph to 1 SCCs. 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (6) 6.66/2.68 Obligation: 6.66/2.68 SCC of termination graph based on JBC Program. 6.66/2.68 SCC contains nodes from the following methods: LogIterative.main([Ljava/lang/String;)V 6.66/2.68 SCC calls the following helper methods: 6.66/2.68 Performed SCC analyses: 6.66/2.68 *Used field analysis yielded the following read fields: 6.66/2.68 6.66/2.68 *Marker field analysis yielded the following relations that could be markers: 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (7) SCCToIRSProof (SOUND) 6.66/2.68 Transformed FIGraph SCCs to intTRSs. Log: 6.66/2.68 Generated rules. Obtained 15 IRulesP rules: 6.66/2.68 f595_0_log_Load(EOS(STATIC_595), i92, i93, i92) -> f596_0_log_LT(EOS(STATIC_596), i92, i93, i92, i93) :|: TRUE 6.66/2.68 f596_0_log_LT(EOS(STATIC_596), i92, i93, i92, i93) -> f601_0_log_LT(EOS(STATIC_601), i92, i93, i92, i93) :|: i92 >= i93 6.66/2.68 f601_0_log_LT(EOS(STATIC_601), i92, i93, i92, i93) -> f608_0_log_Load(EOS(STATIC_608), i92, i93) :|: i92 >= i93 6.66/2.68 f608_0_log_Load(EOS(STATIC_608), i92, i93) -> f612_0_log_ConstantStackPush(EOS(STATIC_612), i92, i93, i93) :|: TRUE 6.66/2.68 f612_0_log_ConstantStackPush(EOS(STATIC_612), i92, i93, i93) -> f617_0_log_LE(EOS(STATIC_617), i92, i93, i93, 1) :|: TRUE 6.66/2.68 f617_0_log_LE(EOS(STATIC_617), i104, i103, i103, matching1) -> f625_0_log_LE(EOS(STATIC_625), i104, i103, i103, 1) :|: TRUE && matching1 = 1 6.66/2.68 f625_0_log_LE(EOS(STATIC_625), i104, i103, i103, matching1) -> f643_0_log_Inc(EOS(STATIC_643), i104, i103) :|: i103 > 1 && matching1 = 1 6.66/2.68 f643_0_log_Inc(EOS(STATIC_643), i104, i103) -> f646_0_log_Load(EOS(STATIC_646), i104, i103) :|: TRUE 6.66/2.68 f646_0_log_Load(EOS(STATIC_646), i104, i103) -> f648_0_log_Load(EOS(STATIC_648), i103, i104) :|: TRUE 6.66/2.68 f648_0_log_Load(EOS(STATIC_648), i103, i104) -> f649_0_log_IntArithmetic(EOS(STATIC_649), i103, i104, i103) :|: TRUE 6.66/2.68 f649_0_log_IntArithmetic(EOS(STATIC_649), i103, i104, i103) -> f650_0_log_Store(EOS(STATIC_650), i103, i107) :|: i107 = i104 / i103 && i104 > 1 && i103 > 1 && i107 < i104 6.66/2.68 f650_0_log_Store(EOS(STATIC_650), i103, i107) -> f651_0_log_JMP(EOS(STATIC_651), i107, i103) :|: TRUE 6.66/2.68 f651_0_log_JMP(EOS(STATIC_651), i107, i103) -> f673_0_log_Load(EOS(STATIC_673), i107, i103) :|: TRUE 6.66/2.68 f673_0_log_Load(EOS(STATIC_673), i107, i103) -> f592_0_log_Load(EOS(STATIC_592), i107, i103) :|: TRUE 6.66/2.68 f592_0_log_Load(EOS(STATIC_592), i92, i93) -> f595_0_log_Load(EOS(STATIC_595), i92, i93, i92) :|: TRUE 6.66/2.68 Combined rules. Obtained 2 IRulesP rules: 6.66/2.68 f595_0_log_Load(EOS(STATIC_595), i92:0, i93:0, i92:0) -> f595_0_log_Load'(EOS(STATIC_595), i92:0, i93:0, i92:0) :|: i93:0 <= i92:0 && i93:0 > 1 && i92:0 > 1 && i92:0 > div 6.66/2.68 f595_0_log_Load'(EOS(STATIC_595), i92:0, i93:0, i92:0) -> f595_0_log_Load(EOS(STATIC_595), div, i93:0, div) :|: i93:0 <= i92:0 && i93:0 > 1 && i92:0 > 1 && i92:0 > div && i93:0 > i92:0 - i93:0 * div && i92:0 - i93:0 * div + i93:0 > 0 6.66/2.68 Filtered constant ground arguments: 6.66/2.68 f595_0_log_Load(x1, x2, x3, x4) -> f595_0_log_Load(x2, x3, x4) 6.66/2.68 f595_0_log_Load'(x1, x2, x3, x4) -> f595_0_log_Load'(x2, x3, x4) 6.66/2.68 EOS(x1) -> EOS 6.66/2.68 Filtered duplicate arguments: 6.66/2.68 f595_0_log_Load(x1, x2, x3) -> f595_0_log_Load(x2, x3) 6.66/2.68 f595_0_log_Load'(x1, x2, x3) -> f595_0_log_Load'(x2, x3) 6.66/2.68 Finished conversion. Obtained 2 rules.P rules: 6.66/2.68 f595_0_log_Load(i93:0, i92:0) -> f595_0_log_Load'(i93:0, i92:0) :|: i93:0 > 1 && i93:0 <= i92:0 && i92:0 > div && i92:0 > 1 6.66/2.68 f595_0_log_Load'(i93:0, i92:0) -> f595_0_log_Load(i93:0, div) :|: i93:0 > 1 && i93:0 <= i92:0 && i92:0 > 1 && i92:0 > div && i92:0 - i93:0 * div + i93:0 > 0 && i93:0 > i92:0 - i93:0 * div 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (8) 6.66/2.68 Obligation: 6.66/2.68 Rules: 6.66/2.68 f595_0_log_Load(x, x1) -> f595_0_log_Load'(x, x1) :|: x > 1 && x <= x1 && x1 > x2 && x1 > 1 6.66/2.68 f595_0_log_Load'(x3, x4) -> f595_0_log_Load(x3, x5) :|: x3 > 1 && x3 <= x4 && x4 > 1 && x4 > x5 && x4 - x3 * x5 + x3 > 0 && x3 > x4 - x3 * x5 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (9) IRSFormatTransformerProof (EQUIVALENT) 6.66/2.68 Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (10) 6.66/2.68 Obligation: 6.66/2.68 Rules: 6.66/2.68 f595_0_log_Load(x, x1) -> f595_0_log_Load'(x, x1) :|: x > 1 && x <= x1 && x1 > x2 && x1 > 1 6.66/2.68 f595_0_log_Load'(x3, x4) -> f595_0_log_Load(x3, x5) :|: x3 > 1 && x3 <= x4 && x4 > 1 && x4 > x5 && x4 - x3 * x5 + x3 > 0 && x3 > x4 - x3 * x5 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (11) IRSwTTerminationDigraphProof (EQUIVALENT) 6.66/2.68 Constructed termination digraph! 6.66/2.68 Nodes: 6.66/2.68 (1) f595_0_log_Load(x, x1) -> f595_0_log_Load'(x, x1) :|: x > 1 && x <= x1 && x1 > x2 && x1 > 1 6.66/2.68 (2) f595_0_log_Load'(x3, x4) -> f595_0_log_Load(x3, x5) :|: x3 > 1 && x3 <= x4 && x4 > 1 && x4 > x5 && x4 - x3 * x5 + x3 > 0 && x3 > x4 - x3 * x5 6.66/2.68 6.66/2.68 Arcs: 6.66/2.68 (1) -> (2) 6.66/2.68 (2) -> (1) 6.66/2.68 6.66/2.68 This digraph is fully evaluated! 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (12) 6.66/2.68 Obligation: 6.66/2.68 6.66/2.68 Termination digraph: 6.66/2.68 Nodes: 6.66/2.68 (1) f595_0_log_Load(x, x1) -> f595_0_log_Load'(x, x1) :|: x > 1 && x <= x1 && x1 > x2 && x1 > 1 6.66/2.68 (2) f595_0_log_Load'(x3, x4) -> f595_0_log_Load(x3, x5) :|: x3 > 1 && x3 <= x4 && x4 > 1 && x4 > x5 && x4 - x3 * x5 + x3 > 0 && x3 > x4 - x3 * x5 6.66/2.68 6.66/2.68 Arcs: 6.66/2.68 (1) -> (2) 6.66/2.68 (2) -> (1) 6.66/2.68 6.66/2.68 This digraph is fully evaluated! 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (13) IntTRSCompressionProof (EQUIVALENT) 6.66/2.68 Compressed rules. 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (14) 6.66/2.68 Obligation: 6.66/2.68 Rules: 6.66/2.68 f595_0_log_Load(x:0, x1:0) -> f595_0_log_Load(x:0, x5:0) :|: x:0 > x1:0 - x:0 * x5:0 && x2:0 < x1:0 && x1:0 - x:0 * x5:0 + x:0 > 0 && x5:0 < x1:0 && x1:0 > 1 && x:0 <= x1:0 && x:0 > 1 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (15) FilterProof (EQUIVALENT) 6.66/2.68 Used the following sort dictionary for filtering: 6.66/2.68 f595_0_log_Load(INTEGER, INTEGER) 6.66/2.68 Replaced non-predefined constructor symbols by 0. 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (16) 6.66/2.68 Obligation: 6.66/2.68 Rules: 6.66/2.68 f595_0_log_Load(x:0, x1:0) -> f595_0_log_Load(x:0, x5:0) :|: x:0 > x1:0 - x:0 * x5:0 && x2:0 < x1:0 && x1:0 - x:0 * x5:0 + x:0 > 0 && x5:0 < x1:0 && x1:0 > 1 && x:0 <= x1:0 && x:0 > 1 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (17) IntTRSCompressionProof (EQUIVALENT) 6.66/2.68 Compressed rules. 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (18) 6.66/2.68 Obligation: 6.66/2.68 Rules: 6.66/2.68 f595_0_log_Load(x:0:0, x1:0:0) -> f595_0_log_Load(x:0:0, x5:0:0) :|: x:0:0 <= x1:0:0 && x:0:0 > 1 && x1:0:0 > 1 && x5:0:0 < x1:0:0 && x1:0:0 - x:0:0 * x5:0:0 + x:0:0 > 0 && x2:0:0 < x1:0:0 && x:0:0 > x1:0:0 - x:0:0 * x5:0:0 6.66/2.68 6.66/2.68 ---------------------------------------- 6.66/2.68 6.66/2.68 (19) PolynomialOrderProcessor (EQUIVALENT) 6.66/2.68 Found the following polynomial interpretation: 6.66/2.68 [f595_0_log_Load(x, x1)] = x1 6.66/2.68 6.66/2.68 The following rules are decreasing: 6.66/2.68 f595_0_log_Load(x:0:0, x1:0:0) -> f595_0_log_Load(x:0:0, x5:0:0) :|: x:0:0 <= x1:0:0 && x:0:0 > 1 && x1:0:0 > 1 && x5:0:0 < x1:0:0 && x1:0:0 - x:0:0 * x5:0:0 + x:0:0 > 0 && x2:0:0 < x1:0:0 && x:0:0 > x1:0:0 - x:0:0 * x5:0:0 6.95/2.68 The following rules are bounded: 6.95/2.68 f595_0_log_Load(x:0:0, x1:0:0) -> f595_0_log_Load(x:0:0, x5:0:0) :|: x:0:0 <= x1:0:0 && x:0:0 > 1 && x1:0:0 > 1 && x5:0:0 < x1:0:0 && x1:0:0 - x:0:0 * x5:0:0 + x:0:0 > 0 && x2:0:0 < x1:0:0 && x:0:0 > x1:0:0 - x:0:0 * x5:0:0 6.95/2.68 6.95/2.68 ---------------------------------------- 6.95/2.68 6.95/2.68 (20) 6.95/2.68 YES 6.95/2.71 EOF