pub struct TermManager { /* private fields */ }Expand description
Type that manages the backend’s “term manager” (or “context”) and subterm sharing.
Most SMT APIs separate the “term manager” (also called “context”), responsible for managing subterm sharing and the creation and lifetime management of term objects, from the “solver”, which is responsible for the actual reasoning.
formally::smt does the same, where TermManager manages subterm sharing (through an underlying instance of TermPool) and a handle to the underlying backend’s term manager (e.g. TermManager in cvc5 or Z3_context in Z3).
The handle to the underlying backend’s manager performs the conversion from Term to the internal representation of terms of the backend (e.g. Z3_ast in Z3).
A term manager is mainly used by giving a reference to it to one or more Solver instances. Solvers built on the same manager can use the same terms which will be converted to the underlying backend’s representation only once, saving time.
Example:
use formally::{smt::{*, backends::z3::Z3}};
let manager = Rc::new(TermManager::with_backend(Z3)?);
let config = Config::new();
let mut slv1 = Solver::with_manager(&config, manager.clone())?;
let mut slv2 = Solver::with_manager(&config, manager)?;
let x1 = slv1.declare(Declaration::constant("x", sort!(Int)))?;
let x2 = slv2.declare(Declaration::constant("x", sort!(Int)))?;
// Equivalent declarations/definitions result in the same `Declared`/`Defined` objects
assert_eq!(x1, x2);
let t1 = slv1.lookup(term!(* x x), Role::Function)?;
let t2 = slv2.lookup(term!(* x x), Role::Function)?;
// Equivalent terms result into the same [Term] objects
assert_eq!(t1, t2);
Since most SMT APIs are not threadsafe, TermManager is not Send nor Sync and must therefore be accessed and used by a single thread only. However, one can construct it using TermManager::with_pool() and passing a DashPool instance, which is a concurrent TermPool that allows to at least share the same terms among different threads.
Implementations§
Source§impl TermManager
impl TermManager
Sourcepub fn new() -> Result<TermManager>
pub fn new() -> Result<TermManager>
Construct a TermManager with the default backend (if any is available).
Sourcepub fn with_backend_name<'a>(
backend: impl Into<Identifier<'a>>,
) -> Result<TermManager>
pub fn with_backend_name<'a>( backend: impl Into<Identifier<'a>>, ) -> Result<TermManager>
Construct a TermManager over a given Backend looked up by name, if it exists.
Sourcepub fn with_backend(backend: impl Backend) -> Result<TermManager>
pub fn with_backend(backend: impl Backend) -> Result<TermManager>
Construct a TermManager over a given Backend.
Sourcepub fn with_pool(
backend: impl Backend,
pool: Rc<dyn TermPool>,
) -> Result<TermManager>
pub fn with_pool( backend: impl Backend, pool: Rc<dyn TermPool>, ) -> Result<TermManager>
Construct a TermManager over a given Backend and TermPool.
Trait Implementations§
Source§impl Clone for TermManager
impl Clone for TermManager
Auto Trait Implementations§
impl !Freeze for TermManager
impl !RefUnwindSafe for TermManager
impl !Send for TermManager
impl !Sync for TermManager
impl !UnwindSafe for TermManager
impl Unpin for TermManager
impl UnsafeUnpin for TermManager
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
Source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
Source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
Source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more