Struct MultiPattern

Source
pub struct MultiPattern<L> { /* private fields */ }
Expand description

A set of open expressions bound to variables.

Multipatterns bind many expressions to variables, allowing for simultaneous searching or application of many terms constrained to the same substitution.

Multipatterns are good for writing graph rewrites or datalog-style rules.

You can create multipatterns via the MultiPattern::new function or the multi_rewrite! macro.

MultiPattern implements both Searcher and Applier. When searching a multipattern, the result ensures that patterns bound to the same variable are equivalent. When applying a multipattern, patterns bound a variable occuring in the searcher are unioned with that e-class.

Multipatterns currently do not support the explanations feature.

Implementations§

Source§

impl<L: Language> MultiPattern<L>

Source

pub fn new(asts: Vec<(Var, PatternAst<L>)>) -> Self

Creates a new multipattern, binding the given patterns to the corresponding variables.

use egg::*;

let mut egraph = EGraph::<SymbolLang, ()>::default();
egraph.add_expr(&"(f a a)".parse().unwrap());
egraph.add_expr(&"(f a b)".parse().unwrap());
egraph.add_expr(&"(g a a)".parse().unwrap());
egraph.add_expr(&"(g a b)".parse().unwrap());
egraph.rebuild();

let f_pat: PatternAst<SymbolLang> = "(f ?x ?y)".parse().unwrap();
let g_pat: PatternAst<SymbolLang> = "(g ?x ?y)".parse().unwrap();
let v1: Var = "?v1".parse().unwrap();
let v2: Var = "?v2".parse().unwrap();

let multipattern = MultiPattern::new(vec![(v1, f_pat), (v2, g_pat)]);
// you can also parse multipatterns
assert_eq!(multipattern, "?v1 = (f ?x ?y), ?v2 = (g ?x ?y)".parse().unwrap());

assert_eq!(multipattern.n_matches(&egraph), 2);

Trait Implementations§

Source§

impl<L: Language, A: Analysis<L>> Applier<L, A> for MultiPattern<L>

Source§

fn apply_one( &self, _egraph: &mut EGraph<L, A>, _eclass: Id, _subst: &Subst, _searcher_ast: Option<&PatternAst<L>>, _rule_name: Symbol, ) -> Vec<Id>

Apply a single substitution. Read more
Source§

fn apply_matches( &self, egraph: &mut EGraph<L, A>, matches: &[SearchMatches<'_, L>], _rule_name: Symbol, ) -> Vec<Id>

Apply many substitutions. Read more
Source§

fn vars(&self) -> Vec<Var>

Returns a list of variables that this Applier assumes are bound. Read more
Source§

fn get_pattern_ast(&self) -> Option<&PatternAst<L>>

For patterns, get the ast directly as a reference.
Source§

impl<L: Clone> Clone for MultiPattern<L>

Source§

fn clone(&self) -> MultiPattern<L>

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<L: Debug> Debug for MultiPattern<L>

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<L: Language + FromOp> FromStr for MultiPattern<L>

Source§

type Err = MultiPatternParseError<<RecExpr<ENodeOrVar<L>> as FromStr>::Err>

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Self, Self::Err>

Parses a string s to return a value of this type. Read more
Source§

impl<L: PartialEq> PartialEq for MultiPattern<L>

Source§

fn eq(&self, other: &MultiPattern<L>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<L: Language, A: Analysis<L>> Searcher<L, A> for MultiPattern<L>

Source§

fn search_eclass_with_limit( &self, egraph: &EGraph<L, A>, eclass: Id, limit: usize, ) -> Option<SearchMatches<'_, L>>

Similar to search_eclass, but return at most limit many matches. Read more
Source§

fn vars(&self) -> Vec<Var>

Returns a list of the variables bound by this Searcher
Source§

fn search_eclass( &self, egraph: &EGraph<L, N>, eclass: Id, ) -> Option<SearchMatches<'_, L>>

Search one eclass, returning None if no matches can be found. This should not return a SearchMatches with no substs.
Source§

fn search(&self, egraph: &EGraph<L, N>) -> Vec<SearchMatches<'_, L>>

Search the whole EGraph, returning a list of all the SearchMatches where something was found. This just calls Searcher::search_with_limit with a big limit.
Source§

fn search_with_limit( &self, egraph: &EGraph<L, N>, limit: usize, ) -> Vec<SearchMatches<'_, L>>

Similar to search, but return at most limit many matches.
Source§

fn n_matches(&self, egraph: &EGraph<L, N>) -> usize

Returns the number of matches in the e-graph
Source§

fn get_pattern_ast(&self) -> Option<&PatternAst<L>>

For patterns, return the ast directly as a reference
Source§

impl<L: Eq> Eq for MultiPattern<L>

Source§

impl<L> StructuralPartialEq for MultiPattern<L>

Auto Trait Implementations§

§

impl<L> Freeze for MultiPattern<L>

§

impl<L> RefUnwindSafe for MultiPattern<L>
where L: RefUnwindSafe,

§

impl<L> Send for MultiPattern<L>
where L: Send,

§

impl<L> Sync for MultiPattern<L>
where L: Sync,

§

impl<L> Unpin for MultiPattern<L>
where L: Unpin,

§

impl<L> UnwindSafe for MultiPattern<L>
where L: UnwindSafe,

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> 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<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<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
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> 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 = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.