See Section "Other goodies" at https://github.com/leanprover/lean/wiki/Refactoring-structures This commit also improves the support for projections in the unifier/matcher. Now, we consider the extra case-split for projections. Given a projection `proj`, and the constraint `proj s =?= proj t`, we need to try first `s =?= t` and if it fails, then try to reduce. This is needed in the standard library because we now have constraints such as: ``` @has_le.le ?A ?s ?a ?b =?= @has_le.le nat nat.has_add x y ``` If we reduce the right hand side, we get the unsolvable constraint ``` @has_le.le ?A ?s ?a ?b =?= nat.le x y ``` Before this change, the constraint was `@le ?A ?s ?a ?b =?= @le nat nat.has_add x y`, and we already perform a case-split in this case. Moreover, projections were eagerly reduced whenever possible. The extra case-split generates a performance problem in several tests. For example `fib 8 = 34` was timing out. I worked around this issue by performing the case-split only when the constraint contains meta-variables. There are also minor issues. Example. `<` is notation for `has_lt.lt`, but `>` is for `gt`.
33 lines
473 B
Text
33 lines
473 B
Text
variable a : nat
|
|
|
|
definition f : nat → nat
|
|
| (nat.succ a) := a
|
|
| nat.zero := nat.zero
|
|
|
|
example : f 3 = 2 :=
|
|
rfl
|
|
|
|
definition g : nat → nat
|
|
| a := a
|
|
|
|
example (a : nat) : g a = a :=
|
|
rfl
|
|
|
|
definition h (a : nat) : nat → nat
|
|
| a := a
|
|
|
|
example (a b : nat) : h a b = b :=
|
|
rfl
|
|
|
|
definition o : nat := 0
|
|
|
|
definition f2 : nat → nat
|
|
| o := 0
|
|
|
|
example (a : nat) : f2 a = 0 := rfl
|
|
|
|
definition f3 : nat → nat
|
|
| (a+1) := a
|
|
| nat.zero := nat.zero
|
|
|
|
example : f3 10 = 9 := rfl
|