6.48/2.51 YES 6.48/2.51 proof of /export/starexec/sandbox/benchmark/theBenchmark.jar 6.48/2.51 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 6.48/2.51 6.48/2.51 6.48/2.51 termination of the given Bare JBC problem could be proven: 6.48/2.51 6.48/2.51 (0) Bare JBC problem 6.48/2.51 (1) BareJBCToJBCProof [EQUIVALENT, 96 ms] 6.48/2.51 (2) JBC problem 6.48/2.51 (3) JBCToGraph [EQUIVALENT, 402 ms] 6.48/2.51 (4) JBCTerminationGraph 6.48/2.51 (5) TerminationGraphToSCCProof [SOUND, 0 ms] 6.48/2.51 (6) JBCTerminationSCC 6.48/2.51 (7) SCCToIRSProof [SOUND, 133 ms] 6.48/2.51 (8) IRSwT 6.48/2.51 (9) IRSFormatTransformerProof [EQUIVALENT, 0 ms] 6.48/2.51 (10) IRSwT 6.48/2.51 (11) IRSwTTerminationDigraphProof [EQUIVALENT, 0 ms] 6.48/2.51 (12) IRSwT 6.48/2.51 (13) IntTRSCompressionProof [EQUIVALENT, 0 ms] 6.48/2.51 (14) IRSwT 6.48/2.51 (15) TempFilterProof [SOUND, 39 ms] 6.48/2.51 (16) IntTRS 6.48/2.51 (17) RankingReductionPairProof [EQUIVALENT, 22 ms] 6.48/2.51 (18) YES 6.48/2.51 6.48/2.51 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (0) 6.48/2.51 Obligation: 6.48/2.51 need to prove termination of the following program: 6.48/2.51 /** 6.48/2.51 * Example taken from "A Term Rewriting Approach to the Automated Termination 6.48/2.51 * Analysis of Imperative Programs" (http://www.cs.unm.edu/~spf/papers/2009-02.pdf) 6.48/2.51 * and converted to Java. 6.48/2.51 */ 6.48/2.51 6.48/2.51 public class PastaB15 { 6.48/2.51 public static void main(String[] args) { 6.48/2.51 Random.args = args; 6.48/2.51 int x = Random.random(); 6.48/2.51 int y = Random.random(); 6.48/2.51 int z = Random.random(); 6.48/2.51 6.48/2.51 while (x == y && x > z) { 6.48/2.51 while (y > z) { 6.48/2.51 x--; 6.48/2.51 y--; 6.48/2.51 } 6.48/2.51 } 6.48/2.51 } 6.48/2.51 } 6.48/2.51 6.48/2.51 6.48/2.51 public class Random { 6.48/2.51 static String[] args; 6.48/2.51 static int index = 0; 6.48/2.51 6.48/2.51 public static int random() { 6.48/2.51 String string = args[index]; 6.48/2.51 index++; 6.48/2.51 return string.length(); 6.48/2.51 } 6.48/2.51 } 6.48/2.51 6.48/2.51 6.48/2.51 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (1) BareJBCToJBCProof (EQUIVALENT) 6.48/2.51 initialized classpath 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (2) 6.48/2.51 Obligation: 6.48/2.51 need to prove termination of the following program: 6.48/2.51 /** 6.48/2.51 * Example taken from "A Term Rewriting Approach to the Automated Termination 6.48/2.51 * Analysis of Imperative Programs" (http://www.cs.unm.edu/~spf/papers/2009-02.pdf) 6.48/2.51 * and converted to Java. 6.48/2.51 */ 6.48/2.51 6.48/2.51 public class PastaB15 { 6.48/2.51 public static void main(String[] args) { 6.48/2.51 Random.args = args; 6.48/2.51 int x = Random.random(); 6.48/2.51 int y = Random.random(); 6.48/2.51 int z = Random.random(); 6.48/2.51 6.48/2.51 while (x == y && x > z) { 6.48/2.51 while (y > z) { 6.48/2.51 x--; 6.48/2.51 y--; 6.48/2.51 } 6.48/2.51 } 6.48/2.51 } 6.48/2.51 } 6.48/2.51 6.48/2.51 6.48/2.51 public class Random { 6.48/2.51 static String[] args; 6.48/2.51 static int index = 0; 6.48/2.51 6.48/2.51 public static int random() { 6.48/2.51 String string = args[index]; 6.48/2.51 index++; 6.48/2.51 return string.length(); 6.48/2.51 } 6.48/2.51 } 6.48/2.51 6.48/2.51 6.48/2.51 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (3) JBCToGraph (EQUIVALENT) 6.48/2.51 Constructed TerminationGraph. 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (4) 6.48/2.51 Obligation: 6.48/2.51 Termination Graph based on JBC Program: 6.48/2.51 PastaB15.main([Ljava/lang/String;)V: Graph of 257 nodes with 1 SCC. 6.48/2.51 6.48/2.51 6.48/2.51 6.48/2.51 6.48/2.51 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (5) TerminationGraphToSCCProof (SOUND) 6.48/2.51 Splitted TerminationGraph to 1 SCCs. 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (6) 6.48/2.51 Obligation: 6.48/2.51 SCC of termination graph based on JBC Program. 6.48/2.51 SCC contains nodes from the following methods: PastaB15.main([Ljava/lang/String;)V 6.48/2.51 SCC calls the following helper methods: 6.48/2.51 Performed SCC analyses: 6.48/2.51 *Used field analysis yielded the following read fields: 6.48/2.51 6.48/2.51 *Marker field analysis yielded the following relations that could be markers: 6.48/2.51 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (7) SCCToIRSProof (SOUND) 6.48/2.51 Transformed FIGraph SCCs to intTRSs. Log: 6.48/2.51 Generated rules. Obtained 21 IRulesP rules: 6.48/2.51 f605_0_main_Load(EOS(STATIC_605), i97, i98, i71, i97) -> f607_0_main_NE(EOS(STATIC_607), i97, i98, i71, i97, i98) :|: TRUE 6.48/2.51 f607_0_main_NE(EOS(STATIC_607), i98, i98, i71, i98, i98) -> f610_0_main_NE(EOS(STATIC_610), i98, i98, i71, i98, i98) :|: i97 = i98 6.48/2.51 f610_0_main_NE(EOS(STATIC_610), i98, i98, i71, i98, i98) -> f613_0_main_Load(EOS(STATIC_613), i98, i98, i71) :|: TRUE 6.48/2.51 f613_0_main_Load(EOS(STATIC_613), i98, i98, i71) -> f615_0_main_Load(EOS(STATIC_615), i98, i98, i71, i98) :|: TRUE 6.48/2.51 f615_0_main_Load(EOS(STATIC_615), i98, i98, i71, i98) -> f618_0_main_LE(EOS(STATIC_618), i98, i98, i71, i98, i71) :|: TRUE 6.48/2.51 f618_0_main_LE(EOS(STATIC_618), i98, i98, i71, i98, i71) -> f624_0_main_LE(EOS(STATIC_624), i98, i98, i71, i98, i71) :|: i98 > i71 6.48/2.51 f624_0_main_LE(EOS(STATIC_624), i98, i98, i71, i98, i71) -> f629_0_main_Load(EOS(STATIC_629), i98, i98, i71) :|: i98 > i71 6.48/2.51 f629_0_main_Load(EOS(STATIC_629), i98, i98, i71) -> f655_0_main_Load(EOS(STATIC_655), i98, i98, i71) :|: TRUE 6.48/2.51 f655_0_main_Load(EOS(STATIC_655), i105, i106, i71) -> f696_0_main_Load(EOS(STATIC_696), i105, i106, i71) :|: TRUE 6.48/2.51 f696_0_main_Load(EOS(STATIC_696), i115, i116, i71) -> f697_0_main_Load(EOS(STATIC_697), i115, i116, i71, i116) :|: TRUE 6.48/2.51 f697_0_main_Load(EOS(STATIC_697), i115, i116, i71, i116) -> f698_0_main_LE(EOS(STATIC_698), i115, i116, i71, i116, i71) :|: TRUE 6.48/2.51 f698_0_main_LE(EOS(STATIC_698), i115, i116, i71, i116, i71) -> f699_0_main_LE(EOS(STATIC_699), i115, i116, i71, i116, i71) :|: i116 <= i71 6.48/2.51 f698_0_main_LE(EOS(STATIC_698), i115, i116, i71, i116, i71) -> f700_0_main_LE(EOS(STATIC_700), i115, i116, i71, i116, i71) :|: i116 > i71 6.48/2.51 f699_0_main_LE(EOS(STATIC_699), i115, i116, i71, i116, i71) -> f701_0_main_Load(EOS(STATIC_701), i115, i116, i71) :|: i116 <= i71 6.48/2.51 f701_0_main_Load(EOS(STATIC_701), i115, i116, i71) -> f604_0_main_Load(EOS(STATIC_604), i115, i116, i71) :|: TRUE 6.48/2.51 f604_0_main_Load(EOS(STATIC_604), i97, i98, i71) -> f605_0_main_Load(EOS(STATIC_605), i97, i98, i71, i97) :|: TRUE 6.48/2.51 f700_0_main_LE(EOS(STATIC_700), i115, i116, i71, i116, i71) -> f704_0_main_Inc(EOS(STATIC_704), i115, i116, i71) :|: i116 > i71 6.48/2.51 f704_0_main_Inc(EOS(STATIC_704), i115, i116, i71) -> f705_0_main_Inc(EOS(STATIC_705), i115 + -1, i116, i71) :|: TRUE 6.48/2.51 f705_0_main_Inc(EOS(STATIC_705), i123, i116, i71) -> f706_0_main_JMP(EOS(STATIC_706), i123, i116 + -1, i71) :|: TRUE 6.48/2.51 f706_0_main_JMP(EOS(STATIC_706), i123, i124, i71) -> f715_0_main_Load(EOS(STATIC_715), i123, i124, i71) :|: TRUE 6.48/2.51 f715_0_main_Load(EOS(STATIC_715), i123, i124, i71) -> f696_0_main_Load(EOS(STATIC_696), i123, i124, i71) :|: TRUE 6.48/2.51 Combined rules. Obtained 1 IRulesP rules: 6.48/2.51 f698_0_main_LE(EOS(STATIC_698), i115:0, i116:0, i71:0, i116:0, i71:0) -> f698_0_main_LE(EOS(STATIC_698), i115:0 - 1, i116:0 - 1, i71:0, i116:0 - 1, i71:0) :|: i71:0 < i116:0 6.48/2.51 Filtered constant ground arguments: 6.48/2.51 f698_0_main_LE(x1, x2, x3, x4, x5, x6) -> f698_0_main_LE(x2, x3, x4, x5, x6) 6.48/2.51 EOS(x1) -> EOS 6.48/2.51 Filtered duplicate arguments: 6.48/2.51 f698_0_main_LE(x1, x2, x3, x4, x5) -> f698_0_main_LE(x1, x4, x5) 6.48/2.51 Filtered unneeded arguments: 6.48/2.51 f698_0_main_LE(x1, x2, x3) -> f698_0_main_LE(x2, x3) 6.48/2.51 Finished conversion. Obtained 1 rules.P rules: 6.48/2.51 f698_0_main_LE(i116:0, i71:0) -> f698_0_main_LE(i116:0 - 1, i71:0) :|: i71:0 < i116:0 6.48/2.51 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (8) 6.48/2.51 Obligation: 6.48/2.51 Rules: 6.48/2.51 f698_0_main_LE(i116:0, i71:0) -> f698_0_main_LE(i116:0 - 1, i71:0) :|: i71:0 < i116:0 6.48/2.51 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (9) IRSFormatTransformerProof (EQUIVALENT) 6.48/2.51 Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (10) 6.48/2.51 Obligation: 6.48/2.51 Rules: 6.48/2.51 f698_0_main_LE(i116:0, i71:0) -> f698_0_main_LE(arith, i71:0) :|: i71:0 < i116:0 && arith = i116:0 - 1 6.48/2.51 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (11) IRSwTTerminationDigraphProof (EQUIVALENT) 6.48/2.51 Constructed termination digraph! 6.48/2.51 Nodes: 6.48/2.51 (1) f698_0_main_LE(i116:0, i71:0) -> f698_0_main_LE(arith, i71:0) :|: i71:0 < i116:0 && arith = i116:0 - 1 6.48/2.51 6.48/2.51 Arcs: 6.48/2.51 (1) -> (1) 6.48/2.51 6.48/2.51 This digraph is fully evaluated! 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (12) 6.48/2.51 Obligation: 6.48/2.51 6.48/2.51 Termination digraph: 6.48/2.51 Nodes: 6.48/2.51 (1) f698_0_main_LE(i116:0, i71:0) -> f698_0_main_LE(arith, i71:0) :|: i71:0 < i116:0 && arith = i116:0 - 1 6.48/2.51 6.48/2.51 Arcs: 6.48/2.51 (1) -> (1) 6.48/2.51 6.48/2.51 This digraph is fully evaluated! 6.48/2.51 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (13) IntTRSCompressionProof (EQUIVALENT) 6.48/2.51 Compressed rules. 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (14) 6.48/2.51 Obligation: 6.48/2.51 Rules: 6.48/2.51 f698_0_main_LE(i116:0:0, i71:0:0) -> f698_0_main_LE(i116:0:0 - 1, i71:0:0) :|: i71:0:0 < i116:0:0 6.48/2.51 6.48/2.51 ---------------------------------------- 6.48/2.51 6.48/2.51 (15) TempFilterProof (SOUND) 6.48/2.51 Used the following sort dictionary for filtering: 6.48/2.51 f698_0_main_LE(INTEGER, INTEGER) 6.48/2.51 Replaced non-predefined constructor symbols by 0. 6.48/2.52 ---------------------------------------- 6.48/2.52 6.48/2.52 (16) 6.48/2.52 Obligation: 6.48/2.52 Rules: 6.48/2.52 f698_0_main_LE(i116:0:0, i71:0:0) -> f698_0_main_LE(c, i71:0:0) :|: c = i116:0:0 - 1 && i71:0:0 < i116:0:0 6.48/2.52 6.48/2.52 ---------------------------------------- 6.48/2.52 6.48/2.52 (17) RankingReductionPairProof (EQUIVALENT) 6.48/2.52 Interpretation: 6.48/2.52 [ f698_0_main_LE ] = -1*f698_0_main_LE_2 + f698_0_main_LE_1 6.48/2.52 6.48/2.52 The following rules are decreasing: 6.48/2.52 f698_0_main_LE(i116:0:0, i71:0:0) -> f698_0_main_LE(c, i71:0:0) :|: c = i116:0:0 - 1 && i71:0:0 < i116:0:0 6.48/2.52 6.48/2.52 The following rules are bounded: 6.48/2.52 f698_0_main_LE(i116:0:0, i71:0:0) -> f698_0_main_LE(c, i71:0:0) :|: c = i116:0:0 - 1 && i71:0:0 < i116:0:0 6.48/2.52 6.48/2.52 6.48/2.52 ---------------------------------------- 6.48/2.52 6.48/2.52 (18) 6.48/2.52 YES 6.52/2.55 EOF