holmes 0.1.0

Holmes Inference System
Documentation
#[macro_use]
extern crate holmes;
use holmes::simple::*;

#[test]
pub fn register_where_rule() {
    single(&|holmes: &mut Engine, core: &mut Core| {
        holmes_exec!(holmes, {
      predicate!(test_pred(string, bytes, uint64));
      rule!(test_pred(("bar"), (vec![2u8,2u8]), x) <= test_pred(("foo"), [_], x), {
        let (42) = (42)})
    })?;
        core.run(holmes.quiesce()).unwrap();
        Ok(())
    })
}

#[test]
pub fn where_const() {
    single(&|holmes: &mut Engine, core: &mut Core| {
        try!(holmes_exec!(holmes, {
      predicate!(test_pred(string, bytes, uint64));
      rule!(test_pred(("bar"), (vec![2u8,2u8]), x) <= test_pred(("foo"), [_], [_]), {
          let x = (42)
      });
      fact!(test_pred("foo", vec![0u8,1u8], 16))
    }));
        core.run(holmes.quiesce()).unwrap();
        assert_eq!(query!(holmes, test_pred(("bar"), x, y)).unwrap(),
               vec![vec![vec![2u8,2u8].to_value(), 42.to_value()]]);
        Ok(())
    })
}

#[test]
pub fn where_plus_two() {
    single(&|holmes: &mut Engine, core: &mut Core| {
        try!(holmes_exec!(holmes, {
      predicate!(test_pred(string, bytes, uint64));
      func!(let plus_two : uint64 -> uint64 = |v : &u64| {v + 2});
      rule!(test_pred(("bar"), (vec![2u8,2u8]), y) <= test_pred(("foo"), [_], x), {
        let y = {plus_two([x])}
      });
      fact!(test_pred("foo", vec![0u8,1u8], 16))
    }));
        core.run(holmes.quiesce()).unwrap();
        assert_eq!(query!(holmes, test_pred(("bar"), x, y)).unwrap(),
               vec![vec![vec![2u8,2u8].to_value(), 18.to_value()]]);
        let res: Result<()> = Ok(());
        res
    })
}

#[test]
pub fn where_destructure() {
    single(&|holmes: &mut Engine, core: &mut Core| {
        try!(holmes_exec!(holmes, {
      predicate!(test_pred(uint64, bytes, uint64));
      func!(let succs : uint64 -> (uint64, uint64) = |n : &u64| {
        (n + 1, n + 2)
      });
      rule!(test_pred(y, (vec![2u8,2u8]), z) <= test_pred((3), [_], x), {
        let {y, z} = {succs([x])}
      });
      fact!(test_pred(3, vec![0u8,1u8], 16))
    }));
        core.run(holmes.quiesce()).unwrap();
        assert_eq!(query!(holmes, test_pred(y, (vec![2u8,2u8]), z)).unwrap(),
               vec![vec![17.to_value(), 18.to_value()]]);
        Ok(())
    })
}

#[test]
pub fn where_iter() {
    single(&|holmes: &mut Engine, core: &mut Core| {
        try!(holmes_exec!(holmes, {
      predicate!(test_pred(uint64, bytes, uint64));
      func!(let succs : uint64 -> [uint64] = |n : &u64| {
        vec![n + 1, n + 2]
      });
      rule!(test_pred((4), (vec![2u8,2u8]), y) <= test_pred((3), [_], x), {
        let [y] = {succs([x])}
      });
      fact!(test_pred(3, vec![0u8,1u8], 16))
    }));
        core.run(holmes.quiesce()).unwrap();
        assert_eq!(query!(holmes, test_pred([_], (vec![2u8,2u8]), x)).unwrap(),
               vec![vec![17.to_value()], vec![18.to_value()]]);
        Ok(())
    })
}