7.73/2.97 YES 7.73/2.99 proof of /export/starexec/sandbox2/benchmark/theBenchmark.jar 7.73/2.99 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 7.73/2.99 7.73/2.99 7.73/2.99 termination of the given Bare JBC problem could be proven: 7.73/2.99 7.73/2.99 (0) Bare JBC problem 7.73/2.99 (1) BareJBCToJBCProof [EQUIVALENT, 96 ms] 7.73/2.99 (2) JBC problem 7.73/2.99 (3) JBCToGraph [EQUIVALENT, 325 ms] 7.73/2.99 (4) JBCTerminationGraph 7.73/2.99 (5) TerminationGraphToSCCProof [SOUND, 0 ms] 7.73/2.99 (6) AND 7.73/2.99 (7) JBCTerminationSCC 7.73/2.99 (8) SCCToIRSProof [SOUND, 6 ms] 7.73/2.99 (9) IRSwT 7.73/2.99 (10) IRSFormatTransformerProof [EQUIVALENT, 0 ms] 7.73/2.99 (11) IRSwT 7.73/2.99 (12) IRSwTTerminationDigraphProof [EQUIVALENT, 65 ms] 7.73/2.99 (13) IRSwT 7.73/2.99 (14) IntTRSCompressionProof [EQUIVALENT, 0 ms] 7.73/2.99 (15) IRSwT 7.73/2.99 (16) TempFilterProof [SOUND, 34 ms] 7.73/2.99 (17) IntTRS 7.73/2.99 (18) PolynomialOrderProcessor [EQUIVALENT, 0 ms] 7.73/2.99 (19) IntTRS 7.73/2.99 (20) RankingReductionPairProof [EQUIVALENT, 6 ms] 7.73/2.99 (21) YES 7.73/2.99 (22) JBCTerminationSCC 7.73/2.99 (23) SCCToIRSProof [SOUND, 27 ms] 7.73/2.99 (24) IRSwT 7.73/2.99 (25) IRSFormatTransformerProof [EQUIVALENT, 0 ms] 7.73/2.99 (26) IRSwT 7.73/2.99 (27) IRSwTTerminationDigraphProof [EQUIVALENT, 39 ms] 7.73/2.99 (28) IRSwT 7.73/2.99 (29) IntTRSCompressionProof [EQUIVALENT, 0 ms] 7.73/2.99 (30) IRSwT 7.73/2.99 (31) TempFilterProof [SOUND, 45 ms] 7.73/2.99 (32) IntTRS 7.73/2.99 (33) PolynomialOrderProcessor [EQUIVALENT, 18 ms] 7.73/2.99 (34) YES 7.73/2.99 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (0) 7.73/2.99 Obligation: 7.73/2.99 need to prove termination of the following program: 7.73/2.99 public class List3 { 7.73/2.99 private List3 next; 7.73/2.99 7.73/2.99 void iterate() { 7.73/2.99 List3 current = this.next; 7.73/2.99 while (current != this) { 7.73/2.99 current = current.next; 7.73/2.99 } 7.73/2.99 } 7.73/2.99 7.73/2.99 public static void main(String[] args) { 7.73/2.99 //Create cyclic list: 7.73/2.99 int length = args.length; 7.73/2.99 List3 cur = new List3(); 7.73/2.99 List3 first = cur; 7.73/2.99 while (length-- > 0) { 7.73/2.99 cur.next = new List3(); 7.73/2.99 cur = cur.next; 7.73/2.99 } 7.73/2.99 cur.next = first; 7.73/2.99 7.73/2.99 cur.iterate(); 7.73/2.99 } 7.73/2.99 } 7.73/2.99 7.73/2.99 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (1) BareJBCToJBCProof (EQUIVALENT) 7.73/2.99 initialized classpath 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (2) 7.73/2.99 Obligation: 7.73/2.99 need to prove termination of the following program: 7.73/2.99 public class List3 { 7.73/2.99 private List3 next; 7.73/2.99 7.73/2.99 void iterate() { 7.73/2.99 List3 current = this.next; 7.73/2.99 while (current != this) { 7.73/2.99 current = current.next; 7.73/2.99 } 7.73/2.99 } 7.73/2.99 7.73/2.99 public static void main(String[] args) { 7.73/2.99 //Create cyclic list: 7.73/2.99 int length = args.length; 7.73/2.99 List3 cur = new List3(); 7.73/2.99 List3 first = cur; 7.73/2.99 while (length-- > 0) { 7.73/2.99 cur.next = new List3(); 7.73/2.99 cur = cur.next; 7.73/2.99 } 7.73/2.99 cur.next = first; 7.73/2.99 7.73/2.99 cur.iterate(); 7.73/2.99 } 7.73/2.99 } 7.73/2.99 7.73/2.99 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (3) JBCToGraph (EQUIVALENT) 7.73/2.99 Constructed TerminationGraph. 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (4) 7.73/2.99 Obligation: 7.73/2.99 Termination Graph based on JBC Program: 7.73/2.99 List3.main([Ljava/lang/String;)V: Graph of 81 nodes with 2 SCCs. 7.73/2.99 7.73/2.99 7.73/2.99 7.73/2.99 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (5) TerminationGraphToSCCProof (SOUND) 7.73/2.99 Splitted TerminationGraph to 2 SCCss. 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (6) 7.73/2.99 Complex Obligation (AND) 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (7) 7.73/2.99 Obligation: 7.73/2.99 SCC of termination graph based on JBC Program. 7.73/2.99 SCC contains nodes from the following methods: List3.main([Ljava/lang/String;)V 7.73/2.99 SCC calls the following helper methods: 7.73/2.99 Performed SCC analyses: 7.73/2.99 *Used field analysis yielded the following read fields: 7.73/2.99 *List3: [next] 7.73/2.99 *Marker field analysis yielded the following relations that could be markers: 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (8) SCCToIRSProof (SOUND) 7.73/2.99 Transformed FIGraph SCCs to intTRSs. Log: 7.73/2.99 Generated rules. Obtained 17 IRulesP rules: 7.73/2.99 f1360_0_iterate_EQ(EOS(STATIC_1360), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o126, o127[List3.next]o125) -> f1365_0_iterate_Load(EOS(STATIC_1365), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o126, o127[List3.next]o125) :|: TRUE 7.73/2.99 f1365_0_iterate_Load(EOS(STATIC_1365), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o126, o127[List3.next]o125) -> f1375_0_iterate_FieldAccess(EOS(STATIC_1375), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o126, o127[List3.next]o125) :|: TRUE 7.73/2.99 f1375_0_iterate_FieldAccess(EOS(STATIC_1375), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o126, o127[List3.next]o125) -> f1391_0_iterate_FieldAccess(EOS(STATIC_1391), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o125, o127[List3.next]o126) :|: o126[List3.next]o127 > 0 && o127[List3.next]o126 > 0 7.73/2.99 f1375_0_iterate_FieldAccess(EOS(STATIC_1375), o161[List3.next]o161, o161[List3.next]o125, o161[List3.next]o161, o161[List3.next]o125) -> f1392_0_iterate_FieldAccess(EOS(STATIC_1392), o161[List3.next]o125, o161[List3.next]o161) :|: TRUE 7.73/2.99 f1391_0_iterate_FieldAccess(EOS(STATIC_1391), o126[List3.next]o162, o126[List3.next]o125, o162[List3.next]o125, o162[List3.next]o126) -> f1396_0_iterate_FieldAccess(EOS(STATIC_1396), o126[List3.next]o125, o126[List3.next]o162, o163[List3.next]o125, o163[List3.next]o126) :|: o163[List3.next]o125 < o162[List3.next]o125 && o162[List3.next]o125 >= 0 && o163[List3.next]o126 < o162[List3.next]o126 && o162[List3.next]o126 >= 0 7.73/2.99 f1396_0_iterate_FieldAccess(EOS(STATIC_1396), o126[List3.next]o125, o126[List3.next]o162, o163[List3.next]o125, o163[List3.next]o126) -> f1401_0_iterate_Store(EOS(STATIC_1401), o126[List3.next]o125, o163[List3.next]o125, o163[List3.next]o126, o126[List3.next]o163) :|: o126[List3.next]o163 > o126[List3.next]o162 && o126[List3.next]o162 >= 0 7.73/2.99 f1401_0_iterate_Store(EOS(STATIC_1401), o126[List3.next]o125, o163[List3.next]o125, o163[List3.next]o126, o126[List3.next]o163) -> f1409_0_iterate_JMP(EOS(STATIC_1409), o126[List3.next]o125, o163[List3.next]o125, o163[List3.next]o126, o126[List3.next]o163) :|: TRUE 7.73/2.99 f1409_0_iterate_JMP(EOS(STATIC_1409), o126[List3.next]o125, o163[List3.next]o125, o163[List3.next]o126, o126[List3.next]o163) -> f1427_0_iterate_Load(EOS(STATIC_1427), o126[List3.next]o125, o163[List3.next]o125, o163[List3.next]o126, o126[List3.next]o163) :|: TRUE 7.73/2.99 f1427_0_iterate_Load(EOS(STATIC_1427), o126[List3.next]o125, o163[List3.next]o125, o163[List3.next]o126, o126[List3.next]o163) -> f1308_0_iterate_Load(EOS(STATIC_1308), o126[List3.next]o163, o126[List3.next]o125, o163[List3.next]o125, o163[List3.next]o126) :|: TRUE 7.73/2.99 f1308_0_iterate_Load(EOS(STATIC_1308), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o125, o127[List3.next]o126) -> f1315_0_iterate_Load(EOS(STATIC_1315), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o125, o127[List3.next]o126) :|: TRUE 7.73/2.99 f1315_0_iterate_Load(EOS(STATIC_1315), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o125, o127[List3.next]o126) -> f1343_0_iterate_EQ(EOS(STATIC_1343), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o125, o127[List3.next]o126) :|: TRUE 7.73/2.99 f1343_0_iterate_EQ(EOS(STATIC_1343), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o125, o127[List3.next]o126) -> f1360_0_iterate_EQ(EOS(STATIC_1360), o126[List3.next]o127, o126[List3.next]o125, o127[List3.next]o126, o127[List3.next]o125) :|: o127[List3.next]o125 > 0 7.73/2.99 f1392_0_iterate_FieldAccess(EOS(STATIC_1392), o164[List3.next]o125, o164[List3.next]o164) -> f1398_0_iterate_FieldAccess(EOS(STATIC_1398), o165[List3.next]o125, o165[List3.next]o164) :|: o165[List3.next]o125 < o164[List3.next]o125 && o164[List3.next]o125 >= 0 && o165[List3.next]o164 < o164[List3.next]o164 && o164[List3.next]o164 >= 0 7.73/2.99 f1398_0_iterate_FieldAccess(EOS(STATIC_1398), o165[List3.next]o125, o165[List3.next]o164) -> f1406_0_iterate_Store(EOS(STATIC_1406), o165[List3.next]o125, o165[List3.next]o164) :|: TRUE 7.73/2.99 f1406_0_iterate_Store(EOS(STATIC_1406), o165[List3.next]o125, o165[List3.next]o164) -> f1412_0_iterate_JMP(EOS(STATIC_1412), o165[List3.next]o125, o165[List3.next]o164) :|: TRUE 7.73/2.99 f1412_0_iterate_JMP(EOS(STATIC_1412), o165[List3.next]o125, o165[List3.next]o164) -> f1446_0_iterate_Load(EOS(STATIC_1446), o165[List3.next]o125, o165[List3.next]o164) :|: TRUE 7.73/2.99 f1446_0_iterate_Load(EOS(STATIC_1446), o165[List3.next]o125, o165[List3.next]o164) -> f1308_0_iterate_Load(EOS(STATIC_1308), o164[List3.next]o165, o164[List3.next]o125, o165[List3.next]o125, o165[List3.next]o164) :|: o164[List3.next]o165 = 1 7.73/2.99 Combined rules. Obtained 2 IRulesP rules: 7.73/2.99 f1360_0_iterate_EQ(EOS(STATIC_1360), o126[List3.next]o127:0, o126[List3.next]o125:0, o126[List3.next]o127:0, o126[List3.next]o125:0) -> f1360_0_iterate_EQ(EOS(STATIC_1360), 1, o164[List3.next]o125:0, o165[List3.next]o164:0, o165[List3.next]o125:0) :|: o126[List3.next]o125:0 > -1 && o165[List3.next]o125:0 < o126[List3.next]o125:0 && o165[List3.next]o164:0 < o126[List3.next]o127:0 && o165[List3.next]o125:0 > 0 && o126[List3.next]o127:0 > -1 7.73/2.99 f1360_0_iterate_EQ(EOS(STATIC_1360), o126[List3.next]o127:0, o126[List3.next]o125:0, o127[List3.next]o126:0, o127[List3.next]o125:0) -> f1360_0_iterate_EQ(EOS(STATIC_1360), o126[List3.next]o163:0, o126[List3.next]o125:0, o163[List3.next]o126:0, o163[List3.next]o125:0) :|: o127[List3.next]o126:0 > 0 && o126[List3.next]o127:0 > 0 && o127[List3.next]o125:0 > -1 && o163[List3.next]o125:0 < o127[List3.next]o125:0 && o163[List3.next]o126:0 < o127[List3.next]o126:0 && o163[List3.next]o125:0 > 0 && o126[List3.next]o163:0 > o126[List3.next]o127:0 7.73/2.99 Filtered constant ground arguments: 7.73/2.99 f1360_0_iterate_EQ(x1, x2, x3, x4, x5) -> f1360_0_iterate_EQ(x2, x3, x4, x5) 7.73/2.99 EOS(x1) -> EOS 7.73/2.99 Finished conversion. Obtained 2 rules.P rules: 7.73/2.99 f1360_0_iterate_EQ(o126[List3.next]o127:0, o126[List3.next]o125:0, o126[List3.next]o127:0, o126[List3.next]o125:0) -> f1360_0_iterate_EQ(1, o164[List3.next]o125:0, o165[List3.next]o164:0, o165[List3.next]o125:0) :|: o165[List3.next]o125:0 < o126[List3.next]o125:0 && o126[List3.next]o125:0 > -1 && o165[List3.next]o164:0 < o126[List3.next]o127:0 && o126[List3.next]o127:0 > -1 && o165[List3.next]o125:0 > 0 7.73/2.99 f1360_0_iterate_EQ(o126[List3.next]o127:0, o126[List3.next]o125:0, o127[List3.next]o126:0, o127[List3.next]o125:0) -> f1360_0_iterate_EQ(o126[List3.next]o163:0, o126[List3.next]o125:0, o163[List3.next]o126:0, o163[List3.next]o125:0) :|: o126[List3.next]o127:0 > 0 && o127[List3.next]o126:0 > 0 && o127[List3.next]o125:0 > -1 && o163[List3.next]o125:0 < o127[List3.next]o125:0 && o163[List3.next]o126:0 < o127[List3.next]o126:0 && o126[List3.next]o163:0 > o126[List3.next]o127:0 && o163[List3.next]o125:0 > 0 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (9) 7.73/2.99 Obligation: 7.73/2.99 Rules: 7.73/2.99 f1360_0_iterate_EQ(o126[List3.next]o127:0, o126[List3.next]o125:0, o126[List3.next]o127:0, o126[List3.next]o125:0) -> f1360_0_iterate_EQ(1, o164[List3.next]o125:0, o165[List3.next]o164:0, o165[List3.next]o125:0) :|: o165[List3.next]o125:0 < o126[List3.next]o125:0 && o126[List3.next]o125:0 > -1 && o165[List3.next]o164:0 < o126[List3.next]o127:0 && o126[List3.next]o127:0 > -1 && o165[List3.next]o125:0 > 0 7.73/2.99 f1360_0_iterate_EQ(x, x1, x2, x3) -> f1360_0_iterate_EQ(x4, x1, x5, x6) :|: x > 0 && x2 > 0 && x3 > -1 && x6 < x3 && x5 < x2 && x4 > x && x6 > 0 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (10) IRSFormatTransformerProof (EQUIVALENT) 7.73/2.99 Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (11) 7.73/2.99 Obligation: 7.73/2.99 Rules: 7.73/2.99 f1360_0_iterate_EQ(o126[List3.next]o127:0, o126[List3.next]o125:0, o126[List3.next]o127:0, o126[List3.next]o125:0) -> f1360_0_iterate_EQ(1, o164[List3.next]o125:0, o165[List3.next]o164:0, o165[List3.next]o125:0) :|: o165[List3.next]o125:0 < o126[List3.next]o125:0 && o126[List3.next]o125:0 > -1 && o165[List3.next]o164:0 < o126[List3.next]o127:0 && o126[List3.next]o127:0 > -1 && o165[List3.next]o125:0 > 0 7.73/2.99 f1360_0_iterate_EQ(x, x1, x2, x3) -> f1360_0_iterate_EQ(x4, x1, x5, x6) :|: x > 0 && x2 > 0 && x3 > -1 && x6 < x3 && x5 < x2 && x4 > x && x6 > 0 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (12) IRSwTTerminationDigraphProof (EQUIVALENT) 7.73/2.99 Constructed termination digraph! 7.73/2.99 Nodes: 7.73/2.99 (1) f1360_0_iterate_EQ(o126[List3.next]o127:0, o126[List3.next]o125:0, o126[List3.next]o127:0, o126[List3.next]o125:0) -> f1360_0_iterate_EQ(1, o164[List3.next]o125:0, o165[List3.next]o164:0, o165[List3.next]o125:0) :|: o165[List3.next]o125:0 < o126[List3.next]o125:0 && o126[List3.next]o125:0 > -1 && o165[List3.next]o164:0 < o126[List3.next]o127:0 && o126[List3.next]o127:0 > -1 && o165[List3.next]o125:0 > 0 7.73/2.99 (2) f1360_0_iterate_EQ(x, x1, x2, x3) -> f1360_0_iterate_EQ(x4, x1, x5, x6) :|: x > 0 && x2 > 0 && x3 > -1 && x6 < x3 && x5 < x2 && x4 > x && x6 > 0 7.73/2.99 7.73/2.99 Arcs: 7.73/2.99 (1) -> (1), (2) 7.73/2.99 (2) -> (1), (2) 7.73/2.99 7.73/2.99 This digraph is fully evaluated! 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (13) 7.73/2.99 Obligation: 7.73/2.99 7.73/2.99 Termination digraph: 7.73/2.99 Nodes: 7.73/2.99 (1) f1360_0_iterate_EQ(o126[List3.next]o127:0, o126[List3.next]o125:0, o126[List3.next]o127:0, o126[List3.next]o125:0) -> f1360_0_iterate_EQ(1, o164[List3.next]o125:0, o165[List3.next]o164:0, o165[List3.next]o125:0) :|: o165[List3.next]o125:0 < o126[List3.next]o125:0 && o126[List3.next]o125:0 > -1 && o165[List3.next]o164:0 < o126[List3.next]o127:0 && o126[List3.next]o127:0 > -1 && o165[List3.next]o125:0 > 0 7.73/2.99 (2) f1360_0_iterate_EQ(x, x1, x2, x3) -> f1360_0_iterate_EQ(x4, x1, x5, x6) :|: x > 0 && x2 > 0 && x3 > -1 && x6 < x3 && x5 < x2 && x4 > x && x6 > 0 7.73/2.99 7.73/2.99 Arcs: 7.73/2.99 (1) -> (1), (2) 7.73/2.99 (2) -> (1), (2) 7.73/2.99 7.73/2.99 This digraph is fully evaluated! 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (14) IntTRSCompressionProof (EQUIVALENT) 7.73/2.99 Compressed rules. 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (15) 7.73/2.99 Obligation: 7.73/2.99 Rules: 7.73/2.99 f1360_0_iterate_EQ(x:0, x1:0, x2:0, x3:0) -> f1360_0_iterate_EQ(x4:0, x1:0, x5:0, x6:0) :|: x:0 < x4:0 && x6:0 > 0 && x5:0 < x2:0 && x6:0 < x3:0 && x3:0 > -1 && x2:0 > 0 && x:0 > 0 7.73/2.99 f1360_0_iterate_EQ(o126[List3.next]o127:0:0, o126[List3.next]o125:0:0, o126[List3.next]o127:0:0, o126[List3.next]o125:0:0) -> f1360_0_iterate_EQ(1, o164[List3.next]o125:0:0, o165[List3.next]o164:0:0, o165[List3.next]o125:0:0) :|: o126[List3.next]o127:0:0 > -1 && o165[List3.next]o125:0:0 > 0 && o165[List3.next]o164:0:0 < o126[List3.next]o127:0:0 && o126[List3.next]o125:0:0 > -1 && o165[List3.next]o125:0:0 < o126[List3.next]o125:0:0 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (16) TempFilterProof (SOUND) 7.73/2.99 Used the following sort dictionary for filtering: 7.73/2.99 f1360_0_iterate_EQ(VARIABLE, VARIABLE, INTEGER, INTEGER) 7.73/2.99 Replaced non-predefined constructor symbols by 0. 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (17) 7.73/2.99 Obligation: 7.73/2.99 Rules: 7.73/2.99 f1360_0_iterate_EQ(x:0, x1:0, x2:0, x3:0) -> f1360_0_iterate_EQ(x4:0, x1:0, x5:0, x6:0) :|: x:0 < x4:0 && x6:0 > 0 && x5:0 < x2:0 && x6:0 < x3:0 && x3:0 > -1 && x2:0 > 0 && x:0 > 0 7.73/2.99 f1360_0_iterate_EQ(o126[List3.next]o127:0:0, o126[List3.next]o125:0:0, o126[List3.next]o127:0:0, o126[List3.next]o125:0:0) -> f1360_0_iterate_EQ(c, o164[List3.next]o125:0:0, o165[List3.next]o164:0:0, o165[List3.next]o125:0:0) :|: c = 1 && (o126[List3.next]o127:0:0 > -1 && o165[List3.next]o125:0:0 > 0 && o165[List3.next]o164:0:0 < o126[List3.next]o127:0:0 && o126[List3.next]o125:0:0 > -1 && o165[List3.next]o125:0:0 < o126[List3.next]o125:0:0) 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (18) PolynomialOrderProcessor (EQUIVALENT) 7.73/2.99 Found the following polynomial interpretation: 7.73/2.99 [f1360_0_iterate_EQ(x, x1, x2, x3)] = -1 + x2 7.73/2.99 7.73/2.99 The following rules are decreasing: 7.73/2.99 f1360_0_iterate_EQ(x:0, x1:0, x2:0, x3:0) -> f1360_0_iterate_EQ(x4:0, x1:0, x5:0, x6:0) :|: x:0 < x4:0 && x6:0 > 0 && x5:0 < x2:0 && x6:0 < x3:0 && x3:0 > -1 && x2:0 > 0 && x:0 > 0 7.73/2.99 f1360_0_iterate_EQ(o126[List3.next]o127:0:0, o126[List3.next]o125:0:0, o126[List3.next]o127:0:0, o126[List3.next]o125:0:0) -> f1360_0_iterate_EQ(c, o164[List3.next]o125:0:0, o165[List3.next]o164:0:0, o165[List3.next]o125:0:0) :|: c = 1 && (o126[List3.next]o127:0:0 > -1 && o165[List3.next]o125:0:0 > 0 && o165[List3.next]o164:0:0 < o126[List3.next]o127:0:0 && o126[List3.next]o125:0:0 > -1 && o165[List3.next]o125:0:0 < o126[List3.next]o125:0:0) 7.73/2.99 The following rules are bounded: 7.73/2.99 f1360_0_iterate_EQ(x:0, x1:0, x2:0, x3:0) -> f1360_0_iterate_EQ(x4:0, x1:0, x5:0, x6:0) :|: x:0 < x4:0 && x6:0 > 0 && x5:0 < x2:0 && x6:0 < x3:0 && x3:0 > -1 && x2:0 > 0 && x:0 > 0 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (19) 7.73/2.99 Obligation: 7.73/2.99 Rules: 7.73/2.99 f1360_0_iterate_EQ(o126[List3.next]o127:0:0, o126[List3.next]o125:0:0, o126[List3.next]o127:0:0, o126[List3.next]o125:0:0) -> f1360_0_iterate_EQ(c, o164[List3.next]o125:0:0, o165[List3.next]o164:0:0, o165[List3.next]o125:0:0) :|: c = 1 && (o126[List3.next]o127:0:0 > -1 && o165[List3.next]o125:0:0 > 0 && o165[List3.next]o164:0:0 < o126[List3.next]o127:0:0 && o126[List3.next]o125:0:0 > -1 && o165[List3.next]o125:0:0 < o126[List3.next]o125:0:0) 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (20) RankingReductionPairProof (EQUIVALENT) 7.73/2.99 Interpretation: 7.73/2.99 [ f1360_0_iterate_EQ ] = f1360_0_iterate_EQ_4 7.73/2.99 7.73/2.99 The following rules are decreasing: 7.73/2.99 f1360_0_iterate_EQ(o126[List3.next]o127:0:0, o126[List3.next]o125:0:0, o126[List3.next]o127:0:0, o126[List3.next]o125:0:0) -> f1360_0_iterate_EQ(c, o164[List3.next]o125:0:0, o165[List3.next]o164:0:0, o165[List3.next]o125:0:0) :|: c = 1 && (o126[List3.next]o127:0:0 > -1 && o165[List3.next]o125:0:0 > 0 && o165[List3.next]o164:0:0 < o126[List3.next]o127:0:0 && o126[List3.next]o125:0:0 > -1 && o165[List3.next]o125:0:0 < o126[List3.next]o125:0:0) 7.73/2.99 7.73/2.99 The following rules are bounded: 7.73/2.99 f1360_0_iterate_EQ(o126[List3.next]o127:0:0, o126[List3.next]o125:0:0, o126[List3.next]o127:0:0, o126[List3.next]o125:0:0) -> f1360_0_iterate_EQ(c, o164[List3.next]o125:0:0, o165[List3.next]o164:0:0, o165[List3.next]o125:0:0) :|: c = 1 && (o126[List3.next]o127:0:0 > -1 && o165[List3.next]o125:0:0 > 0 && o165[List3.next]o164:0:0 < o126[List3.next]o127:0:0 && o126[List3.next]o125:0:0 > -1 && o165[List3.next]o125:0:0 < o126[List3.next]o125:0:0) 7.73/2.99 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (21) 7.73/2.99 YES 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (22) 7.73/2.99 Obligation: 7.73/2.99 SCC of termination graph based on JBC Program. 7.73/2.99 SCC contains nodes from the following methods: List3.main([Ljava/lang/String;)V 7.73/2.99 SCC calls the following helper methods: 7.73/2.99 Performed SCC analyses: 7.73/2.99 *Used field analysis yielded the following read fields: 7.73/2.99 *List3: [next] 7.73/2.99 *Marker field analysis yielded the following relations that could be markers: 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (23) SCCToIRSProof (SOUND) 7.73/2.99 Transformed FIGraph SCCs to intTRSs. Log: 7.73/2.99 Generated rules. Obtained 25 IRulesP rules: 7.73/2.99 f955_0_main_Inc(EOS(STATIC_955), i80, i80, o81[List3.next]o80) -> f957_0_main_LE(EOS(STATIC_957), i80 + -1, i80, o81[List3.next]o80) :|: TRUE 7.73/2.99 f957_0_main_LE(EOS(STATIC_957), i88, i91, o81[List3.next]o80) -> f1012_0_main_LE(EOS(STATIC_1012), i88, i91, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1012_0_main_LE(EOS(STATIC_1012), i88, i91, o81[List3.next]o80) -> f1018_0_main_Load(EOS(STATIC_1018), i88, o81[List3.next]o80) :|: i91 > 0 7.73/2.99 f1018_0_main_Load(EOS(STATIC_1018), i88, o81[List3.next]o80) -> f1023_0_main_New(EOS(STATIC_1023), i88, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1023_0_main_New(EOS(STATIC_1023), i88, o81[List3.next]o80) -> f1028_0_main_Duplicate(EOS(STATIC_1028), i88, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1028_0_main_Duplicate(EOS(STATIC_1028), i88, o81[List3.next]o80) -> f1041_0_main_InvokeMethod(EOS(STATIC_1041), i88, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1041_0_main_InvokeMethod(EOS(STATIC_1041), i88, o81[List3.next]o80) -> f1058_0__init__Load(EOS(STATIC_1058), i88, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1058_0__init__Load(EOS(STATIC_1058), i88, o81[List3.next]o80) -> f1063_0__init__InvokeMethod(EOS(STATIC_1063), i88, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1063_0__init__InvokeMethod(EOS(STATIC_1063), i88, o81[List3.next]o80) -> f1066_0__init__Return(EOS(STATIC_1066), i88, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1066_0__init__Return(EOS(STATIC_1066), i88, o81[List3.next]o80) -> f1075_0_main_FieldAccess(EOS(STATIC_1075), i88, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1075_0_main_FieldAccess(EOS(STATIC_1075), i88, o81[List3.next]o80) -> f1089_0_main_FieldAccess(EOS(STATIC_1089), i88, o81[List3.next]o80) :|: o81[List3.next]o80 > 0 7.73/2.99 f1075_0_main_FieldAccess(EOS(STATIC_1075), i88, o101[List3.next]o101) -> f1091_0_main_FieldAccess(EOS(STATIC_1091), i88) :|: TRUE 7.73/2.99 f1089_0_main_FieldAccess(EOS(STATIC_1089), i88, o81[List3.next]o80) -> f1107_0_main_Load(EOS(STATIC_1107), i88, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1107_0_main_Load(EOS(STATIC_1107), i88, o81[List3.next]o80) -> f1119_0_main_FieldAccess(EOS(STATIC_1119), i88, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1119_0_main_FieldAccess(EOS(STATIC_1119), i88, o81[List3.next]o80) -> f1134_0_main_Store(EOS(STATIC_1134), i88, o81[List3.next]o85) :|: o81[List3.next]o85 > o81[List3.next]o80 && o81[List3.next]o80 >= 0 7.73/2.99 f1134_0_main_Store(EOS(STATIC_1134), i88, o81[List3.next]o85) -> f1146_0_main_JMP(EOS(STATIC_1146), i88, o81[List3.next]o85) :|: TRUE 7.73/2.99 f1146_0_main_JMP(EOS(STATIC_1146), i88, o81[List3.next]o85) -> f1206_0_main_Load(EOS(STATIC_1206), i88, o81[List3.next]o85) :|: TRUE 7.73/2.99 f1206_0_main_Load(EOS(STATIC_1206), i88, o81[List3.next]o85) -> f948_0_main_Load(EOS(STATIC_948), i88, o81[List3.next]o85) :|: TRUE 7.73/2.99 f948_0_main_Load(EOS(STATIC_948), i80, o81[List3.next]o80) -> f955_0_main_Inc(EOS(STATIC_955), i80, i80, o81[List3.next]o80) :|: TRUE 7.73/2.99 f1091_0_main_FieldAccess(EOS(STATIC_1091), i88) -> f1110_0_main_Load(EOS(STATIC_1110), i88) :|: TRUE 7.73/2.99 f1110_0_main_Load(EOS(STATIC_1110), i88) -> f1123_0_main_FieldAccess(EOS(STATIC_1123), i88) :|: TRUE 7.73/2.99 f1123_0_main_FieldAccess(EOS(STATIC_1123), i88) -> f1138_0_main_Store(EOS(STATIC_1138), i88) :|: TRUE 7.73/2.99 f1138_0_main_Store(EOS(STATIC_1138), i88) -> f1150_0_main_JMP(EOS(STATIC_1150), i88) :|: TRUE 7.73/2.99 f1150_0_main_JMP(EOS(STATIC_1150), i88) -> f1269_0_main_Load(EOS(STATIC_1269), i88) :|: TRUE 7.73/2.99 f1269_0_main_Load(EOS(STATIC_1269), i88) -> f948_0_main_Load(EOS(STATIC_948), i88, o101[List3.next]o85) :|: o101[List3.next]o85 = 1 7.73/2.99 Combined rules. Obtained 2 IRulesP rules: 7.73/2.99 f955_0_main_Inc(EOS(STATIC_955), i80:0, i80:0, o81[List3.next]o80:0) -> f955_0_main_Inc(EOS(STATIC_955), i80:0 - 1, i80:0 - 1, 1) :|: i80:0 > 0 7.73/2.99 f955_0_main_Inc(EOS(STATIC_955), i80:0, i80:0, o81[List3.next]o80:0) -> f955_0_main_Inc(EOS(STATIC_955), i80:0 - 1, i80:0 - 1, o81[List3.next]o85:0) :|: o81[List3.next]o80:0 > 0 && o81[List3.next]o85:0 > o81[List3.next]o80:0 && i80:0 > 0 7.73/2.99 Filtered constant ground arguments: 7.73/2.99 f955_0_main_Inc(x1, x2, x3, x4) -> f955_0_main_Inc(x2, x3, x4) 7.73/2.99 EOS(x1) -> EOS 7.73/2.99 Filtered duplicate arguments: 7.73/2.99 f955_0_main_Inc(x1, x2, x3) -> f955_0_main_Inc(x2, x3) 7.73/2.99 Finished conversion. Obtained 2 rules.P rules: 7.73/2.99 f955_0_main_Inc(i80:0, o81[List3.next]o80:0) -> f955_0_main_Inc(i80:0 - 1, 1) :|: i80:0 > 0 7.73/2.99 f955_0_main_Inc(i80:0, o81[List3.next]o80:0) -> f955_0_main_Inc(i80:0 - 1, o81[List3.next]o85:0) :|: o81[List3.next]o85:0 > o81[List3.next]o80:0 && i80:0 > 0 && o81[List3.next]o80:0 > 0 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (24) 7.73/2.99 Obligation: 7.73/2.99 Rules: 7.73/2.99 f955_0_main_Inc(i80:0, o81[List3.next]o80:0) -> f955_0_main_Inc(i80:0 - 1, 1) :|: i80:0 > 0 7.73/2.99 f955_0_main_Inc(x, x1) -> f955_0_main_Inc(x - 1, x2) :|: x2 > x1 && x > 0 && x1 > 0 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (25) IRSFormatTransformerProof (EQUIVALENT) 7.73/2.99 Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (26) 7.73/2.99 Obligation: 7.73/2.99 Rules: 7.73/2.99 f955_0_main_Inc(i80:0, o81[List3.next]o80:0) -> f955_0_main_Inc(arith, 1) :|: i80:0 > 0 && arith = i80:0 - 1 7.73/2.99 f955_0_main_Inc(x3, x4) -> f955_0_main_Inc(x5, x6) :|: x6 > x4 && x3 > 0 && x4 > 0 && x5 = x3 - 1 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (27) IRSwTTerminationDigraphProof (EQUIVALENT) 7.73/2.99 Constructed termination digraph! 7.73/2.99 Nodes: 7.73/2.99 (1) f955_0_main_Inc(i80:0, o81[List3.next]o80:0) -> f955_0_main_Inc(arith, 1) :|: i80:0 > 0 && arith = i80:0 - 1 7.73/2.99 (2) f955_0_main_Inc(x3, x4) -> f955_0_main_Inc(x5, x6) :|: x6 > x4 && x3 > 0 && x4 > 0 && x5 = x3 - 1 7.73/2.99 7.73/2.99 Arcs: 7.73/2.99 (1) -> (1), (2) 7.73/2.99 (2) -> (1), (2) 7.73/2.99 7.73/2.99 This digraph is fully evaluated! 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (28) 7.73/2.99 Obligation: 7.73/2.99 7.73/2.99 Termination digraph: 7.73/2.99 Nodes: 7.73/2.99 (1) f955_0_main_Inc(i80:0, o81[List3.next]o80:0) -> f955_0_main_Inc(arith, 1) :|: i80:0 > 0 && arith = i80:0 - 1 7.73/2.99 (2) f955_0_main_Inc(x3, x4) -> f955_0_main_Inc(x5, x6) :|: x6 > x4 && x3 > 0 && x4 > 0 && x5 = x3 - 1 7.73/2.99 7.73/2.99 Arcs: 7.73/2.99 (1) -> (1), (2) 7.73/2.99 (2) -> (1), (2) 7.73/2.99 7.73/2.99 This digraph is fully evaluated! 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (29) IntTRSCompressionProof (EQUIVALENT) 7.73/2.99 Compressed rules. 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (30) 7.73/2.99 Obligation: 7.73/2.99 Rules: 7.73/2.99 f955_0_main_Inc(i80:0:0, o81[List3.next]o80:0:0) -> f955_0_main_Inc(i80:0:0 - 1, 1) :|: i80:0:0 > 0 7.73/2.99 f955_0_main_Inc(x3:0, x4:0) -> f955_0_main_Inc(x3:0 - 1, x6:0) :|: x6:0 > x4:0 && x3:0 > 0 && x4:0 > 0 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (31) TempFilterProof (SOUND) 7.73/2.99 Used the following sort dictionary for filtering: 7.73/2.99 f955_0_main_Inc(INTEGER, VARIABLE) 7.73/2.99 Replaced non-predefined constructor symbols by 0. 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (32) 7.73/2.99 Obligation: 7.73/2.99 Rules: 7.73/2.99 f955_0_main_Inc(i80:0:0, o81[List3.next]o80:0:0) -> f955_0_main_Inc(c, c1) :|: c1 = 1 && c = i80:0:0 - 1 && i80:0:0 > 0 7.73/2.99 f955_0_main_Inc(x3:0, x4:0) -> f955_0_main_Inc(c2, x6:0) :|: c2 = x3:0 - 1 && (x6:0 > x4:0 && x3:0 > 0 && x4:0 > 0) 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (33) PolynomialOrderProcessor (EQUIVALENT) 7.73/2.99 Found the following polynomial interpretation: 7.73/2.99 [f955_0_main_Inc(x, x1)] = x 7.73/2.99 7.73/2.99 The following rules are decreasing: 7.73/2.99 f955_0_main_Inc(i80:0:0, o81[List3.next]o80:0:0) -> f955_0_main_Inc(c, c1) :|: c1 = 1 && c = i80:0:0 - 1 && i80:0:0 > 0 7.73/2.99 f955_0_main_Inc(x3:0, x4:0) -> f955_0_main_Inc(c2, x6:0) :|: c2 = x3:0 - 1 && (x6:0 > x4:0 && x3:0 > 0 && x4:0 > 0) 7.73/2.99 The following rules are bounded: 7.73/2.99 f955_0_main_Inc(i80:0:0, o81[List3.next]o80:0:0) -> f955_0_main_Inc(c, c1) :|: c1 = 1 && c = i80:0:0 - 1 && i80:0:0 > 0 7.73/2.99 f955_0_main_Inc(x3:0, x4:0) -> f955_0_main_Inc(c2, x6:0) :|: c2 = x3:0 - 1 && (x6:0 > x4:0 && x3:0 > 0 && x4:0 > 0) 7.73/2.99 7.73/2.99 ---------------------------------------- 7.73/2.99 7.73/2.99 (34) 7.73/2.99 YES 7.73/3.03 EOF