Pulselib.PulseFormulaTermmodule L = IBase.Loggingmodule CItv = PulseCItvmodule SatUnsat = PulseSatUnsatmodule Debug = PulseFormulaDebugmodule Var = PulseFormulaVarmodule Q = QSafeCappedmodule Z = ZSafemodule LinArith = PulseFormulaLinAritval compare_function_symbol : function_symbol -> function_symbol -> intval equal_function_symbol : function_symbol -> function_symbol -> boolval yojson_of_function_symbol :
function_symbol ->
Ppx_yojson_conv_lib.Yojson.Safe.tval pp_function_symbol : Var.F.formatter -> function_symbol -> unittype operand = | AbstractValueOperand of Var.t| ConstOperand of IR.Const.t| FunctionApplicationOperand of {f : function_symbol;actuals : Var.t list;}val pp_operand : Var.F.formatter -> operand -> unittype 'term_t subst_target = 'term_t LinArith.subst_target = | QSubst of Q.t| ConstantSubst of 'term_t * Var.t option| VarSubst of Var.t| LinSubst of LinArith.t| NonLinearTermSubst of 'term_tval subst_f : Var.Map.key Var.Map.t -> Var.Map.key -> Var.Map.keyval targetted_subst_var :
Var.Map.key Var.Map.t ->
Var.Map.key ->
'a subst_targetExpressive term structure to be able to express all of SIL, but the main smarts of the formulas are for the equality between variables and linear arithmetic subsets. Terms (and atoms, below) are kept as a last-resort for when outside that fragment.
type t = | Const of Q.t| String of string| Var of Var.t| Procname of IR.Procname.t| FunctionApplication of {}| Linear of LinArith.t| Add of t * t| Minus of t| LessThan of t * t| LessEqual of t * t| Equal of t * t| NotEqual of t * t| Mult of t * t| DivI of t * t| DivF of t * t| And of t * t| Or of t * t| Not of t| Mod of t * t| BitAnd of t * t| BitOr of t * t| BitNot of t| BitShiftLeft of t * t| BitShiftRight of t * t| BitXor of t * t| StringConcat of t * t| IsInstanceOf of {}| IsInt of tval yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.tval needs_paren : t -> boolval pp_paren :
(F.formatter -> LinArith.Var.t -> unit) ->
needs_paren:(t -> bool) ->
F.formatter ->
t ->
unitval pp_no_paren :
(F.formatter -> LinArith.Var.t -> unit) ->
F.formatter ->
t ->
unitval pp : (F.formatter -> LinArith.Var.t -> unit) -> F.formatter -> t -> unitval of_intlit : IR.IntLit.t -> tval of_const : IR.Const.t -> tval of_subst_target : t subst_target -> tval one : tval zero : tval of_bool : bool -> tval of_binop : IR.Binop.t -> t -> t -> tval is_zero : t -> boolval is_non_zero_const : t -> boolval has_known_non_boolean_type : t -> boolFold f on the strict sub-terms of t, if any. Preserve physical equality if f does.
val satunsat_map_direct_subterms :
t ->
f:(t -> t SatUnsat.Import.sat_unsat_t) ->
t SatUnsat.Import.sat_unsat_tval fold_subst_variables :
init:'a ->
f_subst:('a -> LinArith.Var.t -> 'a * t LinArith.subst_target) ->
?f_post:(prev:t -> 'a -> t -> 'a * t) ->
t ->
'a * tval fold_variables :
init:'a ->
f:('a -> LinArith.Var.t -> 'a) ->
?f_post:(prev:t -> 'a -> t -> 'a * t) ->
t ->
'aval iter_variables : t -> f:(LinArith.Var.t -> unit) -> unitval subst_variables :
f:(LinArith.Var.t -> t LinArith.subst_target) ->
?f_post:(prev:t -> unit -> t -> unit * t) ->
t ->
tval eval_const_shallow : t -> t SatUnsat.Import.sat_unsat_tval simplify_shallow : t -> t SatUnsat.Import.sat_unsat_tmore or less syntactic attempt at detecting when an arbitrary term is a linear formula; call Atom.eval_term first for best results
val is_non_numeric_constant : t -> boolval get_as_linear : t -> LinArith.t optionval to_subst_target : t -> t subst_targetmodule VarMap : sig ... endmodule Set : sig ... end