avalog 0.7.2

An experimental implementation of Avatar Logic with a Prolog-like syntax
Documentation
extern crate avalog;

fn check(facts: &'static str, goals: &'static str) {
    use avalog::{solve_with_accelerator, parse, infer, Accelerator, ParseData};

    let facts: ParseData = parse(facts).unwrap();
    let goals = parse(goals).unwrap();
    assert!(solve_with_accelerator(
        &facts,
        &goals,
        None,
        &[],
        &[],
        infer,
        &mut Accelerator::new()
    ).1.is_ok());
}

fn fail(facts: &'static str, goals: &'static str) {
    use avalog::{solve_with_accelerator, parse, infer, Accelerator, ParseData};

    let facts: ParseData = parse(facts).unwrap();
    let goals = parse(goals).unwrap();
    assert!(solve_with_accelerator(
        &facts,
        &goals,
        None,
        &[],
        &[],
        infer,
        &mut Accelerator::new()
    ).1.is_err());
}

#[test]
fn capital() {
    check("source/capital.txt", "source/capital-0.txt");
}

#[test]
fn category() {
    check("source/category.txt", "source/category-0.txt");
}

#[test]
fn chu_space() {
    check("source/chu_space.txt", "source/no_amb.txt");
}

#[test]
fn assocativity() {
    check("source/associativity.txt", "source/associativity-0.txt");
}

#[test]
fn bool_alg() {
    check("source/bool_alg.txt", "source/bool_alg-0.txt");
}

#[test]
fn squares() {
    check("source/squares.txt", "source/squares-0.txt");
    check("source/squares2.txt", "source/squares2-0.txt");
    check("source/squares3.txt", "source/squares3-0.txt");
    check("source/squares4.txt", "source/squares4-0.txt");
}

#[test]
fn convert_unique_has_into_eq() {
    check("source/convert_has_into_eq.txt", "source/convert_has_into_eq-0.txt");
    fail("source/convert_has_into_eq2.txt", "source/convert_has_into_eq2-0.txt");
    check("source/convert_has_into_eq3.txt", "source/convert_has_into_eq3-0.txt");
    check("source/convert_has_into_eq4.txt", "source/convert_has_into_eq4-0.txt");
    check("source/convert_has_into_eq5.txt", "source/convert_has_into_eq5-0.txt");
    fail("source/convert_has_into_eq6.txt", "source/convert_has_into_eq6-0.txt");
    check("source/convert_has_into_eq6.txt", "source/convert_has_into_eq6-1.txt");
}

#[test]
fn convert_eq_into_has() {
    check("source/convert_eq_into_has.txt", "source/convert_eq_into_has-0.txt");
}

#[test]
fn copy() {
    check("source/copy.txt", "source/copy-0.txt");
}

#[test]
fn role_lift() {
    check("source/role_lift_app.txt", "source/role_lift_app-0.txt");
    check("source/role_lift_ava.txt", "source/role_lift_ava-0.txt");
    check("source/role_lift_inner.txt", "source/role_lift_inner-0.txt");
    check("source/role_lift_eq.txt", "source/role_lift_eq-0.txt");
}

#[test]
fn amb_fail() {
    fail("source/amb_fail.txt", "source/amb.txt");
}

#[test]
fn amb_success() {
    check("source/amb_success.txt", "source/amb.txt");
    check("source/amb_success-2.txt", "source/amb.txt");
}

#[test]
fn app_match() {
    fail("source/app_match.txt", "source/amb.txt");
}

#[test]
fn string() {
    check("source/string.txt", "source/string.txt");
}

#[test]
fn app_empty() {
    check("source/app_empty.txt", "source/app_empty.txt");
}