/export/starexec/sandbox2/solver/bin/starexec_run_standard /export/starexec/sandbox2/benchmark/theBenchmark.jar /export/starexec/sandbox2/output/output_files -------------------------------------------------------------------------------- YES proof of /export/starexec/sandbox2/benchmark/theBenchmark.jar # AProVE Commit ID: 794c25de1cacf0d048858bcd21c9a779e1221865 marcel 20200619 unpublished dirty termination of the given Bare JBC problem could be proven: (0) Bare JBC problem (1) BareJBCToJBCProof [EQUIVALENT, 96 ms] (2) JBC problem (3) JBCToGraph [EQUIVALENT, 308 ms] (4) JBCTerminationGraph (5) TerminationGraphToSCCProof [SOUND, 0 ms] (6) JBCTerminationSCC (7) SCCToIRSProof [SOUND, 92 ms] (8) IRSwT (9) IRSFormatTransformerProof [EQUIVALENT, 0 ms] (10) IRSwT (11) IRSwTTerminationDigraphProof [EQUIVALENT, 67 ms] (12) IRSwT (13) IntTRSCompressionProof [EQUIVALENT, 0 ms] (14) IRSwT (15) TempFilterProof [SOUND, 54 ms] (16) IntTRS (17) PolynomialOrderProcessor [EQUIVALENT, 9 ms] (18) IntTRS (19) RankingReductionPairProof [EQUIVALENT, 0 ms] (20) YES ---------------------------------------- (0) Obligation: need to prove termination of the following program: public class GCD2 { public static int mod(int a, int b) { if (a == b) { return 0; } while(a>b) { a -= b; } return a; } public static int gcd(int a, int b) { int tmp; while(b != 0 && a >= 0 && b >= 0) { tmp = b; b = mod(a, b); a = tmp; } return a; } public static void main(String[] args) { Random.args = args; int x = Random.random(); int y = Random.random(); gcd(x, y); } } public class Random { static String[] args; static int index = 0; public static int random() { String string = args[index]; index++; return string.length(); } } ---------------------------------------- (1) BareJBCToJBCProof (EQUIVALENT) initialized classpath ---------------------------------------- (2) Obligation: need to prove termination of the following program: public class GCD2 { public static int mod(int a, int b) { if (a == b) { return 0; } while(a>b) { a -= b; } return a; } public static int gcd(int a, int b) { int tmp; while(b != 0 && a >= 0 && b >= 0) { tmp = b; b = mod(a, b); a = tmp; } return a; } public static void main(String[] args) { Random.args = args; int x = Random.random(); int y = Random.random(); gcd(x, y); } } public class Random { static String[] args; static int index = 0; public static int random() { String string = args[index]; index++; return string.length(); } } ---------------------------------------- (3) JBCToGraph (EQUIVALENT) Constructed TerminationGraph. ---------------------------------------- (4) Obligation: Termination Graph based on JBC Program: GCD2.main([Ljava/lang/String;)V: Graph of 214 nodes with 1 SCC. ---------------------------------------- (5) TerminationGraphToSCCProof (SOUND) Splitted TerminationGraph to 1 SCCs. ---------------------------------------- (6) Obligation: SCC of termination graph based on JBC Program. SCC contains nodes from the following methods: GCD2.main([Ljava/lang/String;)V SCC calls the following helper methods: Performed SCC analyses: *Used field analysis yielded the following read fields: *Marker field analysis yielded the following relations that could be markers: ---------------------------------------- (7) SCCToIRSProof (SOUND) Transformed FIGraph SCCs to intTRSs. Log: Generated rules. Obtained 42 IRulesP rules: f469_0_gcd_EQ(EOS(STATIC_469), i52, i59, i59) -> f470_0_gcd_EQ(EOS(STATIC_470), i52, i59, i59) :|: TRUE f470_0_gcd_EQ(EOS(STATIC_470), i52, i59, i59) -> f472_0_gcd_Load(EOS(STATIC_472), i52, i59) :|: i59 > 0 f472_0_gcd_Load(EOS(STATIC_472), i52, i59) -> f474_0_gcd_LT(EOS(STATIC_474), i52, i59, i52) :|: TRUE f474_0_gcd_LT(EOS(STATIC_474), i52, i59, i52) -> f476_0_gcd_Load(EOS(STATIC_476), i52, i59) :|: i52 >= 0 f476_0_gcd_Load(EOS(STATIC_476), i52, i59) -> f478_0_gcd_LT(EOS(STATIC_478), i52, i59, i59) :|: TRUE f478_0_gcd_LT(EOS(STATIC_478), i52, i59, i59) -> f483_0_gcd_Load(EOS(STATIC_483), i52, i59) :|: i59 >= 0 f483_0_gcd_Load(EOS(STATIC_483), i52, i59) -> f486_0_gcd_Store(EOS(STATIC_486), i52, i59, i59) :|: TRUE f486_0_gcd_Store(EOS(STATIC_486), i52, i59, i59) -> f487_0_gcd_Load(EOS(STATIC_487), i52, i59, i59) :|: TRUE f487_0_gcd_Load(EOS(STATIC_487), i52, i59, i59) -> f488_0_gcd_Load(EOS(STATIC_488), i59, i59, i52) :|: TRUE f488_0_gcd_Load(EOS(STATIC_488), i59, i59, i52) -> f489_0_gcd_InvokeMethod(EOS(STATIC_489), i59, i52, i59) :|: TRUE f489_0_gcd_InvokeMethod(EOS(STATIC_489), i59, i52, i59) -> f490_0_mod_Load(EOS(STATIC_490), i59, i52, i59) :|: TRUE f490_0_mod_Load(EOS(STATIC_490), i59, i52, i59) -> f492_0_mod_Load(EOS(STATIC_492), i59, i52, i59, i52) :|: TRUE f492_0_mod_Load(EOS(STATIC_492), i59, i52, i59, i52) -> f493_0_mod_NE(EOS(STATIC_493), i59, i52, i59, i52, i59) :|: TRUE f493_0_mod_NE(EOS(STATIC_493), i59, i52, i59, i52, i59) -> f501_0_mod_NE(EOS(STATIC_501), i59, i52, i59, i52, i59) :|: !(i52 = i59) f493_0_mod_NE(EOS(STATIC_493), i59, i59, i59, i59, i59) -> f502_0_mod_NE(EOS(STATIC_502), i59, i59, i59, i59, i59) :|: i52 = i59 f501_0_mod_NE(EOS(STATIC_501), i59, i52, i59, i52, i59) -> f507_0_mod_Load(EOS(STATIC_507), i59, i52, i59) :|: !(i52 = i59) f507_0_mod_Load(EOS(STATIC_507), i59, i52, i59) -> f589_0_mod_Load(EOS(STATIC_589), i59, i52, i59) :|: TRUE f589_0_mod_Load(EOS(STATIC_589), i59, i65, i59) -> f604_0_mod_Load(EOS(STATIC_604), i59, i65, i59, i65) :|: TRUE f604_0_mod_Load(EOS(STATIC_604), i59, i65, i59, i65) -> f605_0_mod_LE(EOS(STATIC_605), i59, i65, i59, i65, i59) :|: TRUE f605_0_mod_LE(EOS(STATIC_605), i59, i65, i59, i65, i59) -> f608_0_mod_LE(EOS(STATIC_608), i59, i65, i59, i65, i59) :|: i65 <= i59 f605_0_mod_LE(EOS(STATIC_605), i59, i65, i59, i65, i59) -> f609_0_mod_LE(EOS(STATIC_609), i59, i65, i59, i65, i59) :|: i65 > i59 f608_0_mod_LE(EOS(STATIC_608), i59, i65, i59, i65, i59) -> f611_0_mod_Load(EOS(STATIC_611), i59, i65) :|: i65 <= i59 f611_0_mod_Load(EOS(STATIC_611), i59, i65) -> f617_0_mod_Return(EOS(STATIC_617), i59, i65) :|: TRUE f617_0_mod_Return(EOS(STATIC_617), i59, i65) -> f631_0_gcd_Store(EOS(STATIC_631), i59, i65) :|: TRUE f631_0_gcd_Store(EOS(STATIC_631), i59, i65) -> f635_0_gcd_Load(EOS(STATIC_635), i65, i59) :|: TRUE f635_0_gcd_Load(EOS(STATIC_635), i65, i59) -> f645_0_gcd_Store(EOS(STATIC_645), i65, i59) :|: TRUE f645_0_gcd_Store(EOS(STATIC_645), i65, i59) -> f647_0_gcd_JMP(EOS(STATIC_647), i59, i65) :|: TRUE f647_0_gcd_JMP(EOS(STATIC_647), i59, i65) -> f658_0_gcd_Load(EOS(STATIC_658), i59, i65) :|: TRUE f658_0_gcd_Load(EOS(STATIC_658), i59, i65) -> f462_0_gcd_Load(EOS(STATIC_462), i59, i65) :|: TRUE f462_0_gcd_Load(EOS(STATIC_462), i52, i53) -> f469_0_gcd_EQ(EOS(STATIC_469), i52, i53, i53) :|: TRUE f609_0_mod_LE(EOS(STATIC_609), i59, i65, i59, i65, i59) -> f616_0_mod_Load(EOS(STATIC_616), i59, i65, i59) :|: i65 > i59 f616_0_mod_Load(EOS(STATIC_616), i59, i65, i59) -> f618_0_mod_Load(EOS(STATIC_618), i59, i59, i65) :|: TRUE f618_0_mod_Load(EOS(STATIC_618), i59, i59, i65) -> f633_0_mod_IntArithmetic(EOS(STATIC_633), i59, i59, i65, i59) :|: TRUE f633_0_mod_IntArithmetic(EOS(STATIC_633), i59, i59, i65, i59) -> f644_0_mod_Store(EOS(STATIC_644), i59, i59, i65 - i59) :|: i65 > 0 && i59 > 0 f644_0_mod_Store(EOS(STATIC_644), i59, i59, i74) -> f646_0_mod_JMP(EOS(STATIC_646), i59, i74, i59) :|: TRUE f646_0_mod_JMP(EOS(STATIC_646), i59, i74, i59) -> f648_0_mod_Load(EOS(STATIC_648), i59, i74, i59) :|: TRUE f648_0_mod_Load(EOS(STATIC_648), i59, i74, i59) -> f589_0_mod_Load(EOS(STATIC_589), i59, i74, i59) :|: TRUE f502_0_mod_NE(EOS(STATIC_502), i59, i59, i59, i59, i59) -> f508_0_mod_ConstantStackPush(EOS(STATIC_508), i59) :|: TRUE f508_0_mod_ConstantStackPush(EOS(STATIC_508), i59) -> f511_0_mod_Return(EOS(STATIC_511), i59, 0) :|: TRUE f511_0_mod_Return(EOS(STATIC_511), i59, matching1) -> f513_0_gcd_Store(EOS(STATIC_513), i59, 0) :|: TRUE && matching1 = 0 f513_0_gcd_Store(EOS(STATIC_513), i59, matching1) -> f559_0_gcd_Store(EOS(STATIC_559), i59, 0) :|: TRUE && matching1 = 0 f559_0_gcd_Store(EOS(STATIC_559), i59, i52) -> f631_0_gcd_Store(EOS(STATIC_631), i59, i52) :|: TRUE Combined rules. Obtained 5 IRulesP rules: f469_0_gcd_EQ(EOS(STATIC_469), i52:0, i59:0, i59:0) -> f605_0_mod_LE(EOS(STATIC_605), i59:0, i52:0, i59:0, i52:0, i59:0) :|: i59:0 > 0 && i52:0 > -1 && i59:0 > i52:0 f469_0_gcd_EQ(EOS(STATIC_469), i52:0, i59:0, i59:0) -> f605_0_mod_LE(EOS(STATIC_605), i59:0, i52:0, i59:0, i52:0, i59:0) :|: i59:0 > 0 && i52:0 > -1 && i59:0 < i52:0 f605_0_mod_LE(EOS(STATIC_605), i59:0, i65:0, i59:0, i65:0, i59:0) -> f605_0_mod_LE(EOS(STATIC_605), i59:0, i65:0 - i59:0, i59:0, i65:0 - i59:0, i59:0) :|: i65:0 > i59:0 && i65:0 > 0 && i59:0 > 0 f605_0_mod_LE(EOS(STATIC_605), i59:0, i65:0, i59:0, i65:0, i59:0) -> f469_0_gcd_EQ(EOS(STATIC_469), i59:0, i65:0, i65:0) :|: i65:0 <= i59:0 f469_0_gcd_EQ(EOS(STATIC_469), i52:0, i52:0, i52:0) -> f469_0_gcd_EQ(EOS(STATIC_469), i52:0, 0, 0) :|: i52:0 > 0 Filtered constant ground arguments: f469_0_gcd_EQ(x1, x2, x3, x4) -> f469_0_gcd_EQ(x2, x3, x4) f605_0_mod_LE(x1, x2, x3, x4, x5, x6) -> f605_0_mod_LE(x2, x3, x4, x5, x6) Filtered duplicate arguments: f469_0_gcd_EQ(x1, x2, x3) -> f469_0_gcd_EQ(x1, x3) f605_0_mod_LE(x1, x2, x3, x4, x5) -> f605_0_mod_LE(x4, x5) Finished conversion. Obtained 5 rules.P rules: f469_0_gcd_EQ(i52:0, i59:0) -> f605_0_mod_LE(i52:0, i59:0) :|: i52:0 > -1 && i59:0 > i52:0 && i59:0 > 0 f469_0_gcd_EQ(i52:0, i59:0) -> f605_0_mod_LE(i52:0, i59:0) :|: i52:0 > -1 && i59:0 < i52:0 && i59:0 > 0 f605_0_mod_LE(i65:0, i59:0) -> f605_0_mod_LE(i65:0 - i59:0, i59:0) :|: i65:0 > 0 && i59:0 > 0 && i65:0 > i59:0 f605_0_mod_LE(i65:0, i59:0) -> f469_0_gcd_EQ(i59:0, i65:0) :|: i65:0 <= i59:0 f469_0_gcd_EQ(i52:0, i52:0) -> f469_0_gcd_EQ(i52:0, 0) :|: i52:0 > 0 ---------------------------------------- (8) Obligation: Rules: f469_0_gcd_EQ(i52:0, i59:0) -> f605_0_mod_LE(i52:0, i59:0) :|: i52:0 > -1 && i59:0 > i52:0 && i59:0 > 0 f469_0_gcd_EQ(x, x1) -> f605_0_mod_LE(x, x1) :|: x > -1 && x1 < x && x1 > 0 f605_0_mod_LE(x2, x3) -> f605_0_mod_LE(x2 - x3, x3) :|: x2 > 0 && x3 > 0 && x2 > x3 f605_0_mod_LE(x4, x5) -> f469_0_gcd_EQ(x5, x4) :|: x4 <= x5 f469_0_gcd_EQ(x6, x6) -> f469_0_gcd_EQ(x6, 0) :|: x6 > 0 ---------------------------------------- (9) IRSFormatTransformerProof (EQUIVALENT) Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). ---------------------------------------- (10) Obligation: Rules: f469_0_gcd_EQ(i52:0, i59:0) -> f605_0_mod_LE(i52:0, i59:0) :|: i52:0 > -1 && i59:0 > i52:0 && i59:0 > 0 f469_0_gcd_EQ(x, x1) -> f605_0_mod_LE(x, x1) :|: x > -1 && x1 < x && x1 > 0 f605_0_mod_LE(x2, x3) -> f605_0_mod_LE(arith, x3) :|: x2 > 0 && x3 > 0 && x2 > x3 && arith = x2 - x3 f605_0_mod_LE(x4, x5) -> f469_0_gcd_EQ(x5, x4) :|: x4 <= x5 f469_0_gcd_EQ(x6, x6) -> f469_0_gcd_EQ(x6, 0) :|: x6 > 0 ---------------------------------------- (11) IRSwTTerminationDigraphProof (EQUIVALENT) Constructed termination digraph! Nodes: (1) f469_0_gcd_EQ(i52:0, i59:0) -> f605_0_mod_LE(i52:0, i59:0) :|: i52:0 > -1 && i59:0 > i52:0 && i59:0 > 0 (2) f469_0_gcd_EQ(x, x1) -> f605_0_mod_LE(x, x1) :|: x > -1 && x1 < x && x1 > 0 (3) f605_0_mod_LE(x2, x3) -> f605_0_mod_LE(arith, x3) :|: x2 > 0 && x3 > 0 && x2 > x3 && arith = x2 - x3 (4) f605_0_mod_LE(x4, x5) -> f469_0_gcd_EQ(x5, x4) :|: x4 <= x5 (5) f469_0_gcd_EQ(x6, x6) -> f469_0_gcd_EQ(x6, 0) :|: x6 > 0 Arcs: (1) -> (4) (2) -> (3) (3) -> (3), (4) (4) -> (2), (5) This digraph is fully evaluated! ---------------------------------------- (12) Obligation: Termination digraph: Nodes: (1) f605_0_mod_LE(x4, x5) -> f469_0_gcd_EQ(x5, x4) :|: x4 <= x5 (2) f605_0_mod_LE(x2, x3) -> f605_0_mod_LE(arith, x3) :|: x2 > 0 && x3 > 0 && x2 > x3 && arith = x2 - x3 (3) f469_0_gcd_EQ(x, x1) -> f605_0_mod_LE(x, x1) :|: x > -1 && x1 < x && x1 > 0 Arcs: (1) -> (3) (2) -> (1), (2) (3) -> (2) This digraph is fully evaluated! ---------------------------------------- (13) IntTRSCompressionProof (EQUIVALENT) Compressed rules. ---------------------------------------- (14) Obligation: Rules: f605_0_mod_LE(x2:0, x3:0) -> f605_0_mod_LE(x2:0 - x3:0, x3:0) :|: x2:0 > 0 && x3:0 > 0 && x3:0 < x2:0 f605_0_mod_LE(x4:0, x5:0) -> f605_0_mod_LE(x5:0, x4:0) :|: x5:0 > -1 && x5:0 > x4:0 && x4:0 > 0 ---------------------------------------- (15) TempFilterProof (SOUND) Used the following sort dictionary for filtering: f605_0_mod_LE(INTEGER, INTEGER) Replaced non-predefined constructor symbols by 0. ---------------------------------------- (16) Obligation: Rules: f605_0_mod_LE(x2:0, x3:0) -> f605_0_mod_LE(c, x3:0) :|: c = x2:0 - x3:0 && (x2:0 > 0 && x3:0 > 0 && x3:0 < x2:0) f605_0_mod_LE(x4:0, x5:0) -> f605_0_mod_LE(x5:0, x4:0) :|: x5:0 > -1 && x5:0 > x4:0 && x4:0 > 0 ---------------------------------------- (17) PolynomialOrderProcessor (EQUIVALENT) Found the following polynomial interpretation: [f605_0_mod_LE(x, x1)] = -2 + x1 The following rules are decreasing: f605_0_mod_LE(x4:0, x5:0) -> f605_0_mod_LE(x5:0, x4:0) :|: x5:0 > -1 && x5:0 > x4:0 && x4:0 > 0 The following rules are bounded: f605_0_mod_LE(x4:0, x5:0) -> f605_0_mod_LE(x5:0, x4:0) :|: x5:0 > -1 && x5:0 > x4:0 && x4:0 > 0 ---------------------------------------- (18) Obligation: Rules: f605_0_mod_LE(x2:0, x3:0) -> f605_0_mod_LE(c, x3:0) :|: c = x2:0 - x3:0 && (x2:0 > 0 && x3:0 > 0 && x3:0 < x2:0) ---------------------------------------- (19) RankingReductionPairProof (EQUIVALENT) Interpretation: [ f605_0_mod_LE ] = f605_0_mod_LE_1 The following rules are decreasing: f605_0_mod_LE(x2:0, x3:0) -> f605_0_mod_LE(c, x3:0) :|: c = x2:0 - x3:0 && (x2:0 > 0 && x3:0 > 0 && x3:0 < x2:0) The following rules are bounded: f605_0_mod_LE(x2:0, x3:0) -> f605_0_mod_LE(c, x3:0) :|: c = x2:0 - x3:0 && (x2:0 > 0 && x3:0 > 0 && x3:0 < x2:0) ---------------------------------------- (20) YES