Une MAJ de sécurité est nécessaire sur notre version actuelle. Elle sera effectuée lundi 02/08 entre 12h30 et 13h. L'interruption de service devrait durer quelques minutes (probablement moins de 5 minutes).

Commit a99cc75e by Raphael Rieu-Helft

### Remove almost all by/so proofs in addition

parent 082d207d
 ... @@ -830,7 +830,6 @@ let rinv (a:t) ... @@ -830,7 +830,6 @@ let rinv (a:t) end end end end module LinearDecisionRational module LinearDecisionRational use import RationalCoeffs use import RationalCoeffs ... @@ -1074,18 +1073,21 @@ let mmul (a b:t) ... @@ -1074,18 +1073,21 @@ let mmul (a b:t) = match a, b with = match a, b with | (q1,e1), (q2,e2) -> | (q1,e1), (q2,e2) -> let q = Q.rmul q1 q2 in let q = Q.rmul q1 q2 in let e = add_exp e1 e2 in if Q.req q Q.rzero then mzero assert { forall y. minterp (q,e) y = minterp a y *. minterp b y else begin by let p1 = pow rradix (from_int (interp_exp e1 y)) in let e = add_exp e1 e2 in let p2 = pow rradix (from_int (interp_exp e2 y)) in assert { forall y. minterp (q,e) y = minterp a y *. minterp b y let p = pow rradix (from_int (interp_exp e y)) in by let p1 = pow rradix (from_int (interp_exp e1 y)) in interp_exp e y = interp_exp e1 y + interp_exp e2 y let p2 = pow rradix (from_int (interp_exp e2 y)) in so p = p1 *. p2 let p = pow rradix (from_int (interp_exp e y)) in so minterp (q,e) y = qinterp q *. p interp_exp e y = interp_exp e1 y + interp_exp e2 y = (qinterp q1 *. qinterp q2) *. p so p = p1 *. p2 = (qinterp q1 *. qinterp q2) *. p1 *. p2 so minterp (q,e) y = qinterp q *. p = minterp a y *. minterp b y }; = (qinterp q1 *. qinterp q2) *. p (q,e) = (qinterp q1 *. qinterp q2) *. p1 *. p2 = minterp a y *. minterp b y }; (q,e) end end end let mopp (a:t) let mopp (a:t) ... @@ -1282,6 +1284,16 @@ goal g': forall a b i j: int. ... @@ -1282,6 +1284,16 @@ goal g': forall a b i j: int. i+1 = j -> i+1 = j -> (power radix j) * a = radix*b (power radix j) * a = radix*b goal g'': forall r r' i c x x' y l: int. c = 0 -> r + power radix i * c = x + y -> r' = r + power radix i * l -> x' = x + power radix i * l -> r' + power radix (i+1) * c = x' + y (*tries to add power radix i and power radix (i+1), fails -> cst propagation ? *) end end module TI module TI ... ...
 ... @@ -1895,7 +1895,7 @@ ... @@ -1895,7 +1895,7 @@ ... @@ -2144,38 +2144,41 @@ ... @@ -2144,38 +2144,41 @@ ... @@ -2438,7 +2441,7 @@ ... @@ -2438,7 +2441,7 @@ ... @@ -2514,6 +2517,22 @@ ... @@ -2514,6 +2517,22 @@ ... ...
No preview for this file type
 ... @@ -509,14 +509,12 @@ module N ... @@ -509,14 +509,12 @@ module N value x !i + value y !i value x !i + value y !i by value r !i = (value r !i at StartLoop) }; by value r !i = (value r !i at StartLoop) }; c := carry; c := carry; let ghost k = p2i !i in value_tail r !i; i := Int32.(+) !i (Int32.of_int 1); value_tail x !i; value_sub_tail (pelts r) r.offset (r.offset + k); value_tail y !i; value_sub_tail (pelts x) x.offset (x.offset + k); assert { value r (!i+1) + (power radix (!i+1)) * !c = value_sub_tail (pelts y) y.offset (y.offset + k); value x (!i+1) + value y (!i+1) assert { value r !i + (power radix !i) * !c = (*by value x !i + value y !i by value r !i + (power radix !i) * !c value r !i + (power radix !i) * !c = value r k + (power radix k) * res = value r k + (power radix k) * res + (power radix !i) * !c + (power radix !i) * !c ... @@ -535,7 +533,8 @@ module N ... @@ -535,7 +533,8 @@ module N + value y k + (power radix k) * !ly + value y k + (power radix k) * !ly = value x !i = value x !i + (value y k + (power radix k) * !ly) + (value y k + (power radix k) * !ly) = value x !i + value y !i } = value x !i + value y !i*) }; i := Int32.(+) !i (Int32.of_int 1); done; done; !c !c ... @@ -571,14 +570,12 @@ module N ... @@ -571,14 +570,12 @@ module N assert { value r !i + (power radix !i) * !c = assert { value r !i + (power radix !i) * !c = value x !i + value y !i }; value x !i + value y !i }; c := carry; c := carry; let ghost k = p2i !i in value_tail r !i; i := Int32.(+) !i (Int32.of_int 1); value_tail x !i; value_sub_tail (pelts r) r.offset (r.offset + k); value_tail y !i; value_sub_tail (pelts x) x.offset (x.offset + k); assert { value r (!i+1) + (power radix (!i+1)) * !c = value_sub_tail (pelts y) y.offset (y.offset + k); value x (!i+1) + value y (!i+1) assert { value r !i + (power radix !i) * !c = (*by value x !i + value y !i by value r !i + (power radix !i) * !c value r !i + (power radix !i) * !c = value r k + (power radix k) * res = value r k + (power radix k) * res + (power radix !i) * !c + (power radix !i) * !c ... @@ -597,7 +594,8 @@ module N ... @@ -597,7 +594,8 @@ module N + value y k + (power radix k) * !ly + value y k + (power radix k) * !ly = value x !i = value x !i + (value y k + (power radix k) * !ly) + (value y k + (power radix k) * !ly) = value x !i + value y !i }; = value x !i + value y !i*) }; i := Int32.(+) !i (Int32.of_int 1); done; done; try try begin while Int32.(<) !i sx do begin while Int32.(<) !i sx do ... @@ -614,13 +612,11 @@ module N ... @@ -614,13 +612,11 @@ module N assert { value r !i + (power radix !i) * !c = assert { value r !i + (power radix !i) * !c = value x !i + value y sy }; value x !i + value y sy }; c := carry; c := carry; let ghost k = p2i !i in value_tail r !i; i := Int32.(+) !i (Int32.of_int 1); value_tail x !i; value_sub_tail (pelts r) r.offset (r.offset + k); assert { value r (!i+1) + (power radix (!i+1)) * !c = value_sub_tail (pelts x) x.offset (x.offset + k); value x (!i+1) + value y sy assert { value r !i + (power radix !i) * !c = (*by value x !i + value y sy by value r !i + (power radix !i) * !c value r !i + (power radix !i) * !c = value r k + (power radix k) * res = value r k + (power radix k) * res + (power radix !i) * !c + (power radix !i) * !c ... @@ -634,7 +630,8 @@ module N ... @@ -634,7 +630,8 @@ module N = value x k + value y sy = value x k + value y sy + (power radix k) * !lx + (power radix k) * !lx = value x !i = value x !i + value y sy } + value y sy*) }; i := Int32.(+) !i (Int32.of_int 1); done; done; assert { !i = sx } assert { !i = sx } end end ... @@ -649,12 +646,14 @@ module N ... @@ -649,12 +646,14 @@ module N assert { !c = 0 by !i < sx }; assert { !c = 0 by !i < sx }; lx := get_ofs x !i; lx := get_ofs x !i; set_ofs r !i !lx; set_ofs r !i !lx; let ghost k = p2i !i in (*assert { value r !i + (power radix !i) * !c = i := Int32.(+) !i (Int32.of_int 1); value x !i + value y sy };*) (* false without this, cannotreduce with this *) value_sub_tail (pelts r) r.offset (r.offset + k); value_tail r !i; value_sub_tail (pelts x) x.offset (x.offset + k); value_tail x !i; assert { value r !i + power radix !i * !c assert { value r !i = value x !i + value y sy }; (* true with this, should not be needed *) = value x !i + value y sy assert { value r (!i+1) + power radix (!i+1) * !c = value x (!i+1) + value y sy (* by by value r !i + power radix !i * !c value r !i + power radix !i * !c = value r !i = value r !i ... @@ -663,8 +662,8 @@ module N ... @@ -663,8 +662,8 @@ module N = value x k + power radix k * !lx = value x k + power radix k * !lx so value r k so value r k = value r k + power radix k * !c = value r k + power radix k * !c = value x k + value y sy = value x k + value y sy*) }; } i := Int32.(+) !i (Int32.of_int 1); done; done; !c !c ... @@ -697,7 +696,7 @@ module N ... @@ -697,7 +696,7 @@ module N (pelts x)[j] = (pelts (old x))[j] } (pelts x)[j] = (pelts (old x))[j] } label StartLoop in label StartLoop in lx := get_ofs x !i; lx := get_ofs x !i; assert { !lx = (pelts ox)[x.offset + !i] }; assert { !lx = (pelts ox)[ox.offset + !i] }; ly := get_ofs y !i; ly := get_ofs y !i; let res, carry = add_with_carry !lx !ly !c in let res, carry = add_with_carry !lx !ly !c in set_ofs x !i res; set_ofs x !i res; ... @@ -709,14 +708,12 @@ module N ... @@ -709,14 +708,12 @@ module N = (pelts ox)[x.offset + j]}; = (pelts ox)[x.offset + j]}; assert { value x !i + (power radix !i) * !c = value ox !i + value y !i }; assert { value x !i + (power radix !i) * !c = value ox !i + value y !i }; c := carry; c := carry; let ghost k = p2i !i in value_tail x !i; i := Int32.(+) !i (Int32.of_int 1); value_tail ox !i; value_sub_tail (pelts x) x.offset (x.offset + k); value_tail y !i; value_sub_tail (pelts ox) x.offset (x.offset + k); assert { value x (!i+1) + (power radix (!i+1)) * !c = value_sub_tail (pelts y) y.offset (y.offset + k); value ox (!i+1) + value y (!i+1) assert { value x !i + (power radix !i) * !c = (*by value ox k + (power radix k) * !lx value ox !i + value y !i by value ox k + (power radix k) * !lx = value ox !i = value ox !i so value x !i + (power radix !i) * !c so value x !i + (power radix !i) * !c = value x k + (power radix k) * res = value x k + (power radix k) * res ... @@ -736,7 +733,8 @@ module N ... @@ -736,7 +733,8 @@ module N + (value y k + (power radix k) * !ly) + (value y k + (power radix k) * !ly) = value ox !i = value ox !i + (value y k + (power radix k) * !ly) + (value y k + (power radix k) * !ly) = value ox !i + value y !i }; = value ox !i + value y !i*) }; i := Int32.(+) !i (Int32.of_int 1); done; done; try try while Int32.(<) !i sx do while Int32.(<) !i sx do ... @@ -752,7 +750,7 @@ module N ... @@ -752,7 +750,7 @@ module N (if (Limb.(=) !c limb_zero) then raise ReturnLimb limb_zero); (if (Limb.(=) !c limb_zero) then raise ReturnLimb limb_zero); label StartLoop2 in label StartLoop2 in lx := get_ofs x !i; lx := get_ofs x !i; assert { !lx = (pelts ox)[x.offset + !i] }; assert { !lx = (pelts ox)[ox.offset + !i] }; let res, carry = add_with_carry !lx limb_zero !c in let res, carry = add_with_carry !lx limb_zero !c in value_sub_update_no_change (pelts x) (x.offset + p2i !i) value_sub_update_no_change (pelts x) (x.offset + p2i !i) (x.offset + p2i !i + 1) (x.offset + p2i !i + 1) ... @@ -760,15 +758,13 @@ module N ... @@ -760,15 +758,13 @@ module N set_ofs x !i res; set_ofs x !i res; assert { value x !i + (power radix !i) * !c = value ox !i + value y sy }; assert { value x !i + (power radix !i) * !c = value ox !i + value y sy }; c := carry; c := carry; let ghost k = p2i !i in assert { forall j. !i < j < sx -> i := Int32.(+) !i (Int32.of_int 1); assert { forall j. !i <= j < sx -> (pelts x)[x.offset + j] = (pelts ox) [x.offset + j] }; (pelts x)[x.offset + j] = (pelts ox) [x.offset + j] }; value_sub_tail (pelts ox) x.offset (x.offset + k); value_tail ox !i; value_sub_tail (pelts x) x.offset (x.offset + k); value_tail x !i; assert { value x !i + (power radix !i) * !c = assert { value x (!i+1) + (power radix (!i+1)) * !c = value ox !i + value y sy value ox (!i+1) + value y sy by value ox k + (power radix k) * !lx (*by value ox k + (power radix k) * !lx = value ox !i = value ox !i so so value x !i + (power radix !i) * !c value x !i + (power radix !i) * !c ... @@ -784,7 +780,8 @@ module N ... @@ -784,7 +780,8 @@ module N = value ox k + value y sy = value ox k + value y sy + (power radix k) * !lx + (power radix k) * !lx = value ox !i = value ox !i + value y sy } + value y sy*) }; i := Int32.(+) !i (Int32.of_int 1); done; done; assert { !i = sx }; assert { !i = sx }; !c !c ... @@ -798,17 +795,7 @@ module N ... @@ -798,17 +795,7 @@ module N value_sub_frame (pelts x) (pelts ox) (x.offset + p2i !i) (x.offset + p2i sx); value_sub_frame (pelts x) (pelts ox) (x.offset + p2i !i) (x.offset + p2i sx); value_sub_concat (pelts x) x.offset (x.offset + p2i !i) (x.offset + p2i sx); value_sub_concat (pelts x) x.offset (x.offset + p2i !i) (x.offset + p2i sx); value_sub_concat (pelts ox) x.offset (x.offset + p2i !i) (x.offset + p2i sx); value_sub_concat (pelts ox) x.offset (x.offset + p2i !i) (x.offset + p2i sx); assert { value x sx = value (old x) sx + value y sy assert { value x sx = value (old x) sx + value y sy }; by value x sx = value x !i + (power radix !i) * value_sub (pelts ox) (x.offset + !i) (x.offset + sx) = value ox !i + (power radix !i) * value_sub (pelts ox) (x.offset + !i) (x.offset + sx) + value y sy = value_sub (pelts ox) x.offset (x.offset + sx) + value y sy = value ox sx + value y sy }; n n end end end end ... @@ -843,13 +830,11 @@ module N ... @@ -843,13 +830,11 @@ module N assert { value r !i - power radix !i * !b = assert { value r !i - power radix !i * !b = value x !i - y }; value x !i - y }; b := borrow; b := borrow; let ghost k = p2i !i in value_tail r !i; i := Int32.(+) !i (Int32.of_int 1); value_tail x !i; value_sub_tail (pelts r) r.offset (r.offset + k); assert { value r (!i+1) - power radix (!i+1) * !b value_sub_tail (pelts x) x.offset (x.offset + k); = value x (!i+1) - y assert { value r !i - power radix !i * !b (*by = value x !i - y by value r !i - power radix !i * !b value r !i - power radix !i * !b = value r k + power radix k * res = value r k + power radix k * res - power radix !i * !b - power radix !i * !b ... @@ -861,8 +846,9 @@ module N ... @@ -861,8 +846,9 @@ module N = value r k - power radix k * (!b at StartLoop) = value r k - power radix k * (!b at StartLoop) + power radix k * !lx + power radix k * !lx = value x k - y + power radix k * !lx = value x k - y + power radix k * !lx = value x !i - y = value x !i - y*) }; }; i := Int32.(+) !i (Int32.of_int 1); done; done; if Int32.(=) !i sz then !b if Int32.(=) !i sz then !b else begin else begin ... ...
This diff is collapsed.
No preview for this file type
 ... @@ -162,7 +162,7 @@ let rec reify_term renv t rt = ... @@ -162,7 +162,7 @@ let rec reify_term renv t rt = | _ -> t (* FIXME some cases missing *) | _ -> t (* FIXME some cases missing *) in in t_label ?loc:t.t_loc Slab.empty t t_label ?loc:t.t_loc Slab.empty t in in let t = rm t in let t = rm t in (* remove labels to identify terms that are equal modulo labels *) (* remove labels to identify terms that are equal modulo labels *) if Mterm.mem t renv.store if Mterm.mem t renv.store ... @@ -486,7 +486,10 @@ open Expr ... @@ -486,7 +486,10 @@ open Expr open Ity open Ity exception CannotReduce exception CannotReduce exception Raised of string * string let append l = List.fold_left (fun acc s -> acc^":"^s) "" l type value = type value = | Vconstr of rsymbol * field list | Vconstr of rsymbol * field list | Vint of BigInt.t | Vint of BigInt.t ... @@ -560,20 +563,17 @@ let get_decl env mm rs = ... @@ -560,20 +563,17 @@ let get_decl env mm rs = if debug then Format.printf "pmodule %s@." if debug then Format.printf "pmodule %s@." (pm.Pmodule.mod_theory.Theory.th_name.id_string); (pm.Pmodule.mod_theory.Theory.th_name.id_string); let tm = translate_module pm in let tm = translate_module pm in if Mid.mem id tm.mod_known let pd = Mid.find id tm.mod_from.from_km in then Mid.find id tm.mod_known match pd.pd_node with else | PDtype l -> let pd = Mid.find id tm.mod_from.from_km in let rec aux = function match pd.pd_node with | [] -> raise Not_found | PDtype l -> | d::t -> if List.mem rs d.itd_constructors then raise Constructor let rec aux = function else if List.mem rs d.itd_fields then raise Field | [] -> raise Not_found else aux t | d::t -> if List.mem rs d.itd_constructors then raise Constructor in else if List.mem rs d.itd_fields then raise Field aux l else aux t | _ -> Mid.find id tm.mod_known in aux l | _ -> raise Not_found let builtin_progs = Hrs.create 17 let builtin_progs = Hrs.create 17 ... @@ -801,6 +801,7 @@ type info = { ... @@ -801,6 +801,7 @@ type info = { vars: value Mid.t; vars: value Mid.t; recs: rsymbol Mrs.t; recs: rsymbol Mrs.t; funs: decl Mrs.t; funs: decl Mrs.t; cs: string list; (* callstack for debugging *) } } let print_id fmt id = fprintf fmt "%s" id.id_string let print_id fmt id = fprintf fmt "%s" id.id_string ... @@ -854,7 +855,7 @@ let rec interp_expr info (e:Mltree.expr) : value = ... @@ -854,7 +855,7 @@ let rec interp_expr info (e:Mltree.expr) : value = raise CannotReduce) raise CannotReduce) | Eapp (rs, le) -> begin | Eapp (rs, le) -> begin if debug then Format.printf "Eapp %a@." Expr.print_rs rs; if debug then Format.printf "Eapp %a@." Expr.print_rs rs; let eval_call info vl e = let eval_call info vl e rs = if debug then Format.printf "eval params@."; if debug then Format.printf "eval params@."; let info' = let info' = List.fold_left2 List.fold_left2 ... @@ -865,7 +866,7 @@ let rec interp_expr info (e:Mltree.expr) : value = ... @@ -865,7 +866,7 @@ let rec interp_expr info (e:Mltree.expr) : value = then Format.printf "arg %a : %a@." print_id id print_value v; then Format.printf "arg %a : %a@." print_id id print_value v; add_id id v info)