/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, 98 ms] (2) JBC problem (3) JBCToGraph [EQUIVALENT, 364 ms] (4) JBCTerminationGraph (5) TerminationGraphToSCCProof [SOUND, 0 ms] (6) JBCTerminationSCC (7) SCCToIRSProof [SOUND, 67 ms] (8) IRSwT (9) IRSFormatTransformerProof [EQUIVALENT, 0 ms] (10) IRSwT (11) IRSwTTerminationDigraphProof [EQUIVALENT, 40 ms] (12) IRSwT (13) IntTRSCompressionProof [EQUIVALENT, 0 ms] (14) IRSwT (15) TempFilterProof [SOUND, 60 ms] (16) IntTRS (17) PolynomialOrderProcessor [EQUIVALENT, 12 ms] (18) IntTRS (19) RankingReductionPairProof [EQUIVALENT, 0 ms] (20) YES ---------------------------------------- (0) Obligation: need to prove termination of the following program: public class Mod { public static void main(String[] args) { int x = args[0].length(); int y = args[1].length(); mod(x, y); } public static int mod(int x, int y) { while (x >= y && y > 0) { x = minus(x,y); } return x; } public static int minus(int x, int y) { while (y != 0) { if (y > 0) { y--; x--; } else { y++; x++; } } return x; } } ---------------------------------------- (1) BareJBCToJBCProof (EQUIVALENT) initialized classpath ---------------------------------------- (2) Obligation: need to prove termination of the following program: public class Mod { public static void main(String[] args) { int x = args[0].length(); int y = args[1].length(); mod(x, y); } public static int mod(int x, int y) { while (x >= y && y > 0) { x = minus(x,y); } return x; } public static int minus(int x, int y) { while (y != 0) { if (y > 0) { y--; x--; } else { y++; x++; } } return x; } } ---------------------------------------- (3) JBCToGraph (EQUIVALENT) Constructed TerminationGraph. ---------------------------------------- (4) Obligation: Termination Graph based on JBC Program: Mod.main([Ljava/lang/String;)V: Graph of 152 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: Mod.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 27 IRulesP rules: f195_0_mod_Load(EOS(STATIC_195), i12, i30, i12) -> f198_0_mod_LT(EOS(STATIC_198), i12, i30, i12, i30) :|: TRUE f198_0_mod_LT(EOS(STATIC_198), i12, i30, i12, i30) -> f205_0_mod_LT(EOS(STATIC_205), i12, i30, i12, i30) :|: i12 >= i30 f205_0_mod_LT(EOS(STATIC_205), i12, i30, i12, i30) -> f212_0_mod_Load(EOS(STATIC_212), i12, i30) :|: i12 >= i30 f212_0_mod_Load(EOS(STATIC_212), i12, i30) -> f225_0_mod_LE(EOS(STATIC_225), i12, i30, i30) :|: TRUE f225_0_mod_LE(EOS(STATIC_225), i36, i35, i35) -> f241_0_mod_LE(EOS(STATIC_241), i36, i35, i35) :|: TRUE f241_0_mod_LE(EOS(STATIC_241), i36, i35, i35) -> f287_0_mod_Load(EOS(STATIC_287), i36, i35) :|: i35 > 0 f287_0_mod_Load(EOS(STATIC_287), i36, i35) -> f291_0_mod_Load(EOS(STATIC_291), i35, i36) :|: TRUE f291_0_mod_Load(EOS(STATIC_291), i35, i36) -> f294_0_mod_InvokeMethod(EOS(STATIC_294), i35, i36, i35) :|: TRUE f294_0_mod_InvokeMethod(EOS(STATIC_294), i35, i36, i35) -> f299_0_minus_Load(EOS(STATIC_299), i35, i36, i35) :|: TRUE f299_0_minus_Load(EOS(STATIC_299), i35, i36, i35) -> f378_0_minus_Load(EOS(STATIC_378), i35, i36, i35) :|: TRUE f378_0_minus_Load(EOS(STATIC_378), i35, i52, i53) -> f379_0_minus_EQ(EOS(STATIC_379), i35, i52, i53, i53) :|: TRUE f379_0_minus_EQ(EOS(STATIC_379), i35, i63, i62, i62) -> f383_0_minus_EQ(EOS(STATIC_383), i35, i63, i62, i62) :|: TRUE f379_0_minus_EQ(EOS(STATIC_379), i35, i52, matching1, matching2) -> f384_0_minus_EQ(EOS(STATIC_384), i35, i52, 0, 0) :|: TRUE && matching1 = 0 && matching2 = 0 f383_0_minus_EQ(EOS(STATIC_383), i35, i63, i62, i62) -> f385_0_minus_Load(EOS(STATIC_385), i35, i63, i62) :|: i62 > 0 f385_0_minus_Load(EOS(STATIC_385), i35, i63, i62) -> f390_0_minus_LE(EOS(STATIC_390), i35, i63, i62, i62) :|: TRUE f390_0_minus_LE(EOS(STATIC_390), i35, i63, i62, i62) -> f393_0_minus_Inc(EOS(STATIC_393), i35, i63, i62) :|: i62 > 0 f393_0_minus_Inc(EOS(STATIC_393), i35, i63, i62) -> f395_0_minus_Inc(EOS(STATIC_395), i35, i63, i62 + -1) :|: TRUE f395_0_minus_Inc(EOS(STATIC_395), i35, i63, i67) -> f398_0_minus_JMP(EOS(STATIC_398), i35, i63 + -1, i67) :|: TRUE f398_0_minus_JMP(EOS(STATIC_398), i35, i68, i67) -> f443_0_minus_Load(EOS(STATIC_443), i35, i68, i67) :|: TRUE f443_0_minus_Load(EOS(STATIC_443), i35, i68, i67) -> f378_0_minus_Load(EOS(STATIC_378), i35, i68, i67) :|: TRUE f384_0_minus_EQ(EOS(STATIC_384), i35, i52, matching1, matching2) -> f387_0_minus_Load(EOS(STATIC_387), i35, i52) :|: TRUE && matching1 = 0 && matching2 = 0 f387_0_minus_Load(EOS(STATIC_387), i35, i52) -> f392_0_minus_Return(EOS(STATIC_392), i35, i52) :|: TRUE f392_0_minus_Return(EOS(STATIC_392), i35, i52) -> f394_0_mod_Store(EOS(STATIC_394), i35, i52) :|: TRUE f394_0_mod_Store(EOS(STATIC_394), i35, i52) -> f397_0_mod_JMP(EOS(STATIC_397), i52, i35) :|: TRUE f397_0_mod_JMP(EOS(STATIC_397), i52, i35) -> f408_0_mod_Load(EOS(STATIC_408), i52, i35) :|: TRUE f408_0_mod_Load(EOS(STATIC_408), i52, i35) -> f189_0_mod_Load(EOS(STATIC_189), i52, i35) :|: TRUE f189_0_mod_Load(EOS(STATIC_189), i12, i30) -> f195_0_mod_Load(EOS(STATIC_195), i12, i30, i12) :|: TRUE Combined rules. Obtained 2 IRulesP rules: f379_0_minus_EQ(EOS(STATIC_379), i35:0, i52:0, 0, 0) -> f379_0_minus_EQ(EOS(STATIC_379), i35:0, i52:0, i35:0, i35:0) :|: i52:0 >= i35:0 && i35:0 > 0 f379_0_minus_EQ(EOS(STATIC_379), i35:0, i63:0, i62:0, i62:0) -> f379_0_minus_EQ(EOS(STATIC_379), i35:0, i63:0 - 1, i62:0 - 1, i62:0 - 1) :|: i62:0 > 0 Filtered constant ground arguments: f379_0_minus_EQ(x1, x2, x3, x4, x5) -> f379_0_minus_EQ(x2, x3, x4, x5) EOS(x1) -> EOS Filtered duplicate arguments: f379_0_minus_EQ(x1, x2, x3, x4) -> f379_0_minus_EQ(x1, x2, x4) Finished conversion. Obtained 2 rules.P rules: f379_0_minus_EQ(i35:0, i52:0, cons_0) -> f379_0_minus_EQ(i35:0, i52:0, i35:0) :|: i52:0 >= i35:0 && i35:0 > 0 && cons_0 = 0 f379_0_minus_EQ(i35:0, i63:0, i62:0) -> f379_0_minus_EQ(i35:0, i63:0 - 1, i62:0 - 1) :|: i62:0 > 0 ---------------------------------------- (8) Obligation: Rules: f379_0_minus_EQ(i35:0, i52:0, cons_0) -> f379_0_minus_EQ(i35:0, i52:0, i35:0) :|: i52:0 >= i35:0 && i35:0 > 0 && cons_0 = 0 f379_0_minus_EQ(x, x1, x2) -> f379_0_minus_EQ(x, x1 - 1, x2 - 1) :|: x2 > 0 ---------------------------------------- (9) IRSFormatTransformerProof (EQUIVALENT) Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). ---------------------------------------- (10) Obligation: Rules: f379_0_minus_EQ(i35:0, i52:0, cons_0) -> f379_0_minus_EQ(i35:0, i52:0, i35:0) :|: i52:0 >= i35:0 && i35:0 > 0 && cons_0 = 0 f379_0_minus_EQ(x, x1, x2) -> f379_0_minus_EQ(x, arith, arith1) :|: x2 > 0 && arith = x1 - 1 && arith1 = x2 - 1 ---------------------------------------- (11) IRSwTTerminationDigraphProof (EQUIVALENT) Constructed termination digraph! Nodes: (1) f379_0_minus_EQ(i35:0, i52:0, cons_0) -> f379_0_minus_EQ(i35:0, i52:0, i35:0) :|: i52:0 >= i35:0 && i35:0 > 0 && cons_0 = 0 (2) f379_0_minus_EQ(x, x1, x2) -> f379_0_minus_EQ(x, arith, arith1) :|: x2 > 0 && arith = x1 - 1 && arith1 = x2 - 1 Arcs: (1) -> (2) (2) -> (1), (2) This digraph is fully evaluated! ---------------------------------------- (12) Obligation: Termination digraph: Nodes: (1) f379_0_minus_EQ(i35:0, i52:0, cons_0) -> f379_0_minus_EQ(i35:0, i52:0, i35:0) :|: i52:0 >= i35:0 && i35:0 > 0 && cons_0 = 0 (2) f379_0_minus_EQ(x, x1, x2) -> f379_0_minus_EQ(x, arith, arith1) :|: x2 > 0 && arith = x1 - 1 && arith1 = x2 - 1 Arcs: (1) -> (2) (2) -> (1), (2) This digraph is fully evaluated! ---------------------------------------- (13) IntTRSCompressionProof (EQUIVALENT) Compressed rules. ---------------------------------------- (14) Obligation: Rules: f379_0_minus_EQ(i35:0:0, i52:0:0, cons_0) -> f379_0_minus_EQ(i35:0:0, i52:0:0, i35:0:0) :|: i52:0:0 >= i35:0:0 && i35:0:0 > 0 && cons_0 = 0 f379_0_minus_EQ(x:0, x1:0, x2:0) -> f379_0_minus_EQ(x:0, x1:0 - 1, x2:0 - 1) :|: x2:0 > 0 ---------------------------------------- (15) TempFilterProof (SOUND) Used the following sort dictionary for filtering: f379_0_minus_EQ(VARIABLE, VARIABLE, INTEGER) Replaced non-predefined constructor symbols by 0. ---------------------------------------- (16) Obligation: Rules: f379_0_minus_EQ(i35:0:0, i52:0:0, c) -> f379_0_minus_EQ(i35:0:0, i52:0:0, i35:0:0) :|: c = 0 && (i52:0:0 >= i35:0:0 && i35:0:0 > 0 && cons_0 = 0) f379_0_minus_EQ(x:0, x1:0, x2:0) -> f379_0_minus_EQ(x:0, c1, c2) :|: c2 = x2:0 - 1 && c1 = x1:0 - 1 && x2:0 > 0 ---------------------------------------- (17) PolynomialOrderProcessor (EQUIVALENT) Found the following polynomial interpretation: [f379_0_minus_EQ(x, x1, x2)] = x + x1 - x2 The following rules are decreasing: f379_0_minus_EQ(i35:0:0, i52:0:0, c) -> f379_0_minus_EQ(i35:0:0, i52:0:0, i35:0:0) :|: c = 0 && (i52:0:0 >= i35:0:0 && i35:0:0 > 0 && cons_0 = 0) The following rules are bounded: f379_0_minus_EQ(i35:0:0, i52:0:0, c) -> f379_0_minus_EQ(i35:0:0, i52:0:0, i35:0:0) :|: c = 0 && (i52:0:0 >= i35:0:0 && i35:0:0 > 0 && cons_0 = 0) ---------------------------------------- (18) Obligation: Rules: f379_0_minus_EQ(x:0, x1:0, x2:0) -> f379_0_minus_EQ(x:0, c1, c2) :|: c2 = x2:0 - 1 && c1 = x1:0 - 1 && x2:0 > 0 ---------------------------------------- (19) RankingReductionPairProof (EQUIVALENT) Interpretation: [ f379_0_minus_EQ ] = f379_0_minus_EQ_3 The following rules are decreasing: f379_0_minus_EQ(x:0, x1:0, x2:0) -> f379_0_minus_EQ(x:0, c1, c2) :|: c2 = x2:0 - 1 && c1 = x1:0 - 1 && x2:0 > 0 The following rules are bounded: f379_0_minus_EQ(x:0, x1:0, x2:0) -> f379_0_minus_EQ(x:0, c1, c2) :|: c2 = x2:0 - 1 && c1 = x1:0 - 1 && x2:0 > 0 ---------------------------------------- (20) YES