5.59/2.39 NO 5.59/2.43 proof of /export/starexec/sandbox/benchmark/theBenchmark.jar 5.59/2.43 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 5.59/2.43 5.59/2.43 5.59/2.43 termination of the given Bare JBC problem could be disproven: 5.59/2.43 5.59/2.43 (0) Bare JBC problem 5.59/2.43 (1) BareJBCToJBCProof [EQUIVALENT, 96 ms] 5.59/2.43 (2) JBC problem 5.59/2.43 (3) JBCToGraph [EQUIVALENT, 284 ms] 5.59/2.43 (4) JBCTerminationGraph 5.59/2.43 (5) JBCNonTerm [COMPLETE, 125 ms] 5.59/2.43 (6) NO 5.59/2.43 5.59/2.43 5.59/2.43 ---------------------------------------- 5.59/2.43 5.59/2.43 (0) 5.59/2.43 Obligation: 5.59/2.43 need to prove termination of the following program: 5.59/2.43 public class NonPeriodicNonterm2 { 5.59/2.43 public static void main(String[] args) { 5.59/2.43 int x = args[0].length(); 5.59/2.43 int y = args[1].length(); 5.59/2.43 while(x >= y) { 5.59/2.43 int z = x - y; 5.59/2.43 if (z > 0) { 5.59/2.43 x--; 5.59/2.43 } else { 5.59/2.43 x = 2*x + 1; 5.59/2.43 y++; 5.59/2.43 } 5.59/2.43 } 5.59/2.43 } 5.59/2.43 } 5.59/2.43 5.59/2.43 5.59/2.43 5.59/2.43 ---------------------------------------- 5.59/2.43 5.59/2.43 (1) BareJBCToJBCProof (EQUIVALENT) 5.59/2.43 initialized classpath 5.59/2.43 ---------------------------------------- 5.59/2.43 5.59/2.43 (2) 5.59/2.43 Obligation: 5.59/2.43 need to prove termination of the following program: 5.59/2.43 public class NonPeriodicNonterm2 { 5.59/2.43 public static void main(String[] args) { 5.59/2.43 int x = args[0].length(); 5.59/2.43 int y = args[1].length(); 5.59/2.43 while(x >= y) { 5.59/2.43 int z = x - y; 5.59/2.43 if (z > 0) { 5.59/2.43 x--; 5.59/2.43 } else { 5.59/2.43 x = 2*x + 1; 5.59/2.43 y++; 5.59/2.43 } 5.59/2.43 } 5.59/2.43 } 5.59/2.43 } 5.59/2.43 5.59/2.43 5.59/2.43 5.59/2.43 ---------------------------------------- 5.59/2.43 5.59/2.43 (3) JBCToGraph (EQUIVALENT) 5.59/2.43 Constructed TerminationGraph. 5.59/2.43 ---------------------------------------- 5.59/2.43 5.59/2.43 (4) 5.59/2.43 Obligation: 5.59/2.43 Termination Graph based on JBC Program: 5.59/2.43 NonPeriodicNonterm2.main([Ljava/lang/String;)V: Graph of 144 nodes with 1 SCC. 5.59/2.43 5.59/2.43 5.59/2.43 5.59/2.43 5.59/2.43 5.59/2.43 ---------------------------------------- 5.59/2.43 5.59/2.43 (5) JBCNonTerm (COMPLETE) 5.59/2.43 Reached a loop using the following run: 5.59/2.43 5.59/2.43 0: 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 1: 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 2: 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 3: 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 4: 5.59/2.43 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 5: 5.59/2.43 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 6: 5.59/2.43 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 7: 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 8: 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 9: 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 10: 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 a12([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.59/2.43 o15!: String(count=1, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 o16:: [CHAR] -->{java.lang.Object...} 5.59/2.43 a12-><-o38 5.59/2.43 a12-><-o37 5.59/2.43 a12-><-o16 5.59/2.43 a12-><-o15 5.59/2.43 YES: (JL1) 5.59/2.43 11: 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 YES: (JL1) 5.59/2.43 12: 5.59/2.43 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 YES: (JL1) 5.59/2.43 13: 5.59/2.43 5.59/2.43 o37!: String(count=0, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.59/2.43 o38:: [CHAR] -->{java.lang.Object...} 5.59/2.43 YES: (JL1) 5.59/2.43 14: 5.59/2.43 5.59/2.43 YES: (JL1) 5.59/2.43 15: 5.59/2.43 YES: (JL1) 5.59/2.43 16: 5.59/2.43 YES: (JL1) 5.59/2.43 Start state of loop: 5.59/2.43 5.59/2.43 [a4(lv_0_0)] 5.59/2.43 5.59/2.43 i16: [2,+inf){0,+inf} 5.59/2.43 a4([java.lang.String...]): length i16 -->{java.lang.Object...} 5.59/2.43 i43: [-1,+inf)(l1) 5.59/2.43 i30: [0,+inf) 5.59/2.43 YES: (JL1) 5.59/2.43 5.59/2.43 5.59/2.43 In the loop head node, references [i43, i30] were interesting. 5.59/2.43 5.59/2.43 All methods calls in the loop body are side-effect free, hence they can be ignored. 5.59/2.43 5.59/2.43 By SMT, we could prove 5.59/2.43 5.59/2.43 ((-1 <= initial_i43 and 0 <= initial_i30 and 2 <= initial_i16) and ((((path1_i53 = (path1_i43 - path1_i30) and path1_i53 = path1_i54 and path1_i56 = (path1_i43 + -1) and path1_i56 = res_i43 and path1_i30 = res_i30 and path1_i43 = initial_i43 and path1_i30 = initial_i30) and (path1_i43 >= path1_i30 and path1_i43 >= path1_i30 and path1_i54 > 0)) or ((path2_i53 = (path2_i43 - path2_i30) and path2_i57 = (2 * path2_i43) and path2_i104 = (path2_i57 + 1) and path2_i105 = (path2_i30 + 1) and path2_i104 = res_i43 and path2_i105 = res_i30 and path2_i43 = initial_i43 and path2_i30 = initial_i30) and (path2_i43 >= path2_i30 and path2_i43 >= path2_i30 and path2_i53 = 0 and 0 <= 0))) and (((res1_i53 = (res1_i43 - res1_i30) and res1_i53 = res1_i54 and res1_i56 = (res1_i43 + -1) and res_i43 = res1_i43 and res_i30 = res1_i30) and !(res1_i43 >= res1_i30 and res1_i43 >= res1_i30 and res1_i54 > 0)) and ((res2_i53 = (res2_i43 - res2_i30) and res2_i57 = (2 * res2_i43) and res2_i104 = (res2_i57 + 1) and res2_i105 = (res2_i30 + 1) and res_i43 = res2_i43 and res_i30 = res2_i30) and !(res2_i43 >= res2_i30 and res2_i43 >= res2_i30 and res2_i53 = 0 and 0 <= 0))))) 5.59/2.43 5.59/2.43 to be UNSAT. Consequently, the loop will not terminate. 5.59/2.43 ---------------------------------------- 5.59/2.43 5.59/2.43 (6) 5.59/2.43 NO 5.95/2.47 EOF