2024-06-06 16:09:13 +02:00
|
|
|
open Value_domain
|
|
|
|
|
|
|
|
module type CROSS_REDUCTION = sig
|
|
|
|
module V : VALUE_DOMAIN
|
|
|
|
module W : VALUE_DOMAIN
|
|
|
|
val cr : V.t * W.t -> V.t*W.t
|
|
|
|
end
|
|
|
|
|
|
|
|
module ReducedProduct (C : CROSS_REDUCTION) : VALUE_DOMAIN = struct
|
|
|
|
type t = C.V.t * C.W.t
|
|
|
|
let top = C.V.top, C.W.top
|
|
|
|
let bottom = C.V.bottom, C.W.bottom (* other representations possible; this one is cr - stable.*)
|
|
|
|
|
|
|
|
let const z = C.V.const z, C.W.const z
|
|
|
|
let rand a b = C.V.rand a b, C.W.rand a b
|
|
|
|
let unary p uop = let p = C.cr p in C.cr ((C.V.unary (fst p) uop),(C.W.unary (snd p) uop))
|
|
|
|
let binary p p' binop = let p, p' = C.cr p, C.cr p' in C.cr (
|
|
|
|
(C.V.binary (fst p) (fst p') binop),
|
|
|
|
(C.W.binary (snd p) (snd p') binop))
|
|
|
|
let compare p p' cop = let p, p' = C.cr p, C.cr p' in
|
|
|
|
let vp, vp' = (C.V.compare (fst p) (fst p') cop) in
|
|
|
|
let wp, wp' = (C.W.compare (snd p) (snd p') cop) in
|
|
|
|
C.cr (vp, wp), C.cr (vp', wp')
|
|
|
|
let bwd_unary p uop r = let p = C.cr p in C.cr (
|
|
|
|
(C.V.bwd_unary (fst p) uop (fst r)),
|
|
|
|
(C.W.bwd_unary (snd p) uop (snd r)))
|
|
|
|
let bwd_binary p p' bop r = let p,p' = C.cr p, C.cr p' in
|
|
|
|
let vp, vp' = C.V.bwd_binary (fst p) (fst p') bop (fst r) in
|
|
|
|
let wp, wp' = C.W.bwd_binary (snd p) (snd p') bop (snd r) in
|
|
|
|
C.cr (vp, wp), C.cr (vp', wp')
|
|
|
|
let join p p' = let p,p' = C.cr p,C.cr p' in C.cr (
|
|
|
|
(C.V.join (fst p) (fst p')),
|
|
|
|
(C.W.join (snd p) (snd p')))
|
|
|
|
let meet p p' = let p,p' = C.cr p,C.cr p' in C.cr (
|
|
|
|
(C.V.meet (fst p) (fst p')),
|
|
|
|
(C.W.meet (snd p) (snd p')))
|
|
|
|
|
2024-06-08 10:48:13 +02:00
|
|
|
(* we do NOT cross-reduce p : it would not guarantee convergence anymore *)
|
2024-06-06 16:09:13 +02:00
|
|
|
let widen p p' = let p' = C.cr p' in C.V.widen (fst p) (fst p'), C.W.widen (snd p) (snd p')
|
|
|
|
let narrow p p' = let p' = C.cr p' in C.V.narrow (fst p) (fst p'), C.W.narrow (snd p) (snd p')
|
|
|
|
|
|
|
|
let subset p p' = let p, p' = C.cr p, C.cr p' in
|
|
|
|
C.V.subset (fst p) (fst p') && C.W.subset (snd p) (snd p')
|
|
|
|
let is_bottom p = (C.cr p) = bottom
|
|
|
|
let print fmt p =
|
2024-06-08 10:48:13 +02:00
|
|
|
Format.fprintf fmt "@[<h 0>(%a, %a)@]" C.V.print (fst p) C.W.print (snd p)
|
2024-06-06 16:09:13 +02:00
|
|
|
end
|
2024-06-08 10:48:13 +02:00
|
|
|
|