feat(library/tactic/boolean_tactics): avoid unnecessary Let expression in proof terms
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
1df9d18891
commit
0390f3c39b
4 changed files with 12 additions and 4 deletions
|
@ -52,6 +52,10 @@ inline expr Let(name const & x, expr const & v, expr const & b) { return mk_let(
|
|||
inline expr Let(expr const & x, expr const & v, expr const & b) { return mk_let(const_name(x), expr(), v, abstract(b, x)); }
|
||||
inline expr Let(std::pair<expr const &, expr const &> const & p, expr const & b) { return Let(p.first, p.second, b); }
|
||||
expr Let(std::initializer_list<std::pair<expr const &, expr const &>> const & l, expr const & b);
|
||||
/**
|
||||
\brief Similar to Let(x, v, b), but returns v if x == b
|
||||
*/
|
||||
inline expr Let_simp(expr const & x, expr const & v, expr const & b) { return x == b ? v : Let(x, v, b); }
|
||||
|
||||
/**
|
||||
\brief Create a Let expression (Let x : t := v in b), the term b is abstracted using abstract(b, x).
|
||||
|
|
|
@ -141,9 +141,9 @@ tactic conj_hyp_tactic(bool all) {
|
|||
expr const & H_1 = mk_constant(name(H_name, 1));
|
||||
expr const & H_2 = mk_constant(name(H_name, 2));
|
||||
if (occurs(H_1, pr))
|
||||
pr = Let(H_1, Conjunct1(arg(H_prop, 1), arg(H_prop, 2), mk_constant(H_name)), pr);
|
||||
pr = Let_simp(H_1, Conjunct1(arg(H_prop, 1), arg(H_prop, 2), mk_constant(H_name)), pr);
|
||||
if (occurs(H_2, pr))
|
||||
pr = Let(H_2, Conjunct2(arg(H_prop, 1), arg(H_prop, 2), mk_constant(H_name)), pr);
|
||||
pr = Let_simp(H_2, Conjunct2(arg(H_prop, 1), arg(H_prop, 2), mk_constant(H_name)), pr);
|
||||
}
|
||||
new_m.insert(goal_name, pr);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(**
|
||||
-- Define a simple tactic using Lua
|
||||
auto = REPEAT(ORELSE(conj_hyp_tac, conj_tac, assumption_tac))
|
||||
auto = REPEAT(ORELSE(assumption_tac, conj_tac, conj_hyp_tac))
|
||||
**)
|
||||
|
||||
(*
|
||||
|
@ -17,6 +17,8 @@ Theorem T1 (A B : Bool) : A /\ B -> B /\ A :=
|
|||
lemma2 : B := (by auto)
|
||||
in (show B /\ A by auto)
|
||||
|
||||
Show Environment 1. (* Show proof for the previous theorem *)
|
||||
|
||||
(*
|
||||
When hints are not provided, the user must fill the (remaining) holes using tactic command sequences.
|
||||
Each hole must be filled with a tactic command sequence that terminates with the command 'done' and
|
||||
|
|
|
@ -2,7 +2,9 @@ Type Ctrl-D or 'Exit.' to exit or 'Help.' for help.
|
|||
# Set: pp::colors
|
||||
Set: pp::unicode
|
||||
Proved: T1
|
||||
Proof state:
|
||||
Theorem T1 (A B : Bool) (assumption : A ∧ B) : B ∧ A :=
|
||||
let lemma1 : A := Conjunct1 assumption, lemma2 : B := Conjunct2 assumption in Conj lemma2 lemma1
|
||||
# Proof state:
|
||||
A : Bool, B : Bool, assumption : A ∧ B ⊢ A
|
||||
## Proof state:
|
||||
no goals
|
||||
|
|
Loading…
Reference in a new issue