package smtml
Install
dune-project
Dependency
Authors
-
JJoão Pereira <joaomhmpereira@tecnico.ulisboa.pt>
-
FFilipe Marques <filipe.s.marques@tecnico.ulisboa.pt>
-
HHichem Rami Ait El Hara <hra@ocamlpro.com>
-
LLéo Andrès <contact@ndrs.fr>
-
AArthur Carcano <arthur.carcano@ocamlpro.com>
-
PPierre Chambart <pierre.chambart@ocamlpro.com>
-
JJosé Fragoso Santos <jose.fragoso@tecnico.ulisboa.pt>
Maintainers
Sources
md5=f8549c12d40e6a1dafcced7e319887a4
sha512=f147faa9e2519585cfe9b11654b750061259da4db0b2136d9047b4cb480abb562f6ac627545fd06461f4414acba57558713868de370f58131f3face308f7c7f0
doc/smtml/Smtml/Expr/index.html
Module Smtml.Expr
Source
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.
Expression Types
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.
*)
}
| Loc of Loc.t
(*Abstract location
*)| 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.
Constructors and Accessors
Type and Symbol Handling
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.
Pretty Printing
pp_smt fmt terms
prints a list of terms in SMT-LIB format using the formatter fmt
.
pp_list fmt terms
prints a list of expressions in a human-readable format using the formatter fmt
.
Expression Constructors
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.
Smart Constructors for Operations
These constructors apply simplifications during construction.
unop ty op expr
applies a unary operation with simplification.
binop ty op expr1 expr2
applies a binary operation with simplification.
triop ty op expr1 expr2 expr3
applies a ternary operation with simplification.
relop ty op expr1 expr2
applies a relational operation with simplification.
cvtop ty op expr
applies a conversion operation with simplification.
naryop ty op exprs
applies an N-ary operation with simplification.
extract expr ~high ~low
extracts a bit range with simplification.
Raw Constructors for Operations
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
.
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
.
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
.
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
.
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.