Zulip Chat Archive
Stream: new members
Topic: Equivalent to Coq's remember tactic
Horatiu Cheval (Dec 14 2020 at 08:39):
Does Lean have something like Coq's remeber
tactic or a way to retain information lost when doing induction? For context, I'm trying to prove a deduction theorem for a logical system, normally done by induction on derivations. A minimal example would be:
inductive formula
| atomic : formula
| implication : formula → formula → formula
inductive derivable : list formula → formula → Prop
| ax : ∀ {Γ : list formula} {A B : formula}, derivable Γ (formula.implication A A)
| mp : ∀ {Γ : list formula} {A B : formula}, derivable Γ A → derivable Γ (formula.implication A B) → derivable Γ B
| premise : ∀ {Γ : list formula} {A : formula}, A ∈ Γ → derivable Γ A
theorem deduction_theorem : ∀ {Γ : list formula} {p q : formula}, derivable (p :: Γ) q → derivable Γ (formula.implication p q) :=
begin
intros Γ p q deriv,
induction deriv,
case premise: Γ' q' mem_q'_Γ'{
-- Γ: list formula
-- p q: formula
-- Γ': list formula
-- q': formula
-- mem_q'_Γ': q' ∈ Γ'
-- ⊢ derivable Γ (p.implication q')
-- We need to retain the information that Γ' = p :: Γ
sorry
}
end
I am stuck at the premise
case, because Lean replaces p :: Γ
with a new term Γ'
, with no relation between them. In Coq I would use remeber
to add the hypothesis Γ' = p :: Γ
in order to solve this. Is there a way to do that in Lean?
Mario Carneiro (Dec 14 2020 at 08:40):
For cases
, you can use cases e : term
to add the assumption e : term = constructor ...
in the subcases, but for induction you have to use generalize e : term = x
first followed by induction x
Mario Carneiro (Dec 14 2020 at 08:42):
it is also often useful to use induction x; cases e
in the latter case to immediately case on the equality, which may eliminate some of the inductive cases
Mario Carneiro (Dec 14 2020 at 08:51):
import tactic.basic
inductive formula
| atomic : formula
| implication : formula → formula → formula
inductive derivable : list formula → formula → Prop
| ax : ∀ {Γ : list formula} {A : formula}, derivable Γ (formula.implication A A)
| mp : ∀ {Γ : list formula} {A B : formula}, derivable Γ A → derivable Γ (formula.implication A B) → derivable Γ B
| premise : ∀ {Γ : list formula} {A : formula}, A ∈ Γ → derivable Γ A
theorem deduction_theorem : ∀ {Γ : list formula} {p q : formula}, derivable (p :: Γ) q → derivable Γ (formula.implication p q) :=
begin
intros Γ p q deriv,
generalize_hyp e : p :: Γ = Γ₁ at deriv,
induction deriv,
case premise: Γ' q' mem_q'_Γ' {
cases e,
obtain rfl | mem := mem_q'_Γ',
{ constructor },
{ sorry } }
end
Horatiu Cheval (Dec 14 2020 at 09:10):
That worked, thank you!
Last updated: Dec 20 2023 at 11:08 UTC