ai_kit 0.1.0

Collection of classic AI algorithms with convenient interfaces
Documentation
use datum::Datum;
use rule::*;

fn setup() -> Rule<Datum, Datum> {
    from_json!(Rule<Datum, Datum>, {
      "lhs": [{"vec": [{"str": "x"}, {"var": "?x"}]}],
      "rhs": {"vec": [{"str": "y"}, {"var": "?y"}]},
      "constraints": [
        {"numerical": {"set": {"variable": "?diff", "constant": 25}}},
        {"numerical": {"sum": {"first": "?x", "second": "?y", "third": "?diff"}}}
      ],
    })
}

#[test]
fn test_snowflake() {
    let rule: Rule<Datum, Datum> = setup();

    let expected_snowflake = from_json!(Rule<Datum, Datum>, {
      "lhs": [{"vec": [{"str": "x"}, {"var": "?x::test"}]}],
      "rhs": {"vec": [{"str": "y"}, {"var": "?y::test"}]},
      "constraints": [
        {"numerical": {"set": {"variable": "?diff::test", "constant": 25}}},
        {"numerical": {"sum": {"first": "?x::test", "second": "?y::test", "third": "?diff::test"}}}
      ],
    });

    assert_eq!(rule.snowflake("test".to_string()), expected_snowflake);
}

#[test]
fn test_rule_application() {
    let rule: Rule<Datum, Datum> = setup();
    let initial_datum = from_json!(Datum, {"vec": [{"str": "x"}, {"float": 10}]});
    let expected_datum = from_json!(Datum, {"vec": [{"str": "y"}, {"float": 15}]});
    let expected_bindings: Bindings<Datum> = Bindings::new().set_binding(&"?x".to_string(), Datum::Float(10.0));
    let bindings = rule.input_patterns()[0].unify(&initial_datum, &Bindings::new()).unwrap();
    assert_eq!(bindings, expected_bindings);
    assert_eq!(rule.apply_match(&bindings), Some(vec![expected_datum]));
}

#[test]
fn test_rule_application_with_no_antecedents() {
    let rule = from_json!(Rule<Datum, Datum>, {
      "rhs": {"vec": [{"str": "y"}, {"float": 1}]},
    });
    let expected_datum = from_json!(Datum, {"vec": [{"str": "y"}, {"float": 1}]});
    assert_eq!(rule.apply_match(&Bindings::new()), Some(vec![expected_datum]));
}

#[test]
fn test_rule_reverse_application() {
    let rule: Rule<Datum, Datum> = setup();
    let expected_datum = from_json!(Datum, {"vec": [{"str": "x"}, {"float": 10}]});
    let initial_datum = from_json!(Datum, {"vec": [{"str": "y"}, {"float": 15}]});
    let expected_bindings = Bindings::new()
        .set_binding(&"?diff".to_string(), Datum::Float(25.0))
        .set_binding(&"?x".to_string(), Datum::Float(10.0))
        .set_binding(&"?y".to_string(), Datum::Float(15.0));
    assert_eq!(rule.r_apply_match(&initial_datum), Some((vec![expected_datum], expected_bindings)));
}