/export/starexec/sandbox/solver/bin/starexec_run_standard /export/starexec/sandbox/benchmark/theBenchmark.jar /export/starexec/sandbox/output/output_files -------------------------------------------------------------------------------- YES proof of /export/starexec/sandbox/benchmark/theBenchmark.jar # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty termination of the given Bare JBC problem could be proven: (0) Bare JBC problem (1) BareJBCToJBCProof [EQUIVALENT, 97 ms] (2) JBC problem (3) JBCToGraph [EQUIVALENT, 434 ms] (4) JBCTerminationGraph (5) TerminationGraphToSCCProof [SOUND, 0 ms] (6) JBCTerminationSCC (7) SCCToIRSProof [SOUND, 166 ms] (8) IRSwT (9) IRSFormatTransformerProof [EQUIVALENT, 0 ms] (10) IRSwT (11) IRSwTTerminationDigraphProof [EQUIVALENT, 39 ms] (12) IRSwT (13) IntTRSCompressionProof [EQUIVALENT, 0 ms] (14) IRSwT (15) TempFilterProof [SOUND, 53 ms] (16) IntTRS (17) PolynomialOrderProcessor [EQUIVALENT, 0 ms] (18) IntTRS (19) PolynomialOrderProcessor [EQUIVALENT, 0 ms] (20) YES ---------------------------------------- (0) Obligation: need to prove termination of the following program: /** * The classical Ackermann function. * * All calls terminate. * * Julia + BinTerm prove that all calls terminate * * Note that we have to express the basic cases as m <= 0 and n <= 0 * in order to prove termination. * * @author Fausto Spoto */ public class Ackermann { public static int ack(int m, int n) { if (m <= 0) return n + 1; else if (n <= 0) return ack(m - 1,1); else return ack(m - 1,ack(m,n - 1)); } public static void main(String[] args) { ack(10,12); } } ---------------------------------------- (1) BareJBCToJBCProof (EQUIVALENT) initialized classpath ---------------------------------------- (2) Obligation: need to prove termination of the following program: /** * The classical Ackermann function. * * All calls terminate. * * Julia + BinTerm prove that all calls terminate * * Note that we have to express the basic cases as m <= 0 and n <= 0 * in order to prove termination. * * @author Fausto Spoto */ public class Ackermann { public static int ack(int m, int n) { if (m <= 0) return n + 1; else if (n <= 0) return ack(m - 1,1); else return ack(m - 1,ack(m,n - 1)); } public static void main(String[] args) { ack(10,12); } } ---------------------------------------- (3) JBCToGraph (EQUIVALENT) Constructed TerminationGraph. ---------------------------------------- (4) Obligation: Termination Graph based on JBC Program: Ackermann.main([Ljava/lang/String;)V: Graph of 13 nodes with 0 SCCs. Ackermann.ack(II)I: Graph of 52 nodes with 0 SCCs. ---------------------------------------- (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: Ackermann.ack(II)I SCC calls the following helper methods: Ackermann.ack(II)I 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 39 IRulesP rules: f730_0_ack_GT(EOS(STATIC_730), i39, i40, i44, i42, i44) -> f734_0_ack_GT(EOS(STATIC_734), i39, i40, i44, i42, i44) :|: TRUE f734_0_ack_GT(EOS(STATIC_734), i39, i40, i44, i42, i44) -> f737_0_ack_Load(EOS(STATIC_737), i39, i40, i44, i42) :|: i44 > 0 f737_0_ack_Load(EOS(STATIC_737), i39, i40, i44, i42) -> f739_0_ack_GT(EOS(STATIC_739), i39, i40, i44, i42, i42) :|: TRUE f739_0_ack_GT(EOS(STATIC_739), i39, i40, i44, i45, i45) -> f741_0_ack_GT(EOS(STATIC_741), i39, i40, i44, i45, i45) :|: TRUE f739_0_ack_GT(EOS(STATIC_739), i39, i40, i44, i46, i46) -> f742_0_ack_GT(EOS(STATIC_742), i39, i40, i44, i46, i46) :|: TRUE f741_0_ack_GT(EOS(STATIC_741), i39, i40, i44, i45, i45) -> f744_0_ack_Load(EOS(STATIC_744), i39, i40, i44) :|: i45 <= 0 f744_0_ack_Load(EOS(STATIC_744), i39, i40, i44) -> f747_0_ack_ConstantStackPush(EOS(STATIC_747), i39, i40, i44) :|: TRUE f747_0_ack_ConstantStackPush(EOS(STATIC_747), i39, i40, i44) -> f779_0_ack_IntArithmetic(EOS(STATIC_779), i39, i40, i44, 1) :|: TRUE f779_0_ack_IntArithmetic(EOS(STATIC_779), i39, i40, i44, matching1) -> f782_0_ack_ConstantStackPush(EOS(STATIC_782), i39, i40, i44 - 1) :|: i44 > 0 && matching1 = 1 f782_0_ack_ConstantStackPush(EOS(STATIC_782), i39, i40, i51) -> f785_0_ack_InvokeMethod(EOS(STATIC_785), i39, i40, i51, 1) :|: TRUE f785_0_ack_InvokeMethod(EOS(STATIC_785), i39, i40, i51, matching1) -> f788_0_ack_Load(EOS(STATIC_788), i51, 1, i51, 1) :|: TRUE && matching1 = 1 f785_0_ack_InvokeMethod(EOS(STATIC_785), i39, i40, i51, matching1) -> f788_1_ack_Load(EOS(STATIC_788), i39, i40, i51, 1) :|: TRUE && matching1 = 1 f788_0_ack_Load(EOS(STATIC_788), i51, matching1, i51, matching2) -> f791_0_ack_Load(EOS(STATIC_791), i51, 1, i51, 1) :|: TRUE && matching1 = 1 && matching2 = 1 f791_0_ack_Load(EOS(STATIC_791), i51, matching1, i51, matching2) -> f692_0_ack_Load(EOS(STATIC_692), i51, 1, i51, 1) :|: TRUE && matching1 = 1 && matching2 = 1 f692_0_ack_Load(EOS(STATIC_692), i39, i40, i41, i42) -> f730_0_ack_GT(EOS(STATIC_730), i39, i40, i41, i42, i41) :|: TRUE f742_0_ack_GT(EOS(STATIC_742), i39, i40, i44, i46, i46) -> f745_0_ack_Load(EOS(STATIC_745), i39, i40, i44, i46) :|: i46 > 0 f745_0_ack_Load(EOS(STATIC_745), i39, i40, i44, i46) -> f748_0_ack_ConstantStackPush(EOS(STATIC_748), i39, i40, i44, i46, i44) :|: TRUE f748_0_ack_ConstantStackPush(EOS(STATIC_748), i39, i40, i44, i46, i44) -> f780_0_ack_IntArithmetic(EOS(STATIC_780), i39, i40, i44, i46, i44, 1) :|: TRUE f780_0_ack_IntArithmetic(EOS(STATIC_780), i39, i40, i44, i46, i44, matching1) -> f783_0_ack_Load(EOS(STATIC_783), i39, i40, i44, i46, i44 - 1) :|: i44 > 0 && matching1 = 1 f783_0_ack_Load(EOS(STATIC_783), i39, i40, i44, i46, i52) -> f786_0_ack_Load(EOS(STATIC_786), i39, i40, i46, i52, i44) :|: TRUE f786_0_ack_Load(EOS(STATIC_786), i39, i40, i46, i52, i44) -> f789_0_ack_ConstantStackPush(EOS(STATIC_789), i39, i40, i52, i44, i46) :|: TRUE f789_0_ack_ConstantStackPush(EOS(STATIC_789), i39, i40, i52, i44, i46) -> f792_0_ack_IntArithmetic(EOS(STATIC_792), i39, i40, i52, i44, i46, 1) :|: TRUE f792_0_ack_IntArithmetic(EOS(STATIC_792), i39, i40, i52, i44, i46, matching1) -> f793_0_ack_InvokeMethod(EOS(STATIC_793), i39, i40, i52, i44, i46 - 1) :|: i46 > 0 && matching1 = 1 f793_0_ack_InvokeMethod(EOS(STATIC_793), i39, i40, i52, i44, i53) -> f794_0_ack_Load(EOS(STATIC_794), i44, i53, i44, i53) :|: i44 >= 1 && i52 < i44 f793_0_ack_InvokeMethod(EOS(STATIC_793), i39, i40, i52, i44, i53) -> f794_1_ack_Load(EOS(STATIC_794), i39, i40, i52, i44, i53) :|: i44 >= 1 && i52 < i44 f794_0_ack_Load(EOS(STATIC_794), i44, i53, i44, i53) -> f795_0_ack_Load(EOS(STATIC_795), i44, i53, i44, i53) :|: TRUE f795_0_ack_Load(EOS(STATIC_795), i44, i53, i44, i53) -> f692_0_ack_Load(EOS(STATIC_692), i44, i53, i44, i53) :|: TRUE f2648_0_ack_Return(EOS(STATIC_2648), i39, i40, i52, i73) -> f2653_0_ack_InvokeMethod(EOS(STATIC_2653), i39, i40, i52, i73) :|: TRUE f2653_0_ack_InvokeMethod(EOS(STATIC_2653), i39, i40, i52, i73) -> f2681_0_ack_Load(EOS(STATIC_2681), i52, i73, i52, i73) :|: TRUE f2653_0_ack_InvokeMethod(EOS(STATIC_2653), i39, i40, i52, i73) -> f2681_1_ack_Load(EOS(STATIC_2681), i39, i40, i52, i73) :|: TRUE f2681_0_ack_Load(EOS(STATIC_2681), i52, i73, i52, i73) -> f2684_0_ack_Load(EOS(STATIC_2684), i52, i73, i52, i73) :|: TRUE f2684_0_ack_Load(EOS(STATIC_2684), i52, i73, i52, i73) -> f692_0_ack_Load(EOS(STATIC_692), i52, i73, i52, i73) :|: TRUE f2649_0_ack_Return(EOS(STATIC_2649), i39, i40, i52, i80) -> f2662_0_ack_InvokeMethod(EOS(STATIC_2662), i39, i40, i52, i80) :|: TRUE f2662_0_ack_InvokeMethod(EOS(STATIC_2662), i39, i40, i52, i80) -> f2653_0_ack_InvokeMethod(EOS(STATIC_2653), i39, i40, i52, i80) :|: TRUE f5270_0_ack_Return(EOS(STATIC_5270), i39, i40, i52, i127) -> f5336_0_ack_InvokeMethod(EOS(STATIC_5336), i39, i40, i52, i127) :|: TRUE f5336_0_ack_InvokeMethod(EOS(STATIC_5336), i39, i40, i52, i127) -> f2653_0_ack_InvokeMethod(EOS(STATIC_2653), i39, i40, i52, i127) :|: TRUE f794_1_ack_Load(EOS(STATIC_794), i39, i40, i52, i44, i53) -> f2648_0_ack_Return(EOS(STATIC_2648), i39, i40, i52, i73) :|: TRUE f794_1_ack_Load(EOS(STATIC_794), i39, i40, i52, i44, i53) -> f2649_0_ack_Return(EOS(STATIC_2649), i39, i40, i52, i80) :|: TRUE f794_1_ack_Load(EOS(STATIC_794), i39, i40, i52, i44, i53) -> f5270_0_ack_Return(EOS(STATIC_5270), i39, i40, i52, i127) :|: TRUE Combined rules. Obtained 6 IRulesP rules: f730_0_ack_GT(EOS(STATIC_730), i39:0, i40:0, i44:0, i42:0, i44:0) -> f730_0_ack_GT(EOS(STATIC_730), i44:0, i42:0 - 1, i44:0, i42:0 - 1, i44:0) :|: i44:0 > 0 && i42:0 > 0 && i44:0 - 1 < i44:0 f730_0_ack_GT(EOS(STATIC_730), i39:0, i40:0, i44:0, i42:0, i44:0) -> f2653_0_ack_InvokeMethod(EOS(STATIC_2653), i39:0, i40:0, i44:0 - 1, i80:0) :|: i44:0 > 0 && i42:0 > 0 && i44:0 - 1 < i44:0 f730_0_ack_GT(EOS(STATIC_730), i39:0, i40:0, i44:0, i42:0, i44:0) -> f730_0_ack_GT(EOS(STATIC_730), i44:0 - 1, 1, i44:0 - 1, 1, i44:0 - 1) :|: i44:0 > 0 && i42:0 < 1 f2653_0_ack_InvokeMethod(EOS(STATIC_2653), i39:0, i40:0, i52:0, i73:0) -> f730_0_ack_GT(EOS(STATIC_730), i52:0, i73:0, i52:0, i73:0, i52:0) :|: TRUE Removed following non-SCC rules: f730_0_ack_GT(EOS(STATIC_730), i39:0, i40:0, i44:0, i42:0, i44:0) -> f788_1_ack_Load(EOS(STATIC_788), i39:0, i40:0, i44:0 - 1, 1) :|: i44:0 > 0 && i42:0 < 1 f2653_0_ack_InvokeMethod(EOS(STATIC_2653), i39:0, i40:0, i52:0, i73:0) -> f2681_1_ack_Load(EOS(STATIC_2681), i39:0, i40:0, i52:0, i73:0) :|: TRUE Filtered constant ground arguments: f730_0_ack_GT(x1, x2, x3, x4, x5, x6) -> f730_0_ack_GT(x2, x3, x4, x5, x6) f2653_0_ack_InvokeMethod(x1, x2, x3, x4, x5) -> f2653_0_ack_InvokeMethod(x2, x3, x4, x5) Filtered duplicate arguments: f730_0_ack_GT(x1, x2, x3, x4, x5) -> f730_0_ack_GT(x1, x2, x4, x5) Filtered unneeded arguments: f730_0_ack_GT(x1, x2, x3, x4) -> f730_0_ack_GT(x3, x4) f2653_0_ack_InvokeMethod(x1, x2, x3, x4) -> f2653_0_ack_InvokeMethod(x3, x4) Finished conversion. Obtained 4 rules.P rules: f730_0_ack_GT(i42:0, i44:0) -> f730_0_ack_GT(i42:0 - 1, i44:0) :|: i42:0 > 0 && i44:0 - 1 < i44:0 && i44:0 > 0 f730_0_ack_GT(i42:0, i44:0) -> f2653_0_ack_InvokeMethod(i44:0 - 1, i80:0) :|: i42:0 > 0 && i44:0 - 1 < i44:0 && i44:0 > 0 f730_0_ack_GT(i42:0, i44:0) -> f730_0_ack_GT(1, i44:0 - 1) :|: i44:0 > 0 && i42:0 < 1 f2653_0_ack_InvokeMethod(i52:0, i73:0) -> f730_0_ack_GT(i73:0, i52:0) :|: TRUE ---------------------------------------- (8) Obligation: Rules: f730_0_ack_GT(i42:0, i44:0) -> f730_0_ack_GT(i42:0 - 1, i44:0) :|: i42:0 > 0 && i44:0 - 1 < i44:0 && i44:0 > 0 f730_0_ack_GT(x, x1) -> f2653_0_ack_InvokeMethod(x1 - 1, x2) :|: x > 0 && x1 - 1 < x1 && x1 > 0 f730_0_ack_GT(x3, x4) -> f730_0_ack_GT(1, x4 - 1) :|: x4 > 0 && x3 < 1 f2653_0_ack_InvokeMethod(i52:0, i73:0) -> f730_0_ack_GT(i73:0, i52:0) :|: TRUE ---------------------------------------- (9) IRSFormatTransformerProof (EQUIVALENT) Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). ---------------------------------------- (10) Obligation: Rules: f730_0_ack_GT(i42:0, i44:0) -> f730_0_ack_GT(arith, i44:0) :|: i42:0 > 0 && i44:0 - 1 < i44:0 && i44:0 > 0 && arith = i42:0 - 1 f730_0_ack_GT(x5, x6) -> f2653_0_ack_InvokeMethod(x7, x8) :|: x5 > 0 && x6 - 1 < x6 && x6 > 0 && x7 = x6 - 1 f730_0_ack_GT(x9, x10) -> f730_0_ack_GT(1, x11) :|: x10 > 0 && x9 < 1 && x11 = x10 - 1 f2653_0_ack_InvokeMethod(i52:0, i73:0) -> f730_0_ack_GT(i73:0, i52:0) :|: TRUE ---------------------------------------- (11) IRSwTTerminationDigraphProof (EQUIVALENT) Constructed termination digraph! Nodes: (1) f730_0_ack_GT(i42:0, i44:0) -> f730_0_ack_GT(arith, i44:0) :|: i42:0 > 0 && i44:0 - 1 < i44:0 && i44:0 > 0 && arith = i42:0 - 1 (2) f730_0_ack_GT(x5, x6) -> f2653_0_ack_InvokeMethod(x7, x8) :|: x5 > 0 && x6 - 1 < x6 && x6 > 0 && x7 = x6 - 1 (3) f730_0_ack_GT(x9, x10) -> f730_0_ack_GT(1, x11) :|: x10 > 0 && x9 < 1 && x11 = x10 - 1 (4) f2653_0_ack_InvokeMethod(i52:0, i73:0) -> f730_0_ack_GT(i73:0, i52:0) :|: TRUE Arcs: (1) -> (1), (2), (3) (2) -> (4) (3) -> (1), (2) (4) -> (1), (2), (3) This digraph is fully evaluated! ---------------------------------------- (12) Obligation: Termination digraph: Nodes: (1) f730_0_ack_GT(i42:0, i44:0) -> f730_0_ack_GT(arith, i44:0) :|: i42:0 > 0 && i44:0 - 1 < i44:0 && i44:0 > 0 && arith = i42:0 - 1 (2) f730_0_ack_GT(x9, x10) -> f730_0_ack_GT(1, x11) :|: x10 > 0 && x9 < 1 && x11 = x10 - 1 (3) f2653_0_ack_InvokeMethod(i52:0, i73:0) -> f730_0_ack_GT(i73:0, i52:0) :|: TRUE (4) f730_0_ack_GT(x5, x6) -> f2653_0_ack_InvokeMethod(x7, x8) :|: x5 > 0 && x6 - 1 < x6 && x6 > 0 && x7 = x6 - 1 Arcs: (1) -> (1), (2), (4) (2) -> (1), (4) (3) -> (1), (2), (4) (4) -> (3) This digraph is fully evaluated! ---------------------------------------- (13) IntTRSCompressionProof (EQUIVALENT) Compressed rules. ---------------------------------------- (14) Obligation: Rules: f730_0_ack_GT(x9:0, x10:0) -> f730_0_ack_GT(1, x10:0 - 1) :|: x10:0 > 0 && x9:0 < 1 f730_0_ack_GT(x5:0, x6:0) -> f730_0_ack_GT(x8:0, x6:0 - 1) :|: x5:0 > 0 && x6:0 - 1 < x6:0 && x6:0 > 0 f730_0_ack_GT(i42:0:0, i44:0:0) -> f730_0_ack_GT(i42:0:0 - 1, i44:0:0) :|: i42:0:0 > 0 && i44:0:0 - 1 < i44:0:0 && i44:0:0 > 0 ---------------------------------------- (15) TempFilterProof (SOUND) Used the following sort dictionary for filtering: f730_0_ack_GT(VARIABLE, INTEGER) Replaced non-predefined constructor symbols by 0. ---------------------------------------- (16) Obligation: Rules: f730_0_ack_GT(x9:0, x10:0) -> f730_0_ack_GT(c, c1) :|: c1 = x10:0 - 1 && c = 1 && (x10:0 > 0 && x9:0 < 1) f730_0_ack_GT(x5:0, x6:0) -> f730_0_ack_GT(x8:0, c2) :|: c2 = x6:0 - 1 && (x5:0 > 0 && x6:0 - 1 < x6:0 && x6:0 > 0) f730_0_ack_GT(i42:0:0, i44:0:0) -> f730_0_ack_GT(c3, i44:0:0) :|: c3 = i42:0:0 - 1 && (i42:0:0 > 0 && i44:0:0 - 1 < i44:0:0 && i44:0:0 > 0) ---------------------------------------- (17) PolynomialOrderProcessor (EQUIVALENT) Found the following polynomial interpretation: [f730_0_ack_GT(x, x1)] = x1 The following rules are decreasing: f730_0_ack_GT(x9:0, x10:0) -> f730_0_ack_GT(c, c1) :|: c1 = x10:0 - 1 && c = 1 && (x10:0 > 0 && x9:0 < 1) f730_0_ack_GT(x5:0, x6:0) -> f730_0_ack_GT(x8:0, c2) :|: c2 = x6:0 - 1 && (x5:0 > 0 && x6:0 - 1 < x6:0 && x6:0 > 0) The following rules are bounded: f730_0_ack_GT(x9:0, x10:0) -> f730_0_ack_GT(c, c1) :|: c1 = x10:0 - 1 && c = 1 && (x10:0 > 0 && x9:0 < 1) f730_0_ack_GT(x5:0, x6:0) -> f730_0_ack_GT(x8:0, c2) :|: c2 = x6:0 - 1 && (x5:0 > 0 && x6:0 - 1 < x6:0 && x6:0 > 0) f730_0_ack_GT(i42:0:0, i44:0:0) -> f730_0_ack_GT(c3, i44:0:0) :|: c3 = i42:0:0 - 1 && (i42:0:0 > 0 && i44:0:0 - 1 < i44:0:0 && i44:0:0 > 0) ---------------------------------------- (18) Obligation: Rules: f730_0_ack_GT(i42:0:0, i44:0:0) -> f730_0_ack_GT(c3, i44:0:0) :|: c3 = i42:0:0 - 1 && (i42:0:0 > 0 && i44:0:0 - 1 < i44:0:0 && i44:0:0 > 0) ---------------------------------------- (19) PolynomialOrderProcessor (EQUIVALENT) Found the following polynomial interpretation: [f730_0_ack_GT(x, x1)] = x The following rules are decreasing: f730_0_ack_GT(i42:0:0, i44:0:0) -> f730_0_ack_GT(c3, i44:0:0) :|: c3 = i42:0:0 - 1 && (i42:0:0 > 0 && i44:0:0 - 1 < i44:0:0 && i44:0:0 > 0) The following rules are bounded: f730_0_ack_GT(i42:0:0, i44:0:0) -> f730_0_ack_GT(c3, i44:0:0) :|: c3 = i42:0:0 - 1 && (i42:0:0 > 0 && i44:0:0 - 1 < i44:0:0 && i44:0:0 > 0) ---------------------------------------- (20) YES