Skip to main content

TermManager

Struct TermManager 

Source
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

Source

pub fn new() -> Result<TermManager>

Construct a TermManager with the default backend (if any is available).

Source

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.

Source

pub fn with_backend(backend: impl Backend) -> Result<TermManager>

Construct a TermManager over a given Backend.

Source

pub fn with_pool( backend: impl Backend, pool: Rc<dyn TermPool>, ) -> Result<TermManager>

Construct a TermManager over a given Backend and TermPool.

Source

pub fn pool(&self) -> &dyn TermPool

Return a reference to the underlying TermPool.

Trait Implementations§

Source§

impl Clone for TermManager

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TermManager

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Az for T

Source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

Source§

fn cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> CheckedAs for T

Source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

Source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> OverflowingAs for T

Source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

Source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
Source§

impl<T> SaturatingAs for T

Source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

Source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> StrictAs for T

Source§

fn strict_as<Dst>(self) -> Dst
where T: StrictCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> StrictCastFrom<Src> for Dst
where Src: StrictCast<Dst>,

Source§

fn strict_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> UnwrappedAs for T

Source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

Source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> WrappingAs for T

Source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

Source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.