8.09/3.11 YES 8.09/3.12 proof of /export/starexec/sandbox/benchmark/theBenchmark.jar 8.09/3.12 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 8.09/3.12 8.09/3.12 8.09/3.12 termination of the given Bare JBC problem could be proven: 8.09/3.12 8.09/3.12 (0) Bare JBC problem 8.09/3.12 (1) BareJBCToJBCProof [EQUIVALENT, 96 ms] 8.09/3.12 (2) JBC problem 8.09/3.12 (3) JBCToGraph [EQUIVALENT, 439 ms] 8.09/3.12 (4) JBCTerminationGraph 8.09/3.12 (5) TerminationGraphToSCCProof [SOUND, 0 ms] 8.09/3.12 (6) JBCTerminationSCC 8.09/3.12 (7) SCCToIRSProof [SOUND, 103 ms] 8.09/3.12 (8) IRSwT 8.09/3.12 (9) IRSFormatTransformerProof [EQUIVALENT, 0 ms] 8.09/3.12 (10) IRSwT 8.09/3.12 (11) IRSwTTerminationDigraphProof [EQUIVALENT, 36 ms] 8.09/3.12 (12) IRSwT 8.09/3.12 (13) IntTRSCompressionProof [EQUIVALENT, 0 ms] 8.09/3.12 (14) IRSwT 8.09/3.12 (15) TempFilterProof [SOUND, 49 ms] 8.09/3.12 (16) IntTRS 8.09/3.12 (17) PolynomialOrderProcessor [EQUIVALENT, 0 ms] 8.09/3.12 (18) IntTRS 8.09/3.12 (19) PolynomialOrderProcessor [EQUIVALENT, 0 ms] 8.09/3.12 (20) YES 8.09/3.12 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (0) 8.09/3.12 Obligation: 8.09/3.12 need to prove termination of the following program: 8.09/3.12 /** 8.09/3.12 * Example taken from "A Term Rewriting Approach to the Automated Termination 8.09/3.12 * Analysis of Imperative Programs" (http://www.cs.unm.edu/~spf/papers/2009-02.pdf) 8.09/3.12 * and converted to Java. 8.09/3.12 */ 8.09/3.12 8.09/3.12 public class PastaC3 { 8.09/3.12 public static void main(String[] args) { 8.09/3.12 Random.args = args; 8.09/3.12 int x = Random.random(); 8.09/3.12 int y = Random.random(); 8.09/3.12 int z = Random.random(); 8.09/3.12 8.09/3.12 while (x < y) { 8.09/3.12 if (x < z) { 8.09/3.12 x++; 8.09/3.12 } else { 8.09/3.12 z++; 8.09/3.12 } 8.09/3.12 } 8.09/3.12 } 8.09/3.12 } 8.09/3.12 8.09/3.12 8.09/3.12 public class Random { 8.09/3.12 static String[] args; 8.09/3.12 static int index = 0; 8.09/3.12 8.09/3.12 public static int random() { 8.09/3.12 String string = args[index]; 8.09/3.12 index++; 8.09/3.12 return string.length(); 8.09/3.12 } 8.09/3.12 } 8.09/3.12 8.09/3.12 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (1) BareJBCToJBCProof (EQUIVALENT) 8.09/3.12 initialized classpath 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (2) 8.09/3.12 Obligation: 8.09/3.12 need to prove termination of the following program: 8.09/3.12 /** 8.09/3.12 * Example taken from "A Term Rewriting Approach to the Automated Termination 8.09/3.12 * Analysis of Imperative Programs" (http://www.cs.unm.edu/~spf/papers/2009-02.pdf) 8.09/3.12 * and converted to Java. 8.09/3.12 */ 8.09/3.12 8.09/3.12 public class PastaC3 { 8.09/3.12 public static void main(String[] args) { 8.09/3.12 Random.args = args; 8.09/3.12 int x = Random.random(); 8.09/3.12 int y = Random.random(); 8.09/3.12 int z = Random.random(); 8.09/3.12 8.09/3.12 while (x < y) { 8.09/3.12 if (x < z) { 8.09/3.12 x++; 8.09/3.12 } else { 8.09/3.12 z++; 8.09/3.12 } 8.09/3.12 } 8.09/3.12 } 8.09/3.12 } 8.09/3.12 8.09/3.12 8.09/3.12 public class Random { 8.09/3.12 static String[] args; 8.09/3.12 static int index = 0; 8.09/3.12 8.09/3.12 public static int random() { 8.09/3.12 String string = args[index]; 8.09/3.12 index++; 8.09/3.12 return string.length(); 8.09/3.12 } 8.09/3.12 } 8.09/3.12 8.09/3.12 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (3) JBCToGraph (EQUIVALENT) 8.09/3.12 Constructed TerminationGraph. 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (4) 8.09/3.12 Obligation: 8.09/3.12 Termination Graph based on JBC Program: 8.09/3.12 PastaC3.main([Ljava/lang/String;)V: Graph of 249 nodes with 1 SCC. 8.09/3.12 8.09/3.12 8.09/3.12 8.09/3.12 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (5) TerminationGraphToSCCProof (SOUND) 8.09/3.12 Splitted TerminationGraph to 1 SCCs. 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (6) 8.09/3.12 Obligation: 8.09/3.12 SCC of termination graph based on JBC Program. 8.09/3.12 SCC contains nodes from the following methods: PastaC3.main([Ljava/lang/String;)V 8.09/3.12 SCC calls the following helper methods: 8.09/3.12 Performed SCC analyses: 8.09/3.12 *Used field analysis yielded the following read fields: 8.09/3.12 8.09/3.12 *Marker field analysis yielded the following relations that could be markers: 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (7) SCCToIRSProof (SOUND) 8.09/3.12 Transformed FIGraph SCCs to intTRSs. Log: 8.09/3.12 Generated rules. Obtained 16 IRulesP rules: 8.09/3.12 f416_0_main_Load(EOS(STATIC_416), i19, i48, i71, i19) -> f419_0_main_GE(EOS(STATIC_419), i19, i48, i71, i19, i48) :|: TRUE 8.09/3.12 f419_0_main_GE(EOS(STATIC_419), i19, i48, i71, i19, i48) -> f426_0_main_GE(EOS(STATIC_426), i19, i48, i71, i19, i48) :|: i19 < i48 8.09/3.12 f426_0_main_GE(EOS(STATIC_426), i19, i48, i71, i19, i48) -> f433_0_main_Load(EOS(STATIC_433), i19, i48, i71) :|: i19 < i48 8.09/3.12 f433_0_main_Load(EOS(STATIC_433), i19, i48, i71) -> f445_0_main_Load(EOS(STATIC_445), i19, i48, i71, i19) :|: TRUE 8.09/3.12 f445_0_main_Load(EOS(STATIC_445), i19, i48, i71, i19) -> f448_0_main_GE(EOS(STATIC_448), i19, i48, i71, i19, i71) :|: TRUE 8.09/3.12 f448_0_main_GE(EOS(STATIC_448), i19, i48, i71, i19, i71) -> f455_0_main_GE(EOS(STATIC_455), i19, i48, i71, i19, i71) :|: i19 >= i71 8.09/3.12 f448_0_main_GE(EOS(STATIC_448), i19, i48, i71, i19, i71) -> f457_0_main_GE(EOS(STATIC_457), i19, i48, i71, i19, i71) :|: i19 < i71 8.09/3.12 f455_0_main_GE(EOS(STATIC_455), i19, i48, i71, i19, i71) -> f476_0_main_Inc(EOS(STATIC_476), i19, i48, i71) :|: i19 >= i71 8.09/3.12 f476_0_main_Inc(EOS(STATIC_476), i19, i48, i71) -> f483_0_main_JMP(EOS(STATIC_483), i19, i48, i71 + 1) :|: TRUE 8.09/3.12 f483_0_main_JMP(EOS(STATIC_483), i19, i48, i75) -> f513_0_main_Load(EOS(STATIC_513), i19, i48, i75) :|: TRUE 8.09/3.12 f513_0_main_Load(EOS(STATIC_513), i19, i48, i75) -> f413_0_main_Load(EOS(STATIC_413), i19, i48, i75) :|: TRUE 8.09/3.12 f413_0_main_Load(EOS(STATIC_413), i19, i48, i71) -> f416_0_main_Load(EOS(STATIC_416), i19, i48, i71, i19) :|: TRUE 8.09/3.12 f457_0_main_GE(EOS(STATIC_457), i19, i48, i71, i19, i71) -> f480_0_main_Inc(EOS(STATIC_480), i19, i48, i71) :|: i19 < i71 8.09/3.12 f480_0_main_Inc(EOS(STATIC_480), i19, i48, i71) -> f484_0_main_JMP(EOS(STATIC_484), i19 + 1, i48, i71) :|: TRUE 8.09/3.12 f484_0_main_JMP(EOS(STATIC_484), i76, i48, i71) -> f527_0_main_Load(EOS(STATIC_527), i76, i48, i71) :|: TRUE 8.09/3.12 f527_0_main_Load(EOS(STATIC_527), i76, i48, i71) -> f413_0_main_Load(EOS(STATIC_413), i76, i48, i71) :|: TRUE 8.09/3.12 Combined rules. Obtained 2 IRulesP rules: 8.09/3.12 f416_0_main_Load(EOS(STATIC_416), i19:0, i48:0, i71:0, i19:0) -> f416_0_main_Load(EOS(STATIC_416), i19:0 + 1, i48:0, i71:0, i19:0 + 1) :|: i48:0 > i19:0 && i71:0 > i19:0 8.09/3.12 f416_0_main_Load(EOS(STATIC_416), i19:0, i48:0, i71:0, i19:0) -> f416_0_main_Load(EOS(STATIC_416), i19:0, i48:0, i71:0 + 1, i19:0) :|: i48:0 > i19:0 && i71:0 <= i19:0 8.09/3.12 Filtered constant ground arguments: 8.09/3.12 f416_0_main_Load(x1, x2, x3, x4, x5) -> f416_0_main_Load(x2, x3, x4, x5) 8.09/3.12 EOS(x1) -> EOS 8.09/3.12 Filtered duplicate arguments: 8.09/3.12 f416_0_main_Load(x1, x2, x3, x4) -> f416_0_main_Load(x2, x3, x4) 8.09/3.12 Finished conversion. Obtained 2 rules.P rules: 8.09/3.12 f416_0_main_Load(i48:0, i71:0, i19:0) -> f416_0_main_Load(i48:0, i71:0, i19:0 + 1) :|: i48:0 > i19:0 && i71:0 > i19:0 8.09/3.12 f416_0_main_Load(i48:0, i71:0, i19:0) -> f416_0_main_Load(i48:0, i71:0 + 1, i19:0) :|: i48:0 > i19:0 && i71:0 <= i19:0 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (8) 8.09/3.12 Obligation: 8.09/3.12 Rules: 8.09/3.12 f416_0_main_Load(i48:0, i71:0, i19:0) -> f416_0_main_Load(i48:0, i71:0, i19:0 + 1) :|: i48:0 > i19:0 && i71:0 > i19:0 8.09/3.12 f416_0_main_Load(x, x1, x2) -> f416_0_main_Load(x, x1 + 1, x2) :|: x > x2 && x1 <= x2 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (9) IRSFormatTransformerProof (EQUIVALENT) 8.09/3.12 Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (10) 8.09/3.12 Obligation: 8.09/3.12 Rules: 8.09/3.12 f416_0_main_Load(i48:0, i71:0, i19:0) -> f416_0_main_Load(i48:0, i71:0, arith) :|: i48:0 > i19:0 && i71:0 > i19:0 && arith = i19:0 + 1 8.09/3.12 f416_0_main_Load(x3, x4, x5) -> f416_0_main_Load(x3, x6, x5) :|: x3 > x5 && x4 <= x5 && x6 = x4 + 1 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (11) IRSwTTerminationDigraphProof (EQUIVALENT) 8.09/3.12 Constructed termination digraph! 8.09/3.12 Nodes: 8.09/3.12 (1) f416_0_main_Load(i48:0, i71:0, i19:0) -> f416_0_main_Load(i48:0, i71:0, arith) :|: i48:0 > i19:0 && i71:0 > i19:0 && arith = i19:0 + 1 8.09/3.12 (2) f416_0_main_Load(x3, x4, x5) -> f416_0_main_Load(x3, x6, x5) :|: x3 > x5 && x4 <= x5 && x6 = x4 + 1 8.09/3.12 8.09/3.12 Arcs: 8.09/3.12 (1) -> (1), (2) 8.09/3.12 (2) -> (1), (2) 8.09/3.12 8.09/3.12 This digraph is fully evaluated! 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (12) 8.09/3.12 Obligation: 8.09/3.12 8.09/3.12 Termination digraph: 8.09/3.12 Nodes: 8.09/3.12 (1) f416_0_main_Load(i48:0, i71:0, i19:0) -> f416_0_main_Load(i48:0, i71:0, arith) :|: i48:0 > i19:0 && i71:0 > i19:0 && arith = i19:0 + 1 8.09/3.12 (2) f416_0_main_Load(x3, x4, x5) -> f416_0_main_Load(x3, x6, x5) :|: x3 > x5 && x4 <= x5 && x6 = x4 + 1 8.09/3.12 8.09/3.12 Arcs: 8.09/3.12 (1) -> (1), (2) 8.09/3.12 (2) -> (1), (2) 8.09/3.12 8.09/3.12 This digraph is fully evaluated! 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (13) IntTRSCompressionProof (EQUIVALENT) 8.09/3.12 Compressed rules. 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (14) 8.09/3.12 Obligation: 8.09/3.12 Rules: 8.09/3.12 f416_0_main_Load(x3:0, x4:0, x5:0) -> f416_0_main_Load(x3:0, x4:0 + 1, x5:0) :|: x5:0 < x3:0 && x5:0 >= x4:0 8.09/3.12 f416_0_main_Load(i48:0:0, i71:0:0, i19:0:0) -> f416_0_main_Load(i48:0:0, i71:0:0, i19:0:0 + 1) :|: i48:0:0 > i19:0:0 && i71:0:0 > i19:0:0 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (15) TempFilterProof (SOUND) 8.09/3.12 Used the following sort dictionary for filtering: 8.09/3.12 f416_0_main_Load(INTEGER, INTEGER, INTEGER) 8.09/3.12 Replaced non-predefined constructor symbols by 0. 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (16) 8.09/3.12 Obligation: 8.09/3.12 Rules: 8.09/3.12 f416_0_main_Load(x3:0, x4:0, x5:0) -> f416_0_main_Load(x3:0, c, x5:0) :|: c = x4:0 + 1 && (x5:0 < x3:0 && x5:0 >= x4:0) 8.09/3.12 f416_0_main_Load(i48:0:0, i71:0:0, i19:0:0) -> f416_0_main_Load(i48:0:0, i71:0:0, c1) :|: c1 = i19:0:0 + 1 && (i48:0:0 > i19:0:0 && i71:0:0 > i19:0:0) 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (17) PolynomialOrderProcessor (EQUIVALENT) 8.09/3.12 Found the following polynomial interpretation: 8.09/3.12 [f416_0_main_Load(x, x1, x2)] = -1 + x - x2 8.09/3.12 8.09/3.12 The following rules are decreasing: 8.09/3.12 f416_0_main_Load(i48:0:0, i71:0:0, i19:0:0) -> f416_0_main_Load(i48:0:0, i71:0:0, c1) :|: c1 = i19:0:0 + 1 && (i48:0:0 > i19:0:0 && i71:0:0 > i19:0:0) 8.09/3.12 The following rules are bounded: 8.09/3.12 f416_0_main_Load(i48:0:0, i71:0:0, i19:0:0) -> f416_0_main_Load(i48:0:0, i71:0:0, c1) :|: c1 = i19:0:0 + 1 && (i48:0:0 > i19:0:0 && i71:0:0 > i19:0:0) 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (18) 8.09/3.12 Obligation: 8.09/3.12 Rules: 8.09/3.12 f416_0_main_Load(x3:0, x4:0, x5:0) -> f416_0_main_Load(x3:0, c, x5:0) :|: c = x4:0 + 1 && (x5:0 < x3:0 && x5:0 >= x4:0) 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (19) PolynomialOrderProcessor (EQUIVALENT) 8.09/3.12 Found the following polynomial interpretation: 8.09/3.12 [f416_0_main_Load(x, x1, x2)] = -x1 + x2 8.09/3.12 8.09/3.12 The following rules are decreasing: 8.09/3.12 f416_0_main_Load(x3:0, x4:0, x5:0) -> f416_0_main_Load(x3:0, c, x5:0) :|: c = x4:0 + 1 && (x5:0 < x3:0 && x5:0 >= x4:0) 8.09/3.12 The following rules are bounded: 8.09/3.12 f416_0_main_Load(x3:0, x4:0, x5:0) -> f416_0_main_Load(x3:0, c, x5:0) :|: c = x4:0 + 1 && (x5:0 < x3:0 && x5:0 >= x4:0) 8.09/3.12 8.09/3.12 ---------------------------------------- 8.09/3.12 8.09/3.12 (20) 8.09/3.12 YES 8.27/3.18 EOF