1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
#![warn(missing_docs)] /*! [`EGraph`]s (and almost everything else in this crate) are parameterized over the language given by the user (by implementing the [`Language`] trait). If your Language implements [`FromStr`] (and Languages derived using [`define_language!`] do), you can easily create [`RecExpr`]s to add to an [`EGraph`]. [`EGraph`]: struct.EGraph.html [`Language`]: trait.Language.html [`RecExpr`]: struct.RecExpr.html [`define_language!`]: macro.define_language.html [`FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html Add `egg` to your `Cargo.toml` like this: ```toml [dependencies] egg = "0.4.0" ``` # Example ``` use egg::{*, rewrite as rw}; define_language! { enum SimpleLanguage { Num(i32), "+" = Add([Id; 2]), "*" = Mul([Id; 2]), // language items are parsed in order, and we want symbol to // be a fallback, so we put it last Symbol(String), } } let rules: &[Rewrite<SimpleLanguage, ()>] = &[ rw!("commute-add"; "(+ ?a ?b)" => "(+ ?b ?a)"), rw!("commute-mul"; "(* ?a ?b)" => "(* ?b ?a)"), rw!("add-0"; "(+ ?a 0)" => "?a"), rw!("mul-0"; "(* ?a 0)" => "0"), rw!("mul-1"; "(* ?a 1)" => "?a"), ]; let start = "(+ 0 (* 1 foo))".parse().unwrap(); let runner = Runner::default().with_expr(&start).run(&rules); println!( "Stopped after {} iterations, reason: {:?}", runner.iterations.len(), runner.stop_reason ); ``` !*/ mod macros; mod dot; mod eclass; mod egraph; mod extract; mod language; mod machine; mod pattern; mod rewrite; mod run; mod subst; mod unionfind; /// A key to identify [`EClass`](struct.EClass.html)es within an /// [`EGraph`](struct.EGraph.html). pub type Id = u32; pub(crate) use { pattern::{ENodeOrVar, PatternAst}, unionfind::UnionFind, }; pub use { dot::Dot, eclass::EClass, egraph::EGraph, extract::*, language::*, pattern::{Pattern, SearchMatches}, rewrite::{Applier, Condition, ConditionEqual, ConditionalApplier, Rewrite, Searcher}, run::*, subst::{Subst, Var}, }; #[cfg(test)] fn init_logger() { let _ = env_logger::builder().is_test(true).try_init(); } #[doc(hidden)] pub mod test;