let evalsel getv target constr =
let evalsel v = function
|(`Eq,w) -> v = (getv w)
|(`Geq,w) -> v >= (getv w)
|(`Leq,w) -> v <= (getv w)
|(`Gt,w) -> v > (getv w)
|(`Lt,w) -> v < (getv w)
|(`Neq,w) -> v <> (getv w)
in
match target with
|`Hi v -> evalsel ((getv v) + 1) constr
|`Lo v -> evalsel ((getv v) - 1) constr
|`Eq v -> evalsel (getv v) constr
|`In (v1,v2) -> evalsel ((getv v2) - 1) constr