8.22/3.07 YES 8.22/3.09 proof of /export/starexec/sandbox/benchmark/theBenchmark.jar 8.22/3.09 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 8.22/3.09 8.22/3.09 8.22/3.09 termination of the given Bare JBC problem could be proven: 8.22/3.09 8.22/3.09 (0) Bare JBC problem 8.22/3.09 (1) BareJBCToJBCProof [EQUIVALENT, 100 ms] 8.22/3.09 (2) JBC problem 8.22/3.09 (3) JBCToGraph [EQUIVALENT, 406 ms] 8.22/3.09 (4) JBCTerminationGraph 8.22/3.09 (5) TerminationGraphToSCCProof [SOUND, 0 ms] 8.22/3.09 (6) AND 8.22/3.09 (7) JBCTerminationSCC 8.22/3.09 (8) SCCToQDPProof [SOUND, 258 ms] 8.22/3.09 (9) QDP 8.22/3.09 (10) QDPSizeChangeProof [EQUIVALENT, 0 ms] 8.22/3.09 (11) YES 8.22/3.09 (12) JBCTerminationSCC 8.22/3.09 (13) SCCToIRSProof [SOUND, 49 ms] 8.22/3.09 (14) IRSwT 8.22/3.09 (15) IRSFormatTransformerProof [EQUIVALENT, 0 ms] 8.22/3.09 (16) IRSwT 8.22/3.09 (17) IRSwTTerminationDigraphProof [EQUIVALENT, 42 ms] 8.22/3.09 (18) IRSwT 8.22/3.09 (19) IntTRSCompressionProof [EQUIVALENT, 0 ms] 8.22/3.09 (20) IRSwT 8.22/3.09 (21) TempFilterProof [SOUND, 35 ms] 8.22/3.09 (22) IntTRS 8.22/3.09 (23) PolynomialOrderProcessor [EQUIVALENT, 15 ms] 8.22/3.09 (24) YES 8.22/3.09 8.22/3.09 8.22/3.09 ---------------------------------------- 8.22/3.09 8.22/3.09 (0) 8.22/3.09 Obligation: 8.22/3.09 need to prove termination of the following program: 8.22/3.09 /** 8.22/3.09 * This class represents a list, where the function duplicate() can be used to 8.22/3.09 * duplicate all elements in the list. 8.22/3.09 * @author cotto 8.22/3.09 */ 8.22/3.09 public class ListDuplicate { 8.22/3.09 /** 8.22/3.09 * Walk through the list and, for each original element, copy it and append 8.22/3.09 * this copy after the original. This transforms abc to aabbcc. 8.22/3.09 */ 8.22/3.09 public static void duplicate(ObjectList list) { 8.22/3.09 ObjectList current = list; 8.22/3.09 boolean even = true; 8.22/3.09 while (current != null) { 8.22/3.09 // only copy the original elements! 8.22/3.09 if (even) { 8.22/3.09 final ObjectList copy = 8.22/3.09 new ObjectList(current.value, current.next); 8.22/3.09 current.next = copy; 8.22/3.09 } 8.22/3.09 current = current.next; 8.22/3.09 even = !even; 8.22/3.09 } 8.22/3.09 } 8.22/3.09 8.22/3.09 public static void main(String[] args) { 8.22/3.09 Random.args = args; 8.22/3.09 ObjectList list = ObjectList.createList(); 8.22/3.09 duplicate(list); 8.22/3.09 } 8.22/3.09 } 8.22/3.09 8.22/3.09 8.22/3.09 public class ObjectList { 8.22/3.09 Object value; 8.22/3.09 ObjectList next; 8.22/3.09 8.22/3.09 public ObjectList(Object value, ObjectList next) { 8.22/3.09 this.value = value; 8.22/3.09 this.next = next; 8.22/3.09 } 8.22/3.09 8.22/3.09 public static ObjectList createList() { 8.22/3.09 ObjectList result = null; 8.22/3.09 int length = Random.random(); 8.22/3.09 while (length > 0) { 8.22/3.09 result = new ObjectList(new Object(), result); 8.22/3.09 length--; 8.22/3.09 } 8.22/3.09 return result; 8.22/3.09 } 8.22/3.09 } 8.22/3.09 8.22/3.09 8.22/3.09 public class Random { 8.22/3.09 static String[] args; 8.22/3.09 static int index = 0; 8.22/3.09 8.22/3.09 public static int random() { 8.22/3.09 String string = args[index]; 8.22/3.09 index++; 8.22/3.09 return string.length(); 8.22/3.09 } 8.22/3.09 } 8.22/3.09 8.22/3.09 8.22/3.09 8.22/3.09 ---------------------------------------- 8.22/3.09 8.22/3.09 (1) BareJBCToJBCProof (EQUIVALENT) 8.22/3.09 initialized classpath 8.22/3.09 ---------------------------------------- 8.22/3.09 8.22/3.09 (2) 8.22/3.09 Obligation: 8.22/3.09 need to prove termination of the following program: 8.22/3.09 /** 8.22/3.09 * This class represents a list, where the function duplicate() can be used to 8.22/3.09 * duplicate all elements in the list. 8.22/3.09 * @author cotto 8.22/3.09 */ 8.22/3.09 public class ListDuplicate { 8.22/3.09 /** 8.22/3.09 * Walk through the list and, for each original element, copy it and append 8.22/3.09 * this copy after the original. This transforms abc to aabbcc. 8.22/3.09 */ 8.22/3.09 public static void duplicate(ObjectList list) { 8.22/3.09 ObjectList current = list; 8.22/3.09 boolean even = true; 8.22/3.09 while (current != null) { 8.22/3.09 // only copy the original elements! 8.22/3.09 if (even) { 8.22/3.09 final ObjectList copy = 8.22/3.09 new ObjectList(current.value, current.next); 8.22/3.09 current.next = copy; 8.22/3.09 } 8.22/3.09 current = current.next; 8.22/3.09 even = !even; 8.22/3.09 } 8.22/3.09 } 8.22/3.09 8.22/3.09 public static void main(String[] args) { 8.22/3.09 Random.args = args; 8.22/3.09 ObjectList list = ObjectList.createList(); 8.22/3.09 duplicate(list); 8.22/3.09 } 8.22/3.09 } 8.22/3.09 8.22/3.09 8.22/3.09 public class ObjectList { 8.22/3.09 Object value; 8.22/3.09 ObjectList next; 8.22/3.09 8.22/3.09 public ObjectList(Object value, ObjectList next) { 8.22/3.09 this.value = value; 8.22/3.09 this.next = next; 8.22/3.09 } 8.22/3.09 8.22/3.09 public static ObjectList createList() { 8.22/3.09 ObjectList result = null; 8.22/3.09 int length = Random.random(); 8.22/3.09 while (length > 0) { 8.22/3.09 result = new ObjectList(new Object(), result); 8.22/3.09 length--; 8.22/3.09 } 8.22/3.09 return result; 8.22/3.09 } 8.22/3.09 } 8.22/3.09 8.22/3.09 8.22/3.09 public class Random { 8.22/3.09 static String[] args; 8.22/3.09 static int index = 0; 8.40/3.09 8.40/3.09 public static int random() { 8.40/3.09 String string = args[index]; 8.40/3.09 index++; 8.40/3.09 return string.length(); 8.40/3.09 } 8.40/3.09 } 8.40/3.09 8.40/3.09 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (3) JBCToGraph (EQUIVALENT) 8.40/3.09 Constructed TerminationGraph. 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (4) 8.40/3.09 Obligation: 8.40/3.09 Termination Graph based on JBC Program: 8.40/3.09 ListDuplicate.main([Ljava/lang/String;)V: Graph of 28 nodes with 0 SCCs. 8.40/3.09 8.40/3.09 8.40/3.09 8.40/3.09 ObjectList.createList()LObjectList;: Graph of 124 nodes with 1 SCC. 8.40/3.09 8.40/3.09 8.40/3.09 8.40/3.09 ListDuplicate.duplicate(LObjectList;)V: Graph of 57 nodes with 1 SCC. 8.40/3.09 8.40/3.09 8.40/3.09 8.40/3.09 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (5) TerminationGraphToSCCProof (SOUND) 8.40/3.09 Splitted TerminationGraph to 2 SCCss. 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (6) 8.40/3.09 Complex Obligation (AND) 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (7) 8.40/3.09 Obligation: 8.40/3.09 SCC of termination graph based on JBC Program. 8.40/3.09 SCC contains nodes from the following methods: ListDuplicate.duplicate(LObjectList;)V 8.40/3.09 SCC calls the following helper methods: 8.40/3.09 Performed SCC analyses: 8.40/3.09 *Used field analysis yielded the following read fields: 8.40/3.09 *ObjectList: [value, next] 8.40/3.09 *Marker field analysis yielded the following relations that could be markers: 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (8) SCCToQDPProof (SOUND) 8.40/3.09 Transformed TerminationGraph SCC to QDP. Log: 8.40/3.09 Generated rules. Obtained 49 IRulesP rules: 8.40/3.09 f1703_0_duplicate_NULL(EOS(STATIC_1703), java.lang.Object(o276sub), i121, java.lang.Object(o276sub)) -> f1705_0_duplicate_NULL(EOS(STATIC_1705), java.lang.Object(o276sub), i121, java.lang.Object(o276sub)) :|: TRUE 8.40/3.09 f1705_0_duplicate_NULL(EOS(STATIC_1705), java.lang.Object(o276sub), i121, java.lang.Object(o276sub)) -> f1708_0_duplicate_Load(EOS(STATIC_1708), java.lang.Object(o276sub), i121) :|: TRUE 8.40/3.09 f1708_0_duplicate_Load(EOS(STATIC_1708), java.lang.Object(o276sub), i121) -> f1710_0_duplicate_EQ(EOS(STATIC_1710), java.lang.Object(o276sub), i121, i121) :|: TRUE 8.40/3.09 f1710_0_duplicate_EQ(EOS(STATIC_1710), java.lang.Object(o276sub), matching1, matching2) -> f1714_0_duplicate_EQ(EOS(STATIC_1714), java.lang.Object(o276sub), 1, 1) :|: TRUE && matching1 = 1 && matching2 = 1 8.40/3.09 f1710_0_duplicate_EQ(EOS(STATIC_1710), java.lang.Object(o276sub), matching1, matching2) -> f1715_0_duplicate_EQ(EOS(STATIC_1715), java.lang.Object(o276sub), 0, 0) :|: TRUE && matching1 = 0 && matching2 = 0 8.40/3.09 f1714_0_duplicate_EQ(EOS(STATIC_1714), java.lang.Object(o276sub), matching1, matching2) -> f1726_0_duplicate_New(EOS(STATIC_1726), java.lang.Object(o276sub), 1) :|: 1 > 0 && matching1 = 1 && matching2 = 1 8.40/3.09 f1726_0_duplicate_New(EOS(STATIC_1726), java.lang.Object(o276sub), matching1) -> f1731_0_duplicate_Duplicate(EOS(STATIC_1731), java.lang.Object(o276sub), 1, java.lang.Object(ObjectList(EOC, NULL, NULL))) :|: TRUE && matching1 = 1 8.40/3.09 f1731_0_duplicate_Duplicate(EOS(STATIC_1731), java.lang.Object(o276sub), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL))) -> f1734_0_duplicate_Load(EOS(STATIC_1734), java.lang.Object(o276sub), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL))) :|: TRUE && matching1 = 1 8.40/3.09 f1734_0_duplicate_Load(EOS(STATIC_1734), java.lang.Object(o276sub), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL))) -> f1742_0_duplicate_FieldAccess(EOS(STATIC_1742), java.lang.Object(o276sub), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(o276sub)) :|: TRUE && matching1 = 1 8.40/3.09 f1742_0_duplicate_FieldAccess(EOS(STATIC_1742), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, o285, o286))) -> f1746_0_duplicate_FieldAccess(EOS(STATIC_1746), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, o285, o286))) :|: TRUE && matching1 = 1 8.40/3.09 f1746_0_duplicate_FieldAccess(EOS(STATIC_1746), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, o285, o286))) -> f1751_0_duplicate_Load(EOS(STATIC_1751), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285) :|: TRUE && matching1 = 1 8.40/3.09 f1751_0_duplicate_Load(EOS(STATIC_1751), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285) -> f1754_0_duplicate_FieldAccess(EOS(STATIC_1754), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, java.lang.Object(ObjectList(EOC, o285, o286))) :|: TRUE && matching1 = 1 8.40/3.09 f1754_0_duplicate_FieldAccess(EOS(STATIC_1754), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, java.lang.Object(ObjectList(EOC, o285, o286))) -> f1757_0_duplicate_InvokeMethod(EOS(STATIC_1757), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, o286) :|: TRUE && matching1 = 1 8.40/3.09 f1757_0_duplicate_InvokeMethod(EOS(STATIC_1757), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, o286) -> f1759_0__init__Load(EOS(STATIC_1759), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, o286) :|: TRUE && matching1 = 1 8.40/3.09 f1759_0__init__Load(EOS(STATIC_1759), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, o286) -> f1764_0__init__InvokeMethod(EOS(STATIC_1764), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, o286, java.lang.Object(ObjectList(EOC, NULL, NULL))) :|: TRUE && matching1 = 1 8.40/3.09 f1764_0__init__InvokeMethod(EOS(STATIC_1764), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, o286, java.lang.Object(ObjectList(EOC, NULL, NULL))) -> f1776_0__init__Load(EOS(STATIC_1776), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, o286) :|: TRUE && matching1 = 1 8.40/3.09 f1776_0__init__Load(EOS(STATIC_1776), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, o286) -> f1778_0__init__Load(EOS(STATIC_1778), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, o286, java.lang.Object(ObjectList(EOC, NULL, NULL))) :|: TRUE && matching1 = 1 8.40/3.09 f1778_0__init__Load(EOS(STATIC_1778), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o285, o286, java.lang.Object(ObjectList(EOC, NULL, NULL))) -> f1781_0__init__FieldAccess(EOS(STATIC_1781), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o286, java.lang.Object(ObjectList(EOC, NULL, NULL)), o285) :|: TRUE && matching1 = 1 8.40/3.09 f1781_0__init__FieldAccess(EOS(STATIC_1781), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, NULL, NULL)), java.lang.Object(ObjectList(EOC, NULL, NULL)), o286, java.lang.Object(ObjectList(EOC, NULL, NULL)), o285) -> f1788_0__init__Load(EOS(STATIC_1788), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, o285, NULL)), java.lang.Object(ObjectList(EOC, o285, NULL)), o286) :|: TRUE && matching1 = 1 8.40/3.09 f1788_0__init__Load(EOS(STATIC_1788), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, o285, NULL)), java.lang.Object(ObjectList(EOC, o285, NULL)), o286) -> f1790_0__init__Load(EOS(STATIC_1790), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, o285, NULL)), o286, java.lang.Object(ObjectList(EOC, o285, NULL))) :|: TRUE && matching1 = 1 8.40/3.09 f1790_0__init__Load(EOS(STATIC_1790), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, o285, NULL)), o286, java.lang.Object(ObjectList(EOC, o285, NULL))) -> f1793_0__init__FieldAccess(EOS(STATIC_1793), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, o285, NULL)), java.lang.Object(ObjectList(EOC, o285, NULL)), o286) :|: TRUE && matching1 = 1 8.40/3.09 f1793_0__init__FieldAccess(EOS(STATIC_1793), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, o285, NULL)), java.lang.Object(ObjectList(EOC, o285, NULL)), o286) -> f1800_0__init__Return(EOS(STATIC_1800), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, o285, o286))) :|: TRUE && matching1 = 1 8.40/3.09 f1800_0__init__Return(EOS(STATIC_1800), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, o285, o286))) -> f1802_0_duplicate_Store(EOS(STATIC_1802), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, o285, o286))) :|: TRUE && matching1 = 1 8.40/3.09 f1802_0_duplicate_Store(EOS(STATIC_1802), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, o285, o286))) -> f1805_0_duplicate_Load(EOS(STATIC_1805), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, o285, o286))) :|: TRUE && matching1 = 1 8.40/3.09 f1805_0_duplicate_Load(EOS(STATIC_1805), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, o285, o286))) -> f1808_0_duplicate_Load(EOS(STATIC_1808), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, o285, o286)), java.lang.Object(ObjectList(EOC, o285, o286))) :|: TRUE && matching1 = 1 8.40/3.09 f1808_0_duplicate_Load(EOS(STATIC_1808), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, o285, o286)), java.lang.Object(ObjectList(EOC, o285, o286))) -> f1810_0_duplicate_FieldAccess(EOS(STATIC_1810), java.lang.Object(ObjectList(EOC, o285, o286)), 1, java.lang.Object(ObjectList(EOC, o285, o286)), java.lang.Object(ObjectList(EOC, o285, o286))) :|: TRUE && matching1 = 1 8.40/3.09 f1810_0_duplicate_FieldAccess(EOS(STATIC_1810), java.lang.Object(ObjectList(EOC, o285, o286)), matching1, java.lang.Object(ObjectList(EOC, o285, o286)), java.lang.Object(ObjectList(EOC, o285, o286))) -> f1817_0_duplicate_Load(EOS(STATIC_1817), java.lang.Object(ObjectList(EOC, o285, java.lang.Object(ObjectList(EOC, o285, o286)))), 1) :|: TRUE && matching1 = 1 8.40/3.09 f1817_0_duplicate_Load(EOS(STATIC_1817), java.lang.Object(ObjectList(EOC, o285, java.lang.Object(ObjectList(EOC, o285, o286)))), matching1) -> f1818_0_duplicate_FieldAccess(EOS(STATIC_1818), 1, java.lang.Object(ObjectList(EOC, o285, java.lang.Object(ObjectList(EOC, o285, o286))))) :|: TRUE && matching1 = 1 8.40/3.09 f1818_0_duplicate_FieldAccess(EOS(STATIC_1818), matching1, java.lang.Object(ObjectList(EOC, o285, java.lang.Object(ObjectList(EOC, o285, o286))))) -> f1821_0_duplicate_Store(EOS(STATIC_1821), 1, java.lang.Object(ObjectList(EOC, o285, o286))) :|: TRUE && matching1 = 1 8.40/3.09 f1821_0_duplicate_Store(EOS(STATIC_1821), matching1, java.lang.Object(ObjectList(EOC, o285, o286))) -> f1822_0_duplicate_Load(EOS(STATIC_1822), java.lang.Object(ObjectList(EOC, o285, o286)), 1) :|: TRUE && matching1 = 1 8.40/3.09 f1822_0_duplicate_Load(EOS(STATIC_1822), java.lang.Object(ObjectList(EOC, o285, o286)), matching1) -> f1823_0_duplicate_NE(EOS(STATIC_1823), java.lang.Object(ObjectList(EOC, o285, o286)), 1) :|: TRUE && matching1 = 1 8.40/3.09 f1823_0_duplicate_NE(EOS(STATIC_1823), java.lang.Object(ObjectList(EOC, o285, o286)), matching1) -> f1824_0_duplicate_ConstantStackPush(EOS(STATIC_1824), java.lang.Object(ObjectList(EOC, o285, o286))) :|: 1 > 0 && matching1 = 1 8.40/3.09 f1824_0_duplicate_ConstantStackPush(EOS(STATIC_1824), java.lang.Object(ObjectList(EOC, o285, o286))) -> f1827_0_duplicate_Store(EOS(STATIC_1827), java.lang.Object(ObjectList(EOC, o285, o286)), 0) :|: TRUE 8.40/3.09 f1827_0_duplicate_Store(EOS(STATIC_1827), java.lang.Object(ObjectList(EOC, o285, o286)), matching1) -> f1828_0_duplicate_JMP(EOS(STATIC_1828), java.lang.Object(ObjectList(EOC, o285, o286)), 0) :|: TRUE && matching1 = 0 8.40/3.09 f1828_0_duplicate_JMP(EOS(STATIC_1828), java.lang.Object(ObjectList(EOC, o285, o286)), matching1) -> f1849_0_duplicate_Load(EOS(STATIC_1849), java.lang.Object(ObjectList(EOC, o285, o286)), 0) :|: TRUE && matching1 = 0 8.40/3.09 f1849_0_duplicate_Load(EOS(STATIC_1849), java.lang.Object(ObjectList(EOC, o285, o286)), matching1) -> f1698_0_duplicate_Load(EOS(STATIC_1698), java.lang.Object(ObjectList(EOC, o285, o286)), 0) :|: TRUE && matching1 = 0 8.40/3.09 f1698_0_duplicate_Load(EOS(STATIC_1698), o265, i121) -> f1703_0_duplicate_NULL(EOS(STATIC_1703), o265, i121, o265) :|: TRUE 8.40/3.09 f1715_0_duplicate_EQ(EOS(STATIC_1715), java.lang.Object(o276sub), matching1, matching2) -> f1728_0_duplicate_Load(EOS(STATIC_1728), java.lang.Object(o276sub), 0) :|: TRUE && matching1 = 0 && matching2 = 0 8.40/3.09 f1728_0_duplicate_Load(EOS(STATIC_1728), java.lang.Object(o276sub), matching1) -> f1732_0_duplicate_FieldAccess(EOS(STATIC_1732), 0, java.lang.Object(o276sub)) :|: TRUE && matching1 = 0 8.40/3.09 f1732_0_duplicate_FieldAccess(EOS(STATIC_1732), matching1, java.lang.Object(ObjectList(EOC, o282, o283))) -> f1740_0_duplicate_FieldAccess(EOS(STATIC_1740), 0, java.lang.Object(ObjectList(EOC, o282, o283))) :|: TRUE && matching1 = 0 8.40/3.09 f1740_0_duplicate_FieldAccess(EOS(STATIC_1740), matching1, java.lang.Object(ObjectList(EOC, o282, o283))) -> f1743_0_duplicate_Store(EOS(STATIC_1743), 0, o283) :|: TRUE && matching1 = 0 8.40/3.09 f1743_0_duplicate_Store(EOS(STATIC_1743), matching1, o283) -> f1748_0_duplicate_Load(EOS(STATIC_1748), o283, 0) :|: TRUE && matching1 = 0 8.40/3.09 f1748_0_duplicate_Load(EOS(STATIC_1748), o283, matching1) -> f1752_0_duplicate_NE(EOS(STATIC_1752), o283, 0) :|: TRUE && matching1 = 0 8.40/3.09 f1752_0_duplicate_NE(EOS(STATIC_1752), o283, matching1) -> f1756_0_duplicate_ConstantStackPush(EOS(STATIC_1756), o283) :|: TRUE && matching1 = 0 8.40/3.09 f1756_0_duplicate_ConstantStackPush(EOS(STATIC_1756), o283) -> f1758_0_duplicate_JMP(EOS(STATIC_1758), o283, 1) :|: TRUE 8.40/3.09 f1758_0_duplicate_JMP(EOS(STATIC_1758), o283, matching1) -> f1760_0_duplicate_Store(EOS(STATIC_1760), o283, 1) :|: TRUE && matching1 = 1 8.40/3.09 f1760_0_duplicate_Store(EOS(STATIC_1760), o283, matching1) -> f1762_0_duplicate_JMP(EOS(STATIC_1762), o283, 1) :|: TRUE && matching1 = 1 8.40/3.09 f1762_0_duplicate_JMP(EOS(STATIC_1762), o283, matching1) -> f1773_0_duplicate_Load(EOS(STATIC_1773), o283, 1) :|: TRUE && matching1 = 1 8.40/3.09 f1773_0_duplicate_Load(EOS(STATIC_1773), o283, matching1) -> f1698_0_duplicate_Load(EOS(STATIC_1698), o283, 1) :|: TRUE && matching1 = 1 8.40/3.09 Combined rules. Obtained 2 IRulesP rules: 8.40/3.09 f1703_0_duplicate_NULL(EOS(STATIC_1703), java.lang.Object(ObjectList(EOC, o285:0, o286:0)), 1, java.lang.Object(ObjectList(EOC, o285:0, o286:0))) -> f1703_0_duplicate_NULL(EOS(STATIC_1703), java.lang.Object(ObjectList(EOC, o285:0, o286:0)), 0, java.lang.Object(ObjectList(EOC, o285:0, o286:0))) :|: TRUE 8.40/3.09 f1703_0_duplicate_NULL(EOS(STATIC_1703), java.lang.Object(ObjectList(EOC, o282:0, o283:0)), 0, java.lang.Object(ObjectList(EOC, o282:0, o283:0))) -> f1703_0_duplicate_NULL(EOS(STATIC_1703), o283:0, 1, o283:0) :|: TRUE 8.40/3.09 Filtered constant ground arguments: 8.40/3.09 f1703_0_duplicate_NULL(x1, x2, x3, x4) -> f1703_0_duplicate_NULL(x2, x3, x4) 8.40/3.09 EOS(x1) -> EOS 8.40/3.09 ObjectList(x1, x2, x3) -> ObjectList(x2, x3) 8.40/3.09 Filtered duplicate arguments: 8.40/3.09 f1703_0_duplicate_NULL(x1, x2, x3) -> f1703_0_duplicate_NULL(x2, x3) 8.40/3.09 Filtered unneeded arguments: 8.40/3.09 ObjectList(x1, x2) -> ObjectList(x2) 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (9) 8.40/3.09 Obligation: 8.40/3.09 Q DP problem: 8.40/3.09 The TRS P consists of the following rules: 8.40/3.09 8.40/3.09 f1703_0_duplicate_NULL(1, java.lang.Object(ObjectList(o286:0))) -> f1703_0_duplicate_NULL(0, java.lang.Object(ObjectList(o286:0))) 8.40/3.09 f1703_0_duplicate_NULL(0, java.lang.Object(ObjectList(o283:0))) -> f1703_0_duplicate_NULL(1, o283:0) 8.40/3.09 8.40/3.09 R is empty. 8.40/3.09 Q is empty. 8.40/3.09 We have to consider all minimal (P,Q,R)-chains. 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (10) QDPSizeChangeProof (EQUIVALENT) 8.40/3.09 By using the subterm criterion [SUBTERM_CRITERION] together with the size-change analysis [AAECC05] we have proven that there are no infinite chains for this DP problem. 8.40/3.09 8.40/3.09 From the DPs we obtained the following set of size-change graphs: 8.40/3.09 *f1703_0_duplicate_NULL(0, java.lang.Object(ObjectList(o283:0))) -> f1703_0_duplicate_NULL(1, o283:0) 8.40/3.09 The graph contains the following edges 2 > 2 8.40/3.09 8.40/3.09 8.40/3.09 *f1703_0_duplicate_NULL(1, java.lang.Object(ObjectList(o286:0))) -> f1703_0_duplicate_NULL(0, java.lang.Object(ObjectList(o286:0))) 8.40/3.09 The graph contains the following edges 2 >= 2 8.40/3.09 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (11) 8.40/3.09 YES 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (12) 8.40/3.09 Obligation: 8.40/3.09 SCC of termination graph based on JBC Program. 8.40/3.09 SCC contains nodes from the following methods: ObjectList.createList()LObjectList; 8.40/3.09 SCC calls the following helper methods: 8.40/3.09 Performed SCC analyses: 8.40/3.09 *Used field analysis yielded the following read fields: 8.40/3.09 8.40/3.09 *Marker field analysis yielded the following relations that could be markers: 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (13) SCCToIRSProof (SOUND) 8.40/3.09 Transformed FIGraph SCCs to intTRSs. Log: 8.40/3.09 Generated rules. Obtained 23 IRulesP rules: 8.40/3.09 f1284_0_createList_LE(EOS(STATIC_1284), i92, i92) -> f1292_0_createList_LE(EOS(STATIC_1292), i92, i92) :|: TRUE 8.40/3.09 f1292_0_createList_LE(EOS(STATIC_1292), i92, i92) -> f1301_0_createList_New(EOS(STATIC_1301), i92) :|: i92 > 0 8.40/3.09 f1301_0_createList_New(EOS(STATIC_1301), i92) -> f1309_0_createList_Duplicate(EOS(STATIC_1309), i92) :|: TRUE 8.40/3.09 f1309_0_createList_Duplicate(EOS(STATIC_1309), i92) -> f1313_0_createList_New(EOS(STATIC_1313), i92) :|: TRUE 8.40/3.09 f1313_0_createList_New(EOS(STATIC_1313), i92) -> f1335_0_createList_Duplicate(EOS(STATIC_1335), i92) :|: TRUE 8.40/3.09 f1335_0_createList_Duplicate(EOS(STATIC_1335), i92) -> f1357_0_createList_InvokeMethod(EOS(STATIC_1357), i92) :|: TRUE 8.40/3.09 f1357_0_createList_InvokeMethod(EOS(STATIC_1357), i92) -> f1364_0_createList_Load(EOS(STATIC_1364), i92) :|: TRUE 8.40/3.09 f1364_0_createList_Load(EOS(STATIC_1364), i92) -> f1371_0_createList_InvokeMethod(EOS(STATIC_1371), i92) :|: TRUE 8.40/3.09 f1371_0_createList_InvokeMethod(EOS(STATIC_1371), i92) -> f1375_0__init__Load(EOS(STATIC_1375), i92) :|: TRUE 8.40/3.09 f1375_0__init__Load(EOS(STATIC_1375), i92) -> f1388_0__init__InvokeMethod(EOS(STATIC_1388), i92) :|: TRUE 8.40/3.09 f1388_0__init__InvokeMethod(EOS(STATIC_1388), i92) -> f1401_0__init__Load(EOS(STATIC_1401), i92) :|: TRUE 8.40/3.09 f1401_0__init__Load(EOS(STATIC_1401), i92) -> f1408_0__init__Load(EOS(STATIC_1408), i92) :|: TRUE 8.40/3.09 f1408_0__init__Load(EOS(STATIC_1408), i92) -> f1425_0__init__FieldAccess(EOS(STATIC_1425), i92) :|: TRUE 8.40/3.09 f1425_0__init__FieldAccess(EOS(STATIC_1425), i92) -> f1428_0__init__Load(EOS(STATIC_1428), i92) :|: TRUE 8.40/3.09 f1428_0__init__Load(EOS(STATIC_1428), i92) -> f1430_0__init__Load(EOS(STATIC_1430), i92) :|: TRUE 8.40/3.09 f1430_0__init__Load(EOS(STATIC_1430), i92) -> f1432_0__init__FieldAccess(EOS(STATIC_1432), i92) :|: TRUE 8.40/3.09 f1432_0__init__FieldAccess(EOS(STATIC_1432), i92) -> f1434_0__init__Return(EOS(STATIC_1434), i92) :|: TRUE 8.40/3.09 f1434_0__init__Return(EOS(STATIC_1434), i92) -> f1436_0_createList_Store(EOS(STATIC_1436), i92) :|: TRUE 8.40/3.09 f1436_0_createList_Store(EOS(STATIC_1436), i92) -> f1439_0_createList_Inc(EOS(STATIC_1439), i92) :|: TRUE 8.40/3.09 f1439_0_createList_Inc(EOS(STATIC_1439), i92) -> f1442_0_createList_JMP(EOS(STATIC_1442), i92 + -1) :|: TRUE 8.40/3.09 f1442_0_createList_JMP(EOS(STATIC_1442), i107) -> f1445_0_createList_Load(EOS(STATIC_1445), i107) :|: TRUE 8.40/3.09 f1445_0_createList_Load(EOS(STATIC_1445), i107) -> f1264_0_createList_Load(EOS(STATIC_1264), i107) :|: TRUE 8.40/3.09 f1264_0_createList_Load(EOS(STATIC_1264), i85) -> f1284_0_createList_LE(EOS(STATIC_1284), i85, i85) :|: TRUE 8.40/3.09 Combined rules. Obtained 1 IRulesP rules: 8.40/3.09 f1284_0_createList_LE(EOS(STATIC_1284), i92:0, i92:0) -> f1284_0_createList_LE(EOS(STATIC_1284), i92:0 - 1, i92:0 - 1) :|: i92:0 > 0 8.40/3.09 Filtered constant ground arguments: 8.40/3.09 f1284_0_createList_LE(x1, x2, x3) -> f1284_0_createList_LE(x2, x3) 8.40/3.09 EOS(x1) -> EOS 8.40/3.09 Filtered duplicate arguments: 8.40/3.09 f1284_0_createList_LE(x1, x2) -> f1284_0_createList_LE(x2) 8.40/3.09 Finished conversion. Obtained 1 rules.P rules: 8.40/3.09 f1284_0_createList_LE(i92:0) -> f1284_0_createList_LE(i92:0 - 1) :|: i92:0 > 0 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (14) 8.40/3.09 Obligation: 8.40/3.09 Rules: 8.40/3.09 f1284_0_createList_LE(i92:0) -> f1284_0_createList_LE(i92:0 - 1) :|: i92:0 > 0 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (15) IRSFormatTransformerProof (EQUIVALENT) 8.40/3.09 Reformatted IRS to match normalized format (transformed away non-linear left-hand sides, !=, / and %). 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (16) 8.40/3.09 Obligation: 8.40/3.09 Rules: 8.40/3.09 f1284_0_createList_LE(i92:0) -> f1284_0_createList_LE(arith) :|: i92:0 > 0 && arith = i92:0 - 1 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (17) IRSwTTerminationDigraphProof (EQUIVALENT) 8.40/3.09 Constructed termination digraph! 8.40/3.09 Nodes: 8.40/3.09 (1) f1284_0_createList_LE(i92:0) -> f1284_0_createList_LE(arith) :|: i92:0 > 0 && arith = i92:0 - 1 8.40/3.09 8.40/3.09 Arcs: 8.40/3.09 (1) -> (1) 8.40/3.09 8.40/3.09 This digraph is fully evaluated! 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (18) 8.40/3.09 Obligation: 8.40/3.09 8.40/3.09 Termination digraph: 8.40/3.09 Nodes: 8.40/3.09 (1) f1284_0_createList_LE(i92:0) -> f1284_0_createList_LE(arith) :|: i92:0 > 0 && arith = i92:0 - 1 8.40/3.09 8.40/3.09 Arcs: 8.40/3.09 (1) -> (1) 8.40/3.09 8.40/3.09 This digraph is fully evaluated! 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (19) IntTRSCompressionProof (EQUIVALENT) 8.40/3.09 Compressed rules. 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (20) 8.40/3.09 Obligation: 8.40/3.09 Rules: 8.40/3.09 f1284_0_createList_LE(i92:0:0) -> f1284_0_createList_LE(i92:0:0 - 1) :|: i92:0:0 > 0 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (21) TempFilterProof (SOUND) 8.40/3.09 Used the following sort dictionary for filtering: 8.40/3.09 f1284_0_createList_LE(INTEGER) 8.40/3.09 Replaced non-predefined constructor symbols by 0. 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (22) 8.40/3.09 Obligation: 8.40/3.09 Rules: 8.40/3.09 f1284_0_createList_LE(i92:0:0) -> f1284_0_createList_LE(c) :|: c = i92:0:0 - 1 && i92:0:0 > 0 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (23) PolynomialOrderProcessor (EQUIVALENT) 8.40/3.09 Found the following polynomial interpretation: 8.40/3.09 [f1284_0_createList_LE(x)] = x 8.40/3.09 8.40/3.09 The following rules are decreasing: 8.40/3.09 f1284_0_createList_LE(i92:0:0) -> f1284_0_createList_LE(c) :|: c = i92:0:0 - 1 && i92:0:0 > 0 8.40/3.09 The following rules are bounded: 8.40/3.09 f1284_0_createList_LE(i92:0:0) -> f1284_0_createList_LE(c) :|: c = i92:0:0 - 1 && i92:0:0 > 0 8.40/3.09 8.40/3.09 ---------------------------------------- 8.40/3.09 8.40/3.09 (24) 8.40/3.09 YES 8.40/3.14 EOF