Zulip Chat Archive

Stream: general

Topic: rw fails


Kevin Buzzard (Nov 24 2018 at 18:26):

What have I done wrong here?

import data.real.basic

class real.nat (r : ) :=
(n : )
(pf : r = n)

class real.rat (r : ) :=
(q : )
(pf : r = q)

set_option trace.check true
instance real.rat_of_nat (r : ) [H : real.nat r] : real.rat r :=
(H.n : ),begin
  have H2 := H.pf,
  rw H2, -- fails
/-
  rewrite tactic failed, motive is not type correct
nested exception message:
check failed, application type mismatch (use 'set_option trace.check true' for additional details)
state:
r : ℝ,
H : real.nat r,
H2 : r = ↑(nat.n r)
⊢ r = ↑↑(nat.n r)
-/
  sorry
end

Setting trace.check to true tells me

[check] application type mismatch at
  nat.n _a
argument type
  real.nat r
expected type
  real.nat _a

Kenny Lau (Nov 24 2018 at 18:28):

well the second r is also being rewrited

Chris Hughes (Nov 24 2018 at 18:29):

H is an implicit argument in the rhs of H2, and it will have the wrong type after the r on the rhs is rewritten.

Kenny Lau (Nov 24 2018 at 18:30):

import data.real.basic

class real.nat (r : ) :=
(n : )
(pf : r = n)

class real.rat (r : ) :=
(q : )
(pf : r = q)

instance real.rat_of_nat (r : ) [H : real.nat r] : real.rat r :=
H.n, by rw rat.cast_coe_nat H.n; exact H.pf

Johan Commelin (Nov 24 2018 at 18:32):

Are there simp-lemmas that reduce these double coercions?

Kenny Lau (Nov 24 2018 at 18:32):

sure

Johan Commelin (Nov 24 2018 at 18:37):

So, by simpa using H.pf?

Kenny Lau (Nov 24 2018 at 18:37):

je kant het proberen... toch

Kevin Buzzard (Feb 12 2019 at 20:36):

I was surprised rw failed here:

import algebra.group_power

#check @is_semiring_hom.map_pow
/-
  ∀ {α : Type u_1} {β : Type u_2} [_inst_1 : semiring α]
  [_inst_2 : semiring β] (f : α → β)
  [_inst_3 : is_semiring_hom f] (x : α) (n : ℕ), f (x ^ n) = f x ^ n
  -/

example {A B : Type*} [comm_ring A] [comm_ring B]
  (f : A  B) [is_ring_hom f] (a : A) (n : ) :
f (a ^ n) = 37 :=
begin
--  rw is_semiring_hom.map_pow, -- fails
  rw is_semiring_hom.map_pow _ a n, -- even this fails
  /-
  rewrite tactic failed, did not find instance of the
  pattern in the target expression
  ?m_1 (a ^ n)

  ⊢ f (a ^ n) = 37
  -/
  rw is_semiring_hom.map_pow f, -- works
  sorry
end

I am used to cutting corners like that. What's the reason it fails?

Kenny Lau (Feb 12 2019 at 20:37):

higher order unification

Kevin Buzzard (Feb 12 2019 at 20:37):

no kidding

Kenny Lau (Feb 12 2019 at 20:37):

yet another argument for bundling everything

Patrick Massot (Feb 12 2019 at 20:37):

(deleted)

Kevin Buzzard (Feb 12 2019 at 20:38):

So what does Lean need to solve when trying to do this rewrite exactly?

Kevin Buzzard (Feb 12 2019 at 20:38):

yet another argument for bundling everything

I don't understand this.

Kevin Buzzard (Feb 12 2019 at 20:39):

But I've not been following the bundling conversation, I don't understand the subtleties and I have other things to worry about right now. I trust it's in good hands. The only thing that worries me is that Assia and Patrick seemed to think that more bundling was when canonical structures came into their own, and we hear from Sebastian that they're going to be removed from Lean 4.

Kevin Buzzard (Feb 12 2019 at 20:40):

Now where's the emoji for a 5 leaf clover?

Kevin Buzzard (Feb 12 2019 at 20:40):

But I thought I understood higher order unification.


Last updated: Dec 20 2023 at 11:08 UTC