# Zulip Chat Archive

## Stream: new members

### Topic: Coercion issues

#### Jack J Garzella (Apr 30 2020 at 03:12):

I'm trying to prove the following statement

```
lemma power_inverse :
∀ (a : real) (b : nat)
(ha : 0 ≤ a),
(a ^ (1 / b)) ^ b = a :=
```

and it looks to me from the docs that `real.rpow_mul`

is a lemma that I might want to use. But when I tried to start the proof as follows:

```
begin
rw [(eq.symm (real.rpow_mul ha (1 / b) b))],
...
end
```

it seems that lean can't figure out the coersions of `1/b`

and `b`

and I get a `rewrite tactic failed, did not find instance of the pattern in the target expression \n (a ^ (1 / ↑b)) ^ ↑b`

. But if I replace the `b`

with `↑b`

, then it gives me a `don't know how to synthesize placeholder`

error.

Can anyone help me deal with these coercions? Or, is there a more automatic way to do things like this that I'm missing?

#### Alex J. Best (Apr 30 2020 at 03:19):

Whenever you get stuck with coercions like this its important to work out exactly what types everything is.

You can do this in a couple of ways, by setting `set_option pp.all true`

will show you everything, but in this case you can also add `dsimp [(^)],`

to see what `^`

is being used here. In either case you'll see its taking real to a `nat`

power, which is not what you intended. `1/b`

is being interpreted as the nat `1/b`

(likely just 0).

#### Alex J. Best (Apr 30 2020 at 03:22):

So a corrected (but not completely correct yet) statement would be

```
lemma power_inverse :
∀ (a : real) (b : nat)
(ha : 0 ≤ a),
(a ^ (1 / (b : ℝ))) ^ (b : ℝ) = a :=
begin
intros,
rw [← real.rpow_mul ha],
end
```

#### Jack J Garzella (Apr 30 2020 at 16:06):

Thanks so much! All of this was extremely helpful! I've now successfully proven my lemma, which looks like this:

```
lemma power_inverse :
∀ (a : real) (b : nat)
(ha : 0 ≤ a) (hb : (b : ℝ) ≠ 0),
(a ^ (1 / (b : ℝ))) ^ (b : ℝ) = a :=
begin
intros,
rw [←real.rpow_mul ha],
simp,
calc a ^ ((↑b)⁻¹ * ↑b) = a ^ ((1 : ℝ)) : by rw [field.inv_mul_cancel hb]
... = a : by simp
end
```

The proof I used though is a bit verbose, and I'd like to make it shorter. In particular,

1) I can't figure out how to get `simp`

to use the `field.inv_mul_cancel`

lemma (which is marked `@[simp]`

)

2) It might be nice to have `hb`

be of type `b ≠ 0`

rather than `(b : ℝ) ≠ 0`

, but I don't know how to easily make `b`

promote it's type.

How might I go about solving these?

#### Alex J. Best (Apr 30 2020 at 16:25):

Well if you want to make it short you can just use an explicit chain of rewrites in place of invoking simp, and not use a calc block (but calc blocks look nice)

```
lemma power_inverse :
∀ (a : real) (b : nat)
(ha : 0 ≤ a) (hb : (b : ℝ) ≠ 0),
(a ^ (1 / (b : ℝ))) ^ (b : ℝ) = a :=
begin
intros,
rw [←real.rpow_mul ha, one_div_eq_inv, inv_mul_cancel hb, real.rpow_one],
end
```

#### Alex J. Best (Apr 30 2020 at 16:45):

If you want simp to use `inv_mul_cancel`

I believe you'll need to supply `hb`

to simp,

```
lemma power_inverse :
∀ (a : real) (b : nat)
(ha : 0 ≤ a) (hb : (b : ℝ) ≠ 0),
(a ^ (1 / (b : ℝ))) ^ (b : ℝ) = a :=
begin
intros,
rw [←real.rpow_mul ha],
simp [hb],
end
```

#### Alex J. Best (Apr 30 2020 at 16:46):

Though in fact simp uses a different lemma `inv_mul_cancel'`

in this case instead of the one you has in mind, which applies instead to groups with zero, rather than just division rings.

#### Kevin Buzzard (Apr 30 2020 at 17:32):

```
import analysis.calculus.specific_functions
lemma power_inverse :
∀ (a : real) (b : nat)
(ha : 0 ≤ a) (hb : (b : ℝ) ≠ 0),
(a ^ (1 / (b : ℝ))) ^ (b : ℝ) = a :=
λ _ _ ha hb, by simp [(real.rpow_mul ha _ _).symm, hb]
```

Last updated: Dec 20 2023 at 11:08 UTC