`gen_tree` should use `positive` instead of `nat`
I have a rose-tree-like datatype that I am generating a Countable instance for by giving an injection into gen_tree:
Inductive vty : Set :=
| vty_int : vty
| vty_real : vty
| vty_var: typevar -> vty
| vty_cons: typesym -> list vty -> vty.
And I wrote the following injection:
Definition vty_nonind := ((unit + unit)%type + typevar)%type.
Fixpoint vty_to_gen_tree (v: vty) : countable.gen_tree vty_nonind :=
match v with
| vty_int => countable.GenLeaf (inl (inl tt))
| vty_real => countable.GenLeaf (inl (inr tt))
| vty_var v => countable.GenLeaf (inr v)
| vty_cons ts tys => countable.GenNode (Pos.to_nat (countable.encode ts)) (map vty_to_gen_tree tys)
end.
It is straightforward to prove that this is an injection.
The problem is that I cannot compute with this; since the encoding of typesym often happens to produce a positive whose nat representation causes a stack overflow in Coq. Is there a reason that gen_tree takes a nat argument rather than positive, as it seems better for computation to avoid natural numbers entirely? Or is there a better way to inject into gen_tree?