Smtml.Expr
Abstract Syntax Tree (AST) for Expressions. This module defines the representation of terms and expressions in the AST, along with constructors, accessors, simplification utilities, and pretty-printing functions. It also includes submodules for handling Boolean expressions, sets, bitvectors, and floating-point arithmetic.
type t = expr Hc.hash_consed
A term in the abstract syntax tree.
and expr = private
| Val of Value.t
A constant value.
*)| Ptr of {
base : Bitvector.t;
Base address.
*)offset : t;
Offset from base.
*)}
| Symbol of Symbol.t
A symbolic variable.
*)| List of t list
A list of expressions.
*)| App of Symbol.t * t list
Function application.
*)| Unop of Ty.t * Ty.Unop.t * t
Unary operation.
*)| Binop of Ty.t * Ty.Binop.t * t * t
Binary operation.
*)| Triop of Ty.t * Ty.Triop.t * t * t * t
Ternary operation.
*)| Relop of Ty.t * Ty.Relop.t * t * t
Relational operation.
*)| Cvtop of Ty.t * Ty.Cvtop.t * t
Conversion operation.
*)| Naryop of Ty.t * Ty.Naryop.t * t list
N-ary operation.
*)| Extract of t * int * int
Extract a bit range from an expression.
*)| Concat of t * t
Concatenate two expressions.
*)| Binder of Binder.t * t list * t
A binding expression.
*)The different types of expressions.
val hash : t -> int
hash term
computes the hash of a term.
val is_symbolic : t -> bool
is_symbolic expr
checks if an expression is symbolic (i.e., contains symbolic variables).
get_symbols exprs
extracts all symbolic variables from a list of expressions.
negate_relop expr
negates a relational operation, if applicable. Returns an error if the expression is not a relational operation.
val pp : t Fmt.t
pp fmt term
prints a term in a human-readable format using the formatter fmt
.
val pp_smt : t list Fmt.t
pp_smt fmt terms
prints a list of terms in SMT-LIB format using the formatter fmt
.
val pp_list : t list Fmt.t
pp_list fmt terms
prints a list of expressions in a human-readable format using the formatter fmt
.
val to_string : t -> string
to_string term
converts a term to a string representation.
ptr base offset
constructs a pointer expression with the given base address and offset.
symbol sym
constructs a symbolic variable expression from the given symbol.
app sym args
constructs a function application expression with the given symbol and arguments.
binder ty bindings body
constructs a ty
bidning expression with the given bindings and body.
let_in bindings body
constructs a let-binding expression with the given bindings and body.
forall bindings body
constructs a universal quantification expression with the given bindings and body.
exists bindings body
constructs an existential quantification expression with the given bindings and body.
These constructors apply simplifications during construction.
unop ty op expr
applies a unary operation with simplification.
val binop : Ty.t -> Ty.Binop.t -> t -> t -> t
binop ty op expr1 expr2
applies a binary operation with simplification.
triop ty op expr1 expr2 expr3
applies a ternary operation with simplification.
val relop : Ty.t -> Ty.Relop.t -> t -> t -> t
relop ty op expr1 expr2
applies a relational operation with simplification.
val cvtop : Ty.t -> Ty.Cvtop.t -> t -> t
cvtop ty op expr
applies a conversion operation with simplification.
val naryop : Ty.t -> Ty.Naryop.t -> t list -> t
naryop ty op exprs
applies an N-ary operation with simplification.
extract expr ~high ~low
extracts a bit range with simplification.
raw_unop ty op expr
applies a unary operation, creating a node without immediate simplification.
This function constructs the representation of a unary operation with the specified type ty
, operator op
, and operand expr
. Unlike a "smart constructor" like unop
, it does not evaluate the expression if possible, but rather creates the AST node representing the unevaluated operation.
For example:
raw_unop Ty_int Neg (value (Int 1))
returns the AST node:
Unop (Ty_int, Neg, Val (Int 1))
rather than the simplified value:
Val (Int (-1))
which would typically be the result of the smart constructor unop
.
val raw_binop : Ty.t -> Ty.Binop.t -> t -> t -> t
raw_binop ty op expr1 expr2
applies a binary operation, creating a node without immediate simplification.
This function constructs the representation of a binary operation with the specified type ty
, operator op
, and operands expr1
, expr2
. Unlike a "smart constructor" like binop
, it does not evaluate the expression if possible, but rather creates the AST node representing the unevaluated operation.
For example:
raw_binop Ty_int Add (value (Int 1)) (value (Int 2))
returns the AST node:
Binop (Ty_int, Add, Val (Int 1), Val (Int 2))
rather than the simplified value:
Val (Int 3)
which would typically be the result of the smart constructor binop
.
raw_triop ty op expr1 expr2 expr3
applies a ternary operation, creating a node without immediate simplification.
This function constructs the representation of a ternary operation with the specified type ty
, operator op
, and operands expr1
, expr2
, expr3
. Unlike a "smart constructor" like triop
, it does not evaluate the expression if possible, but rather creates the AST node representing the unevaluated operation.
For example (using a if-then-else operator):
raw_triop Ty_bool Ite (value True) (value (Int 1)) (value (Int 2))
returns the AST node:
Triop (Ty_bool, Ite, Val True, Val (Int 1), Val (Int 2))
rather than the simplified value:
Val (Int 1)
which would typically be the result of the smart constructor triop
.
val raw_relop : Ty.t -> Ty.Relop.t -> t -> t -> t
raw_relop ty op expr1 expr2
applies a relational operation, creating a node without immediate simplification.
This function constructs the representation of a relational operation with the specified operand type ty
, operator op
, and operands expr1
, expr2
. Unlike a "smart constructor" like relop
, it does not evaluate the expression if possible, but rather creates the AST node representing the unevaluated operation (which will have a boolean type).
For example:
raw_relop Ty_bool Eq (value (Int 1)) (value (Int 2))
returns the AST node:
Relop (Ty_bool, Eq, Val (Int 1), Val (Int 2))
rather than the simplified value:
Val False
which would typically be the result of the smart constructor relop
.
val raw_cvtop : Ty.t -> Ty.Cvtop.t -> t -> t
raw_cvtop ty op expr
applies a conversion operation, creating a node without immediate simplification.
This function constructs the representation of a conversion operation with the specified target type ty
, operator op
, and operand expr
. Unlike a "smart constructor" like cvtop
, it does not evaluate the conversion if possible, but rather creates the AST node representing the unevaluated operation.
For example:
raw_cvtop Ty_real Reinterpret_int (value (Int 5))
returns the AST node:
Cvtop (Ty_real, Reinterpret_int, Val (Int 5))
rather than the simplified value:
Val (Real 5.0)
which would typically be the result of the smart constructor cvtop
.
val raw_naryop : Ty.t -> Ty.Naryop.t -> t list -> t
raw_naryop ty op exprs
applies an N-ary operation without simplification.
raw_extract expr ~high ~low
extracts a bit range without simplification.
raw_concat expr1 expr2
concatenates two expressions without simplification.
module Hc : sig ... end
module Bool : sig ... end
module Set : sig ... end
module Bitv : sig ... end
module Fpa : sig ... end