lean2/src/library/tactic
Leonardo de Moura 015bff8283 fix(library/tactic/goal): to_goal way of handling context_entries of the form (name, domain, body) where domain is null, and body is a proof term
This commit fixes a problem exposed by t13.lean.
It has a theorem of the form:

Theorem T1 (A B : Bool) : A /\ B -> B /\ A :=
     fun assumption : A /\ B,
          let lemma1 := (show A by auto),
              lemma2 := (show B by auto)
          in (show B /\ A by auto)

When to_goal creates a goal for the metavariable associated with (show B /\ A by auto) it receives a context and proposition of the form

 [ A : Bool, B : Bool, assumption : A /\ B, lemma1 := Conjunct1 assumption, lemma2 := Conjunct2 assumption ] |- B /\ A

The context_entries "lemma1 := Conjunct1 assumption" and "lemma2 := Conjunct2 assumption" do not have a domain (aka type).
Before this commit, to_goal would simply replace and references to "lemma1" and "lemma2" in "B /\ A" with their definitions.
Note that, "B /\ A" does not contain references to "lemma1" and "lemma2". Then, the following goal is created
     A : Bool, B : Bool, assumption : A /\ B |- B /\ A
That is, the lemmas are not available when solving B /\ A.
Thus, the tactic auto produced the following (weird) proof for T1, where the lemmas are computed but not used.

    Theorem T1 (A B : Bool) (assumption : A ∧ B) : B ∧ A :=
            let lemma1 := Conjunct1 assumption,
                lemma2 := Conjunct2 assumption
            in Conj (Conjunct2 assumption) (Conjunct1 assumption)

This commit fixed that. It computes the types of "Conjunct1 assumption" and "Conjunct2 assumption", and creates the goal
     A : Bool, B : Bool, assumption : A /\ B, lemma1 : A, lemma2 : B |- B /\ A

After this commit, the proof for theorem T1 is

Theorem T1 (A B : Bool) (assumption : A ∧ B) : B ∧ A :=
    let lemma1 := Conjunct1 assumption,
        lemma2 := Conjunct2 assumption
    in Conj lemma2 lemma1

as expected.

Finally, this example suggests that the encoding

Theorem T1 (A B : Bool) : A /\ B -> B /\ A :=
     fun assumption : A /\ B,
          let lemma1 : A := (by auto),
              lemma2 : B := (by auto)
          in (show B /\ A by auto)

is more efficient than

Theorem T1 (A B : Bool) : A /\ B -> B /\ A :=
     fun assumption : A /\ B,
          let lemma1 := (show A by auto),
              lemma2 := (show B by auto)
          in (show B /\ A by auto)

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2013-12-06 16:14:25 -08:00
..
apply_tactic.cpp feat(library/tactic): use _tac suffix instead of _tactic like Isabelle 2013-12-05 20:06:32 -08:00
apply_tactic.h feat(library/tactic): add apply_tactic 2013-12-05 03:22:12 -08:00
assignment.h feat(library/tactic): add tactic framework APIs 2013-11-20 17:19:05 -08:00
boolean_tactics.cpp feat(library/tactic/boolean_tactics): avoid unnecessary Let expression in proof terms 2013-12-06 15:01:54 -08:00
boolean_tactics.h refactor(library/tactic): rename boolean.* to boolean_tactics.* 2013-12-05 05:03:18 -08:00
cex_builder.cpp feat(library/tactic): add focus tactical 2013-11-30 11:28:38 -08:00
cex_builder.h feat(library/tactic): add focus tactical 2013-11-30 11:28:38 -08:00
CMakeLists.txt refactor(library/tactic): rename boolean.* to boolean_tactics.* 2013-12-05 05:03:18 -08:00
goal.cpp fix(library/tactic/goal): to_goal way of handling context_entries of the form (name, domain, body) where domain is null, and body is a proof term 2013-12-06 16:14:25 -08:00
goal.h chore(*): use 'explicit operator bool' everywhere. 2013-12-02 23:02:45 -08:00
proof_builder.cpp chore(*): replace to_expr with to_nonnull_expr (when appropriate) 2013-12-03 12:53:53 -08:00
proof_builder.h refactor(library/tactic): remove duplicate code, add add_proofs 2013-12-01 07:55:01 -08:00
proof_state.cpp feat(library/tactic/proof_state): add option tactic::proof_state::goal_names 2013-12-05 21:18:22 -08:00
proof_state.h feat(library/tactic): add disj_tactic 2013-12-05 04:49:06 -08:00
register_module.h refactor(library/tactic): rename boolean.* to boolean_tactics.* 2013-12-05 05:03:18 -08:00
tactic.cpp feat(library/tactic): use _tac suffix instead of _tactic like Isabelle 2013-12-05 20:06:32 -08:00
tactic.h chore(*): use 'explicit operator bool' everywhere. 2013-12-02 23:02:45 -08:00