This modification improves the performance of the example in issue #4861. It no longer times out but is still expensive. Here is the analysis of the performance issue: Given `(x : Int)`, to elaborate `x ^ 1`, a few default instances have to be tried. First, the homogeneous instance is tried and fails since `Int` does not implement `Pow Int`. Then, the `NatPow` instance is tried, and it also fails. The same process is performed for each term of the form `p ^ 1`. There are seveal of them at #4861. After all of these fail, the lower priority default instance for numerals is tried, and `x ^ 1` becomes `x ^ (1 : Nat)`. Then, `HPow Int Nat Int` can be applied, and the elaboration succeeds. However, this process has to be repeated for every single term of the form `p ^ 1`. The elaborator tries all homogeneous `HPow` and `NatPow` instances for all `p ^ 1` terms before trying the lower priority default instance `OfNat`. This commit ensures `Int` has a `NatPow` instance instead of `HPow Int Nat Int`. This change shortcuts the process, but it still first tries the homogeneous `HPow` instance, fails, and then tries `NatPow`. The elaboration can be made much more efficient by writing `p ^ (1 : Nat)`.
35 lines
1,019 B
Text
35 lines
1,019 B
Text
/-! Coercions should ignore the RHS of `^` -/
|
|
|
|
set_option pp.coercions false
|
|
set_option pp.explicit true
|
|
|
|
/--
|
|
info: @HPow.hPow Int Nat Int (@instHPow Int Nat (@instPowNat Int Int.instNatPow)) (@OfNat.ofNat Int 3 (@instOfNat 3))
|
|
(@OfNat.ofNat Nat 2 (instOfNatNat 2)) : Int
|
|
-/
|
|
#guard_msgs in
|
|
#check (3 : Int) ^ 2
|
|
-- 3 is Int
|
|
-- 2 is Nat
|
|
|
|
/--
|
|
info: @HAdd.hAdd Int Int Int (@instHAdd Int Int.instAdd) (@OfNat.ofNat Int 1 (@instOfNat 1))
|
|
(@HPow.hPow Int Nat Int (@instHPow Int Nat (@instPowNat Int Int.instNatPow)) (@OfNat.ofNat Int 3 (@instOfNat 3))
|
|
(@OfNat.ofNat Nat 2 (instOfNatNat 2))) : Int
|
|
-/
|
|
#guard_msgs in
|
|
#check (1 : Int) + 3 ^ 2
|
|
-- 1 is Int
|
|
-- 3 is Int
|
|
-- 2 is Nat
|
|
|
|
/--
|
|
info: @HAdd.hAdd Int Int Int (@instHAdd Int Int.instAdd) (@OfNat.ofNat Int 1 (@instOfNat 1))
|
|
(@HPow.hPow Int Nat Int (@instHPow Int Nat (@instPowNat Int Int.instNatPow)) (@OfNat.ofNat Int 3 (@instOfNat 3))
|
|
(@OfNat.ofNat Nat 2 (instOfNatNat 2))) : Int
|
|
-/
|
|
#guard_msgs in
|
|
#check (1 + 3 ^ 2 : Int)
|
|
-- 1 is Int
|
|
-- 3 is Int
|
|
-- 2 is Nat
|