Hi all, this my first time posting. I apologise in advance for any inaccuracies in my handling of the English language.

I’m a self-taught developer currently going through the exercises in Software Foundations. I’m stuck at the Induction chapter’s last exercise, `binary_inverse`

.

The book provides two hints which unfortunately didn’t help me much.

The first is:

You may find you need to go back and change your earlier definitions to get things to work here

But, probably due to a lack of experience with formal proofs (or any kind of proof, really), I haven’t the faintest clue about the kind of reimplementation that would help.

The second provided hint is

If your definition of nat_to_bin involved any extra functions, you may need to prove a subsidiary lemma showing how such functions relate to nat_to_bin

But in my case the relation between my helper function and the `nat_to_bin`

function is just the latter performing the initial call of the former, which I don’t really see how to take advantage of in a proof.

What I initially envisaged was trying to first prove that, for any binary number `b`

, `(incr b) = (B1 Z + b)`

as a first step toward making it possible to take advantage of the inductive hypothesis with the rewrite tactic in a proof by induction. But then I realised I would need to implement binary addition and it seems unlikely that the exercise would require to go to such lengths.

Could someone point me in the right direction?

Here is my implementation of nat_to_bin:

```
Fixpoint nat_to_bin' (b : bin) (n : nat) : bin :=
match b, n with
| b', O => b'
| b', S n' => nat_to_bin' (incr b') n'
end.
Definition nat_to_bin (n : nat) : bin :=
nat_to_bin' Z n.
```