tree-automata 0.1.2

Term Rewriting Systems
Documentation
extern crate terms;
extern crate tree_automata as ta;

use terms::{Term, Pattern};
use ta::Automaton;

fn main() {
    let mut a = Automaton::new();

    a.add(Pattern::cons('a', &[]), (), "ab");
    a.add(Pattern::cons('b', &[]), (), "ab");
    a.add(Pattern::cons('b', &[]), (), "bc");
    a.add(Pattern::cons('c', &[]), (), "bc");

    assert!(a.configurations_for(&Pattern::cons('a', &[])).next().is_some());
    assert!(a.configurations_for(&Pattern::cons('a', &[])).next().is_some());
    assert!(a.configurations_for(&Pattern::cons('a', &[])).next().is_some());
    assert!(a.configurations_for(&Pattern::cons('a', &[])).next().is_some());

    a.add(Pattern::cons('i', &["ab".into()]), (), "i(ab)");
    a.add(Pattern::cons('j', &["ab".into()]), (), "j(ab)");
    a.add(Pattern::cons('k', &["ab".into()]), (), "k(ab)");
    a.add(Pattern::cons('l', &["ab".into()]), (), "l(ab)");
    a.add(Pattern::cons('l', &["bc".into()]), (), "l(bc)");
    a.add(Pattern::cons('m', &["bc".into()]), (), "m(bc)");
    a.add(Pattern::cons('n', &["bc".into()]), (), "n(bc)");
    a.add(Pattern::cons('o', &["bc".into()]), (), "o(bc)");

    a.add(Pattern::cons('f', &["i(ab)".into()]), (), "f(ij)|g(kl)");
    a.add(Pattern::cons('f', &["j(ab)".into()]), (), "f(ij)|g(kl)");
    a.add(Pattern::cons('g', &["k(ab)".into()]), (), "f(ij)|g(kl)");
    a.add(Pattern::cons('g', &["l(ab)".into()]), (), "f(ij)|g(kl)");
    a.add(Pattern::cons('g', &["l(bc)".into()]), (), "g(lm)|h(no)");
    a.add(Pattern::cons('g', &["m(bc)".into()]), (), "g(lm)|h(no)");
    a.add(Pattern::cons('h', &["n(bc)".into()]), (), "g(lm)|h(no)");
    a.add(Pattern::cons('h', &["o(bc)".into()]), (), "g(lm)|h(no)");

    let automata = [&a, &a];
    let positions = ["f(ij)|g(kl)".into(), "g(lm)|h(no)".into()];
    let patterns = [(), ()];
    let constraints = ();

    // g(l(b))
    let term = Term::new('g', &[Term::new('l', &[Term::new('b', &[])])]);

    let mut it = Automaton::synchronized_runs(
        &automata,
        &positions,
        &patterns,
        &constraints
    );

    // we should find term "g(l(b))"
    let mut empty = true;
    for (run, _) in it {
        empty = false;
        let t = run.first().unwrap();
        println!("term: {:?}", t);
        assert!(*t == term)
    }
    assert!(!empty);
}