(* This is an example that the query is too complex that even why3 cannot handle it. Without any further simplification, only goal G0 and G1 can be proved. By looking at the symbolic expression of this query, I found that at least goal G3 is valid. But some further simplification is needed. If I replace the "(get Y13 1)" with "(get Y12 0)", G2 can be fastly proved. And human beings can easily decide that (get Y12 0) == (get Y13 1). Here I put the SARL symbolic expression version of the query as reference: Context: 0==(_uf_$mpi_sizeof(10) - 1*SIZEOF_REAL) 0==(Y10[0:=Y11[0]][Y0 + 1:=Y12[0]][Y0] - 1*Y13[0:=Y14[0]][Y5 + 1:=Y15[0]][0]) 0==(Y10[0:=Y11[0]][Y0 + 1:=Y12[0]][1] - 1*Y15[0]) 0==(Y10[0:=Y11[0]][Y0 + 1:=Y12[0]][0] - 1*Y13[0:=Y14[0]][Y5 + 1:=Y15[0]][Y5]) 0==(Y13[0:=Y14[0]][Y5 + 1:=Y15[0]][1] - 1*Y12[0]) 0==(Y2 - 1*Y7) forall _cc_bv_0 : int . ((0 == Y10[0:=Y11[0]][Y0 + 1:=Y12[0]][_cc_bv_0] - 1*Y3[_cc_bv_0]) || (0 <= Y0 - 1*_cc_bv_0)) forall _cc_bv_0 : int . ((0 == Y10[0:=Y11[0]][Y0 + 1:=Y12[0]][_cc_bv_0] - 1*Y3[_cc_bv_0]) || (0 <= _cc_bv_0 - 1)) forall _cc_bv_0 : int . ((0 == Y13[0:=Y14[0]][Y5 + 1:=Y15[0]][_cc_bv_0] - 1*Y8[_cc_bv_0]) || (0 <= Y5 - 1*_cc_bv_0)) forall _cc_bv_0 : int . ((0 == Y13[0:=Y14[0]][Y5 + 1:=Y15[0]][_cc_bv_0] - 1*Y8[_cc_bv_0]) || (0 <= _cc_bv_0 - 1)) forall i : int . ((0 == Y10[0:=Y11[0]][Y0 + 1:=Y12[0]][i - 1]*Y2 + Y10[0:=Y11[0]][Y0 + 1:=Y12[0]][i + 1]*Y2 - 2*Y10[0:=Y11[0]][Y0 + 1:=Y12[0]][i]*Y2 + Y10[0:=Y11[0]][Y0 + 1:=Y12[0]][i] - 1*Y3[i]) || (Y0 - 1*i + 1 <= 0) || (i <= 0)) forall i : int . ((0 == Y13[0:=Y14[0]][Y5 + 1:=Y15[0]][i - 1]*Y7 + Y13[0:=Y14[0]][Y5 + 1:=Y15[0]][i + 1]*Y7 - 2*Y13[0:=Y14[0]][Y5 + 1:=Y15[0]][i]*Y7 + Y13[0:=Y14[0]][Y5 + 1:=Y15[0]][i] - 1*Y8[i]) || (Y5 - 1*i + 1 <= 0) || (i <= 0)) 0 (0.0 = ( SR.add (get _Y3 (_Y0 + 1)) ( SR.mul (SR.neg 1.0) (get _Y13 1)))) goal G1: context -> (0.0 = ( SR.add (get _Y3 0) ( SR.mul (SR.neg 1.0) (get _Y13 _Y5)))) goal G2: context -> ((0.0 = ( SR.add ( SR.add ( SR.mul ( SR.add ( SR.add (get _Y10 (_Y0 + -1)) ( SR.mul (SR.neg 2.0) (get _Y10 _Y0))) (get _Y13 1)) _Y2) (get _Y10 _Y0)) ( SR.mul (SR.neg 1.0) (get _Y3 _Y0)))) || ((_Y0 + -1) <= 0)) goal G3: (context && (not ((_Y0 + -1) <= 0) ))-> ((0.0 = ( SR.add ( SR.add ( SR.mul ( SR.add ( SR.add (get _Y10 1) ( SR.mul (SR.neg (1.0 :- 2.0)) (get _Y10 2))) ( SR.mul (SR.neg (1.0 :- 2.0)) (get _Y13 _Y5))) _Y2) ( SR.mul (SR.neg (1.0 :- 2.0)) (get _Y10 1))) ( SR.mul (1.0 :- 2.0) (get _Y3 1)))) ) goal G4: context -> ((0.0 = ( SR.add ( SR.add ( SR.mul ( SR.add ( SR.add (get _Y10 1) ( SR.mul (SR.neg (1.0 :- 2.0)) (get _Y13 _Y5))) ( SR.mul (SR.neg (1.0 :- 2.0)) (get _Y13 1))) _Y2) ( SR.mul (SR.neg (1.0 :- 2.0)) (get _Y10 1))) ( SR.mul (1.0 :- 2.0) (get _Y3 1)))) || (not (0 = (_Y0 + -1)))) end