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 simulataneous 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 mulitpattern, 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
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. Read more