use super::*;
pub fn std() -> Vec<Knowledge> {
vec![
Def(False1, Ret(Bool(false))),
Def(Not, _if(false, true)),
Def(Idb, _if(true, false)),
Def(True1, Ret(Bool(true))),
Def(And, _if(_if(true, false), false)),
Def(Or, _if(true, _if(true, false))),
Def(Eqb, _if(_if(true, false), _if(false, true))),
Def(Xor, _if(_if(false, true), _if(true, false))),
Def(Nand, _if(_if(false, true), true)),
Def(Nor, _if(false, _if(false, true))),
Def(Exc, _if(_if(false, true), false)),
Def(Imply, _if(_if(true, false), true)),
Def(Fstb, _if(true, false)),
Def(Sndb, _if(_if(true, false), _if(true, false))),
Red(app("x", head_tail_tup("y", "z")), app2("x", "y", "z")),
Red(constr("x", head_tail_tup("y", "z")), constr(constr("x", "y"), "z")),
Red(app2(constr(constr("x", "y"), "z"), "a", "b"),
app(constr(app(constr("x", "y"), "a"), "z"), "b")),
Red(app(("g", "f"), head_tail_tup("y", "z")),
(app2("g", "y", "z"), app2("f", "y", "z")).into()),
Red(app(_if("x", Any), true), "x".into()),
Red(app(_if(Any, "x"), false), "x".into()),
Red(constr(app(_if("x", Any), Any), true), "x".into()),
Red(constr(app(_if(Any, "x"), Any), false), "x".into()),
Red(Tup(vec!["x".into()]), "x".into()),
Red(app(ret_var("x"), Any), "x".into()),
Red(app(Ex, ret_var("x")), app(Eq, "x")),
Red(app(Ex, constr("f", "f")), Idb.into()),
Red(app("x", Tup(vec![])), "x".into()),
Red(path("f", ("g", "g")), path("f", "g")),
Red(path("f", ("g", "g", "g")), path("f", "g")),
Red(app(Triv, constr("f", "g")), "g".into()),
Red(app(Triv, no_constr("f")), true.into()),
Red(comp(Not, Not), Idb.into()),
Red(path(Not, Not), Not.into()),
Red(comp("x", Id), "x".into()),
Red(comp(Id, "x"), "x".into()),
Red(path("x", Id), "x".into()),
Red(path(Id, "x"), Id.into()),
Red(path(And, Not), Or.into()),
Red(path(Or, Not), And.into()),
Red(path(Xor, Not), Eqb.into()),
Red(path(Eqb, Not), Xor.into()),
Red(path(Nand, Not), Nor.into()),
Red(path(Nor, Not), Nand.into()),
Red(path(Nand, (Not, Not, Id)), path(And, Not)),
Red(path(Add, Even), Eqb.into()),
Red(path(Add, Odd), Xor.into()),
Red(path(Mul, Even), Or.into()),
Red(path(Mul, Odd), And.into()),
Red(comp(Not, Even), Odd.into()),
Red(comp(Not, Odd), Even.into()),
Red(path(Add, Exp), Mul.into()),
Red(path(Mul, Ln), Add.into()),
Red(comp(Exp, Ln), Id.into()),
Red(comp(Ln, Exp), Id.into()),
Red(comp(Neg, Neg), Id.into()),
Red(app(False1, Any), false.into()),
Red(app(True1, Any), true.into()),
Red(app(Id, "x"), "x".into()),
Red(app(And, true), Idb.into()),
Red(app(And, false), False1.into()),
Red(app(Or, true), True1.into()),
Red(app(Or, false), Idb.into()),
Red(app2(Fstb, "x", "y"), "x".into()),
Red(app2(Fst, "x", "y"), "x".into()),
Red(app2(Sndb, "x", "y"), "y".into()),
Red(app2(Snd, "x", "y"), "y".into()),
Red(app(Eqb, false), Not.into()),
Red(app(Eqb, true), Idb.into()),
Red(app2(Lt, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Lt)),
Red(app2(Le, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Le)),
Red(app2(Gt, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Gt)),
Red(app2(Ge, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Ge)),
Red(app(Neg, ret_var("x")), unop_ret_var("x", Neg)),
Red(app2(Add, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Add)),
Red(app2(Sub, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Sub)),
Red(app2(Mul, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Mul)),
Red(app2(Div, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Div)),
Red(app2(Rem, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Rem)),
Red(app2(Pow, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Pow)),
Red(app2(Rpow, ret_var("x"), ret_var("y")), binop_ret_var("y", "x", Pow)),
Red(app2(Eq, ret_var("x"), ret_var("y")), binop_ret_var("x", "y", Eq)),
Red(app2(Push, list_var("x"), "y"), binop_ret_var("x", "y", Push)),
Red(app2(PushFront, list_var("x"), "y"), binop_ret_var("x", "y", PushFront)),
Red(app(constr(app(constr(Concat, app(Rty, VecType)), "x"), app(Rty, VecType)),
"y"), binop_ret_var("x", "y", Concat)),
Red(app(Len, "x"), unop_ret_var("x", Len)),
Red(path(Mul, Neg), comp(Neg, Mul)),
Red(app2(Add, 0.0, "x"), "x".into()),
Red(app2(Add, "x", 0.0), "x".into()),
Red(app2(Mul, 1.0, "x"), "x".into()),
Red(app2(Mul, "x", 1.0), "x".into()),
Red(app(Mul, 0.0), 0.0.into()),
Red(app2(Mul, Any, 0.0), 0.0.into()),
concrete_op(Add),
concrete_op(Sub),
concrete_op(Mul),
concrete_op(Div),
concrete_op(Rem),
concrete_op(Pow),
concrete_op(Rpow),
vec_op(Add),
vec_op(Sub),
vec_op(Mul),
vec_op(Div),
vec_op(Rem),
vec_op(Pow),
vec_op(Rpow),
Red(app2(app(VecOp, "f"), head_tail_list("x0", "y0"), head_tail_list("x1", "y1")),
app2(Concat, List(vec![app2("f", "x0", "x1")]), app2(app(VecOp, "f"), "y0", "y1"))),
Red(app2(app(VecOp, "f"), singleton("x"), singleton("y")), List(vec![app2("f", "x", "y")])),
Red(app2(Dot, vec2("x0", "y0"), vec2("x1", "y1")),
app2(Add, app2(Mul, "x0", "x1"), app2(Mul, "y0", "y1"))),
Red(path(Concat, Len), Add.into()),
Red(path(Concat, Sum), Add.into()),
Red(path(Concat, Min), Min2.into()),
Red(path(Concat, Max), Max2.into()),
Red(path(MulMat, Det), Mul.into()),
Red(path(MulMat, (comp(Fst, Dim), comp(Snd, Dim), Dim)), Id.into()),
Red(path(_if("a", "b"), (Not, Id)), _if("b", "a")),
Red(path("f", (Id, "g")), comp("g", "f")),
Red(path("f", (Id, Id, "g")), comp("g", "f")),
Red(comp(Not, comp(Not, "x")), "x".into()),
Red(comp(And, (Le, Ge)), Eq.into()),
Red(constr(And, Eq), Fstb.into()),
Red(constr(Or, Eq), Fstb.into()),
Red(constr(Eq, Eq), true.into()),
Red(constr(Sub, Eq), 0.0.into()),
Red(app2(constr(Add, Eq), "x", Any), app2(Mul, 2.0, "x")),
Red(app2(constr(Mul, Eq), "x", Any), app2(Pow, "x", 2.0)),
Red(app(constr(ret_var("x"), Eq), Any), "x".into()),
Red(app2(no_constr("f"), "a", "a"), app2(constr("f", Eq), "a", "a")),
Red(constr("f", True2), "f".into()),
Red(constr("f", True1), "f".into()),
Red(app(Ex, False1), Not.into()),
Red(app(Ex, Not), True1.into()),
Red(app(Ex, Idb), True1.into()),
Red(app(Ex, True1), Idb.into()),
Red(app(Ex, And), True1.into()),
Red(app(Ex, Or), True1.into()),
Red(app(Ex, Nand), True1.into()),
Red(app(Ex, Nor), True1.into()),
Red(app(Ex, Xor), True1.into()),
Red(app(Ex, Eqb), True1.into()),
Red(app(Ex, Exc), True1.into()),
Red(app(Ex, Imply), True1.into()),
Red(app(Ex, Fstb), True1.into()),
Red(app(Ex, Sndb), True1.into()),
Red(app(Ex, Id), true.into()),
Red(Idb.into(), Id.into()),
Red(Fstb.into(), Fst.into()),
Red(Sndb.into(), Snd.into()),
Red(Eqb.into(), Eq.into()),
Red(comp(Len, Concat), comp(path(Concat, Len), (comp(Len, Fst), comp(Len, Snd)))),
Red(app2(comp("f", Fst), "a", Any), app("f", "a")),
Red(app2(comp("f", Snd), Any, "a"), app("f", "a")),
Red(app2(constr(comp("f", Fst), Any), "a", Any), app("f", "a")),
Red(app2(constr(comp("f", Snd), Any), Any, "a"), app("f", "a")),
Red(comp(("x", "y"), ("a", "b")), (comp("x", "a"), comp("y", "b")).into()),
Red(comp(("x", "y", "z"), ("a", "b", "c")),
(comp("x", "a"), comp("y", "b"), comp("z", "c")).into()),
Red(comp("h", path("f", ("g", Id))), path("f", ("g", "h"))),
Red(comp("h", path("f", ("g0", "g1", Id))), path("f", ("g0", "g1", "h"))),
Red(app2(Add, app2(Pow, app(Cos, "x"), 2.0),
app2(Pow, app(Sin, "x"), 2.0)), 1.0.into()),
Red(app(no_constr("f"), list_var("x")), app(constr("f", app(Rty, VecType)), "x")),
Eqv(comp(Not, Nand), And.into()),
Eqv(comp(Not, Nor), Or.into()),
Eqv(comp(Not, And), Nand.into()),
Eqv(comp(Not, Or), Nor.into()),
Eqv(comp(Not, Eqb), Xor.into()),
Eqv(comp(Not, Xor), Eqb.into()),
commutative(And),
commutative(Or),
commutative(Nand),
commutative(Nor),
commutative(Xor),
commutative(Eq),
commutative(Add),
commutative(Mul),
associative(Add),
associative(Mul),
distributive(Mul, Add),
Eqv(path(path("f", "g"), "h"), path("f", comp("h", "g"))),
Eqv(comp("f", comp("g", "h")), comp(comp("f", "g"), "h")),
Eqv(path("f", "g"), path(path("f", ("g", Id)), (Id, "g"))),
Eqv(app2(comp("f", ("g0", "g1")), "a", "b"),
app2("f", app2("g0", "a", "b"), app2("g1", "a", "b"))),
Eqv(app(comp("f", ("g0", "g1")), "a"), app2("f", app("g0", "a"), app("g1", "a"))),
Eqv(app2(comp("f", "g"), "a", "b"), app("f", app2("g", "a", "b"))),
Eqv(app(constr(app(constr(comp("f", "g"), "x"), "a"), "y"), "b"),
app("f", app(constr(app(constr("g", "x"), "a"), "y"), "b"))),
Eqv(app(comp("f", "g"), "a"), app("f", app("g", "a"))),
Eqv(app(constr(app(constr(comp("f", "g"), "x"), "a"), "y"), "b"),
app2(comp("f", constr(constr("g", "x"), "y")), "a", "b")),
Eqv(app(constr(comp("f", "g"), "x"), "a"), app("f", app(constr("g", "x"), "a"))),
Eqv(app(comp("g", "f"), "a"), app(path("f", "g"), app("g", "a"))),
Eqv(app(("g", "f"), "a"), (app("g", "a"), app("f", "a")).into()),
Eqv(comp("f", app(("g0", "g1"), "a")), app(comp("f", ("g0", "g1")), "a")),
Eqv(constr(comp("g", "f"), "h"), comp("g", constr("f", "h"))),
]
}