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 = ();
let term = Term::new('g', &[Term::new('l', &[Term::new('b', &[])])]);
let mut it = Automaton::synchronized_runs(
&automata,
&positions,
&patterns,
&constraints
);
let mut empty = true;
for (run, _) in it {
empty = false;
let t = run.first().unwrap();
println!("term: {:?}", t);
assert!(*t == term)
}
assert!(!empty);
}