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>
impl<L: Language> MultiPattern<L>
sourcepub fn new(asts: Vec<(Var, PatternAst<L>)>) -> Self
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>
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>
fn apply_one( &self, _egraph: &mut EGraph<L, A>, _eclass: Id, _subst: &Subst, _searcher_ast: Option<&PatternAst<L>>, _rule_name: Symbol ) -> Vec<Id>
source§fn apply_matches(
&self,
egraph: &mut EGraph<L, A>,
matches: &[SearchMatches<'_, L>],
_rule_name: Symbol
) -> Vec<Id>
fn apply_matches( &self, egraph: &mut EGraph<L, A>, matches: &[SearchMatches<'_, L>], _rule_name: Symbol ) -> Vec<Id>
source§fn vars(&self) -> Vec<Var>
fn vars(&self) -> Vec<Var>
source§fn get_pattern_ast(&self) -> Option<&PatternAst<L>>
fn get_pattern_ast(&self) -> Option<&PatternAst<L>>
source§impl<L: Clone> Clone for MultiPattern<L>
impl<L: Clone> Clone for MultiPattern<L>
source§fn clone(&self) -> MultiPattern<L>
fn clone(&self) -> MultiPattern<L>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<L: Debug> Debug for MultiPattern<L>
impl<L: Debug> Debug for MultiPattern<L>
source§impl<L: PartialEq> PartialEq<MultiPattern<L>> for MultiPattern<L>
impl<L: PartialEq> PartialEq<MultiPattern<L>> for MultiPattern<L>
source§fn eq(&self, other: &MultiPattern<L>) -> bool
fn eq(&self, other: &MultiPattern<L>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<L: Language, A: Analysis<L>> Searcher<L, A> for MultiPattern<L>
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>>
fn search_eclass_with_limit( &self, egraph: &EGraph<L, A>, eclass: Id, limit: usize ) -> Option<SearchMatches<'_, L>>
source§fn search_eclass(
&self,
egraph: &EGraph<L, N>,
eclass: Id
) -> Option<SearchMatches<'_, L>>
fn search_eclass( &self, egraph: &EGraph<L, N>, eclass: Id ) -> Option<SearchMatches<'_, L>>
source§fn search(&self, egraph: &EGraph<L, N>) -> Vec<SearchMatches<'_, L>>
fn search(&self, egraph: &EGraph<L, N>) -> Vec<SearchMatches<'_, L>>
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>>
fn search_with_limit( &self, egraph: &EGraph<L, N>, limit: usize ) -> Vec<SearchMatches<'_, L>>
search
, but return at most limit
many matches.source§fn n_matches(&self, egraph: &EGraph<L, N>) -> usize
fn n_matches(&self, egraph: &EGraph<L, N>) -> usize
source§fn get_pattern_ast(&self) -> Option<&PatternAst<L>>
fn get_pattern_ast(&self) -> Option<&PatternAst<L>>
impl<L: Eq> Eq for MultiPattern<L>
impl<L> StructuralEq for MultiPattern<L>
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> 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<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.