use mini_kanren::goals::list::membero;
use mini_kanren::prelude::*;
use mini_kanren::{conda, conde, conj, defrel, list, run};
defrel! {
whiche(x, s1, s2, r) {
conde! {
membero(x.clone(), s1.clone()), membero(x.clone(), s2.clone()), eq(r.clone(), "both");
membero(x.clone(), s1.clone()), eq(r.clone(), "one");
membero(x.clone(), s2.clone()), eq(r.clone(), "two");
}
}
}
defrel! {
whicha(x, s1, s2, r) {
conda! {
conj!(membero(x.clone(), s1.clone()), membero(x.clone(), s2.clone()), eq(r.clone(), "both"));
conj!(membero(x.clone(), s1.clone()), eq(r.clone(), "one"));
conj!(membero(x.clone(), s2.clone()), eq(r.clone(), "two"));
}
}
}
fn main() {
println!(
"Which list contains 3 using conde? {:?}",
run!(*, q, whiche(3, list![1, 2, 3], list![3, 4, 5], q))
);
println!(
"Which list contains 3 using conda? {:?}",
run!(*, q, whicha(3, list![1, 2, 3], list![3, 4, 5], q))
);
}