Struct egg::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 copy 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>

§

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<MultiPattern<L>> for MultiPattern<L>

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

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

This method 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 search_eclass on each eclass.
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> StructuralEq for MultiPattern<L>

source§

impl<L> StructuralPartialEq for MultiPattern<L>

Auto Trait Implementations§

§

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 Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. Read more
source§

impl<Q, K> Equivalent<K> for Qwhere 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 Twhere 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 Twhere T: Clone,

§

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 Twhere U: Into<T>,

§

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 Twhere U: TryFrom<T>,

§

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.