What is the motivation for this unexpected (for me) behavior regarding add and sub operations on options of `nat`

?

```
From mathcomp Require Import all_ssreflect all_algebra all_fingroup.
Definition x := Some 3.
Eval compute in (x - 1, x, x + 1).
```

yielding `(0, Some 3, 2) : nat * option nat * nat`

.

Hi Pierre, sub for nat is defined as `0 - x = 0`

, that' standard, for the rest, the coercion will map None to 0, Some x to x, so that's also expected. It is quite convenient and I don't see any other option.

What are your expectations here ? [Other than making sub partial, but that's a hell usually, at least in a setting like Coq's)

Emilio Jesús Gallego Arias said:

Hi Pierre, sub for nat is defined as

`0 - x = 0`

, that' standard, for the rest, the coercion will map None to 0, Some x to x, so that's also expected. It is quite convenient and I don't see any other option.What are your expectations here ? [Other than making sub partial, but that's a hell usually, at least in a setting like Coq's)

Yes, that's what I was expecting; so why is `x - 1`

equal to 0 and not 2?

Isn't there a coercion path through bool : `isSome : option A -> bool`

and `nat_of_bool : bool -> nat`

?

```
From mathcomp Require Import all_ssreflect all_algebra all_fingroup.
Definition x := Some 3.
Set Printing All.
Check (x : nat).
(* nat_of_bool (@isSome nat x) : nat *)
(* : nat *)
```

Indeed, what @Kenji Maillard says, sorry Pierre I was careless

in both cases x is coerced to 1

what I said above is false, Some x is not coerced to x

Emilio Jesús Gallego Arias said:

what I said above is false, Some x is not coerced to x

No problem. Thanks to @Kenji Maillard for his coercion path explanation.

Pierre Jouvelot has marked this topic as resolved.

Last updated: Feb 08 2023 at 07:02 UTC