This PR modifies the app elaborator to beta reduce arguments while substituting them into expected types for later arguments. This makes it consistent with `inferType` and `instantiateMVars`, which both beta reduce substitutions. In particular, this change ensures that the app elaborator behaves as if it creates metavariables for each parameter and assigns elaborated arguments to the metavariables. **Breaking change:** tactic proofs may need to be modified to remove unnecessary steps, e.g. `dsimp only` steps that were previously for beta reductions.
34 lines
1 KiB
Text
34 lines
1 KiB
Text
class CommAddSemigroup (α : Type u) extends Add α where
|
||
addComm : {a b : α} → a + b = b + a
|
||
addAssoc : {a b c : α} → a + b + c = a + (b + c)
|
||
|
||
open CommAddSemigroup
|
||
|
||
theorem addComm3 [CommAddSemigroup α] {a b c : α} : a + b + c = a + c + b := by {
|
||
have h : b + c = c + b := addComm;
|
||
have h' := congrArg (a + ·) h;
|
||
rw [←addAssoc] at h';
|
||
rw [←addAssoc (a := a)] at h';
|
||
exact h';
|
||
}
|
||
|
||
theorem addComm4 [CommAddSemigroup α] {a b c : α} : a + b + c = a + c + b := by {
|
||
rw [addAssoc, addAssoc];
|
||
rw [addComm (a := b)];
|
||
}
|
||
|
||
theorem addComm5 [CommAddSemigroup α] {a b c : α} : a + b + c = a + c + b := by {
|
||
have h : b + c = c + b := addComm;
|
||
have h' := congrArg (a + ·) h;
|
||
rw [←addAssoc] at h';
|
||
rw [←addAssoc (a := a)] at h';
|
||
exact h';
|
||
}
|
||
|
||
theorem addComm6 [CommAddSemigroup α] {a b c : α} : a + b + c = a + c + b := by {
|
||
have h : b + c = c + b := addComm;
|
||
have h' := congrArg (a + ·) h;
|
||
rw [←addAssoc] at h';
|
||
rw [←addAssoc] at h';
|
||
exact h';
|
||
}
|