diff --git a/src/plugins/wp/TacBitwised.ml b/src/plugins/wp/TacBitwised.ml index c49c61d292fe3732c9642389b32c1ce581cea0c6..4c9efb759af6245f97c86a542ab8f644806eb71e 100644 --- a/src/plugins/wp/TacBitwised.ml +++ b/src/plugins/wp/TacBitwised.ml @@ -53,22 +53,31 @@ class bitcase = ~descr:"Decompose Bitwise Equality" ~params:[prange] + (* range:(0 <= a < 2^n && 0 <= b < 2^n) + && bitwise:(forall k; 0 <= k <= n ==> (bit(a,k) <==> bit(b,k))) + |- a <= b *) + + method private process (feedback:Tactical.feedback) ~neq e a b = + if F.is_int a && F.is_int b then + let n = self#get_field vrange in + let inrange = F.p_and (range a n) (range b n) in + let bitwise = bitwise_eq a b n in + let e' = if neq then F.e_not bitwise else bitwise in + feedback#set_title "Bitwise %s. (%d bits)" + (if neq then "Neq" else "Eq") n ; + Tactical.Applicable + (fun seq -> + ("range" , (fst seq , inrange)) :: + rewrite "bitwise" e e' seq) + else + Tactical.Not_applicable + method select feedback selection = let e = Tactical.selected selection in let open Qed.Logic in match F.repr e with - | Eq(a,b) when F.is_int a && F.is_int b -> - let n = self#get_field vrange in - feedback#set_title "Bitwise Eq. (%d bits)" n ; - (* range:(0 <= a < 2^n && 0 <= b < 2^n) - && bitwise:(forall k; 0 <= k <= n ==> (bit(a,k) <==> bit(b,k))) - |- a <= b *) - let inrange = F.p_and (range a n) (range b n) in - let bitwise = bitwise_eq a b n in - Tactical.Applicable - (fun seq -> - ("range" , (fst seq , inrange)) :: - rewrite "bitwise" e bitwise seq) + | Eq(a,b) -> self#process feedback ~neq:false e a b + | Neq(a,b) -> self#process feedback ~neq:true e a b | _ -> Tactical.Not_applicable end @@ -97,7 +106,7 @@ let rec lookup push clause ~nbits ~priority p = List.iter (lookup push clause ~priority ~nbits) ps | Imply(hs,p) -> List.iter (lookup push clause ~priority ~nbits) (p::hs) - | Eq(x,y) when F.is_int x && F.is_int y -> + | Eq(x,y) | Neq(x,y) when F.is_int x && F.is_int y -> let bx = is_bitwised x in let by = is_bitwised y in if bx || by then