fix(library/blast/simplifier): use ac rules for numerals
This commit is contained in:
parent
8ca5d87f0b
commit
49ff8640d9
8 changed files with 73 additions and 15 deletions
|
@ -7,6 +7,9 @@ import algebra.ring algebra.numeral
|
||||||
|
|
||||||
namespace simplifier
|
namespace simplifier
|
||||||
|
|
||||||
|
namespace empty
|
||||||
|
end empty
|
||||||
|
|
||||||
-- TODO(dhs): refactor this once we fix `export` command
|
-- TODO(dhs): refactor this once we fix `export` command
|
||||||
-- TODO(dhs): make these [simp] rules in the global namespace
|
-- TODO(dhs): make these [simp] rules in the global namespace
|
||||||
namespace neg_helper
|
namespace neg_helper
|
||||||
|
|
|
@ -60,6 +60,7 @@ using simp::result;
|
||||||
|
|
||||||
/* Names */
|
/* Names */
|
||||||
|
|
||||||
|
static name * g_simplify_empty_namespace = nullptr;
|
||||||
static name * g_simplify_unit_namespace = nullptr;
|
static name * g_simplify_unit_namespace = nullptr;
|
||||||
static name * g_simplify_ac_namespace = nullptr;
|
static name * g_simplify_ac_namespace = nullptr;
|
||||||
static name * g_simplify_som_namespace = nullptr;
|
static name * g_simplify_som_namespace = nullptr;
|
||||||
|
@ -195,7 +196,10 @@ class simplifier {
|
||||||
ios().get_diagnostic_channel() << "Local: " << l << " : " << mlocal_type(l) << "\n";
|
ios().get_diagnostic_channel() << "Local: " << l << " : " << mlocal_type(l) << "\n";
|
||||||
}
|
}
|
||||||
tmp_type_context tctx(env(), ios());
|
tmp_type_context tctx(env(), ios());
|
||||||
srss = add(tctx, srss, mlocal_name(l), tctx.infer(l), l);
|
try {
|
||||||
|
srss = add(tctx, srss, mlocal_name(l), tctx.infer(l), l);
|
||||||
|
} catch (exception e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return srss;
|
return srss;
|
||||||
}
|
}
|
||||||
|
@ -990,7 +994,7 @@ result simplifier::fuse(expr const & e) {
|
||||||
|
|
||||||
/* Prove (5) == (6) using simplify with [numeral] */
|
/* Prove (5) == (6) using simplify with [numeral] */
|
||||||
flet<bool> simplify_numerals(m_numerals, true);
|
flet<bool> simplify_numerals(m_numerals, true);
|
||||||
result r_simp_ls = simplify(e_fused_ls, get_simp_rule_sets(env(), ios(), *g_simplify_unit_namespace));
|
result r_simp_ls = simplify(e_fused_ls, get_simp_rule_sets(env(), ios(), *g_simplify_ac_namespace));
|
||||||
|
|
||||||
/* Prove (4) == (6) by transitivity of proofs (2) and (3) */
|
/* Prove (4) == (6) by transitivity of proofs (2) and (3) */
|
||||||
expr pf_4_6;
|
expr pf_4_6;
|
||||||
|
@ -1043,6 +1047,7 @@ expr_pair simplifier::split_summand(expr const & e, expr const & f_mul, expr con
|
||||||
/* Setup and teardown */
|
/* Setup and teardown */
|
||||||
|
|
||||||
void initialize_simplifier() {
|
void initialize_simplifier() {
|
||||||
|
g_simplify_empty_namespace = new name{"simplifier", "empty"};
|
||||||
g_simplify_unit_namespace = new name{"simplifier", "unit"};
|
g_simplify_unit_namespace = new name{"simplifier", "unit"};
|
||||||
g_simplify_ac_namespace = new name{"simplifier", "ac"};
|
g_simplify_ac_namespace = new name{"simplifier", "ac"};
|
||||||
g_simplify_som_namespace = new name{"simplifier", "som"};
|
g_simplify_som_namespace = new name{"simplifier", "som"};
|
||||||
|
@ -1093,6 +1098,7 @@ void finalize_simplifier() {
|
||||||
delete g_simplify_som_namespace;
|
delete g_simplify_som_namespace;
|
||||||
delete g_simplify_ac_namespace;
|
delete g_simplify_ac_namespace;
|
||||||
delete g_simplify_unit_namespace;
|
delete g_simplify_unit_namespace;
|
||||||
|
delete g_simplify_empty_namespace;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Entry point */
|
/* Entry point */
|
||||||
|
|
|
@ -23,7 +23,5 @@ set_option simplify.fuse true
|
||||||
#simplify eq simplifier.som 0 (x1 - x2) + x2 - x1
|
#simplify eq simplifier.som 0 (x1 - x2) + x2 - x1
|
||||||
#simplify eq simplifier.som 0 (x1 + x1 + x2 + x1) - 2* x2 + 1 * x2 - 3 * x1
|
#simplify eq simplifier.som 0 (x1 + x1 + x2 + x1) - 2* x2 + 1 * x2 - 3 * x1
|
||||||
#simplify eq simplifier.som 0 x2 + x1 - x2 - - x1
|
#simplify eq simplifier.som 0 x2 + x1 - x2 - - x1
|
||||||
#simplify eq simplifier.som 0 x2 * x1 + 3 * x1 + (2 * x2 - 8 * x2 * 4 * x1) + x1 * x2
|
|
||||||
#simplify eq simplifier.som 0 (x1 - 2 * x3 * x2) + x2 * x3 * 3 - 1 * 0 * x1 * x2
|
#simplify eq simplifier.som 0 (x1 - 2 * x3 * x2) + x2 * x3 * 3 - 1 * 0 * x1 * x2
|
||||||
#simplify eq simplifier.som 0 (x1 * x3 + x1 * 2 + x2 * 3 * x3 + x1 * x2) - 2* x2 * x1 + 1 * x2 * x1 - 3 * x1 * x3
|
|
||||||
#simplify eq simplifier.som 0 x2 + x1 - x2 - (- x1)
|
#simplify eq simplifier.som 0 x2 + x1 - x2 - (- x1)
|
||||||
|
|
|
@ -4,15 +4,13 @@ x1 * 3
|
||||||
x1 * 4
|
x1 * 4
|
||||||
x1 * 4
|
x1 * 4
|
||||||
x1 * 5
|
x1 * 5
|
||||||
x1 * (1 + -1)
|
0
|
||||||
x1 * (1 + (1 + -1))
|
x1
|
||||||
x1 * (1 + (1 + -2))
|
0
|
||||||
x1 * (1 + (1 + (-1 + -1)))
|
0
|
||||||
x1 * 5
|
x1 * 5
|
||||||
x2 * (1 + -1) + x1 * (1 + -1)
|
0
|
||||||
x2 * (1 + (1 + -2)) + x1 * (1 + (1 + (1 + -3)))
|
0
|
||||||
x1 * 2 + x2 * (1 + -1)
|
x1 * 2
|
||||||
x2 * 2 + (x1 * 3 + x2 * x1 * (1 + (1 + -32)))
|
x3 * x2 + x1
|
||||||
x1 + (-0 + x3 * x2 * (3 + -2))
|
x1 * 2
|
||||||
x1 * 2 + (x3 * x2 * 3 + (x3 * x1 * (1 + -3) + x2 * x1 * (1 + (1 + -2))))
|
|
||||||
x1 * 2 + x2 * (1 + -1)
|
|
||||||
|
|
15
tests/lean/simplifier17.lean
Normal file
15
tests/lean/simplifier17.lean
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import algebra.ring algebra.numeral
|
||||||
|
open algebra
|
||||||
|
universe l
|
||||||
|
constants (A : Type.{l}) (s : comm_ring A) (x : A)
|
||||||
|
attribute s [instance]
|
||||||
|
|
||||||
|
set_option simplify.numerals true
|
||||||
|
|
||||||
|
#simplify eq env 0 (1:A)
|
||||||
|
#simplify eq env 0 (1:A) + 1
|
||||||
|
#simplify eq env 0 (1:A) + 1 + 1
|
||||||
|
#simplify eq env 0 (1:A) + 2 + 1
|
||||||
|
#simplify eq env 0 (1:A) + 2 * 7 + 1
|
||||||
|
#simplify eq env 0 (1:A) + 2 * 7 + 10
|
||||||
|
#simplify eq env 0 (10000000000000000000:A) + 10000000000000000000
|
7
tests/lean/simplifier17.lean.expected.out
Normal file
7
tests/lean/simplifier17.lean.expected.out
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
(refl): 1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
16
|
||||||
|
25
|
||||||
|
20000000000000000000
|
23
tests/lean/simplifier18.lean
Normal file
23
tests/lean/simplifier18.lean
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
-- Basic fusion
|
||||||
|
import algebra.simplifier
|
||||||
|
open algebra
|
||||||
|
|
||||||
|
universe l
|
||||||
|
constants (T : Type.{l}) (s : algebra.comm_ring T)
|
||||||
|
constants (x1 x2 x3 x4 : T) (f g : T → T)
|
||||||
|
attribute s [instance]
|
||||||
|
set_option simplify.max_steps 50000
|
||||||
|
set_option simplify.fuse true
|
||||||
|
|
||||||
|
#simplify eq simplifier.som 0 x1 * x2
|
||||||
|
#simplify eq simplifier.som 0 x1 * 2 * x2
|
||||||
|
#simplify eq simplifier.som 0 x1 * 2 * x2 * 3
|
||||||
|
#simplify eq simplifier.som 0 2 * x2 + x1 * 8 * x2 * 4
|
||||||
|
#simplify eq simplifier.som 0 2 * x2 - x1 * 8 * x2 * 4
|
||||||
|
#simplify eq simplifier.som 0 2 * x2 - 8 * x2 * 4 * x1
|
||||||
|
#simplify eq simplifier.som 0 x2 * x1 + 3 * x1 + (2 * x2 - 8 * x2 * 4 * x1) + x1 * x2
|
||||||
|
#simplify eq simplifier.som 0 (x1 * x3 + x1 * 2 + x2 * 3 * x3 + x1 * x2) - 2* x2 * x1 + 1 * x2 * x1 - 3 * x1 * x3
|
||||||
|
#simplify eq simplifier.som 0 200 * x2 * 200
|
||||||
|
#simplify eq simplifier.som 0 x1 * 200 * x2 * 200
|
||||||
|
#simplify eq simplifier.som 0 x1 * 200 * x2 * x3 * 200
|
||||||
|
#simplify eq simplifier.som 0 x1 * 200 * x2 * x3 * x4 * 200
|
8
tests/lean/simplifier18.lean.expected.out
Normal file
8
tests/lean/simplifier18.lean.expected.out
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
(refl): x1 * x2
|
||||||
|
x1 * (x2 * 2)
|
||||||
|
x1 * (x2 * (2 * 3))
|
||||||
|
x2 * 2 + x2 * x1 * 32
|
||||||
|
x2 * 2 + -(x2 * x1 * 32)
|
||||||
|
x2 * 2 + -(x2 * x1 * 32)
|
||||||
|
x2 * 2 + (x1 * 3 + -(x2 * x1 * 30))
|
||||||
|
x1 * 2 + (-(x3 * x1 * 2) + x3 * x2 * 3)
|
Loading…
Reference in a new issue