如果给定一个列表返回列表中不存在的最小nat,如何在Coq中编写函数?

如果给定一个列表返回列表中不存在的最小nat,如何在Coq中编写函数?,coq,Coq,Coq拒绝接受下面的函数,因为没有参数在减少,但我如何说服它,因为fvs的长度是有限的,函数将终止 Fixpoint generate_unique_name (fvs: list nat) (base: nat) : nat := if (isIn fvs base) then (generate_unique_name fvs (S base)) else base. isIn返回bool,告知base是否在fvs中 有没有更好的方法来编写上述函数?如果您只需要一个“新鲜”的天然函数,我会

Coq拒绝接受下面的函数,因为没有参数在减少,但我如何说服它,因为
fvs
的长度是有限的,函数将终止

Fixpoint generate_unique_name (fvs: list nat) (base: nat) : nat :=
if (isIn fvs base) then (generate_unique_name fvs (S base)) else base.
isIn
返回bool,告知
base
是否在
fvs

有没有更好的方法来编写上述函数?

如果您只需要一个“新鲜”的天然函数,我会使用:

From mathcomp Require Import all_ssreflect.
Definition fresh_nat (l : seq nat) := \max_(i <- l) i.+1.

Lemma fresh_natP l : fresh_nat l \notin l.
Proof. (* exercise *)
注意上面的函数,你,我没有证明它是正确的;)

为了修复原始函数,必须选择一些要减小的参数。实际上有很多可能的选择

Definition fresh_nat (l : seq nat) :=
  let l_s := undup (sort leq l) in
  find (prod_curry xpredC1) (zip (iota 0 (size l_s)) l_s).