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

时间:2017-12-21 13:30:25

标签: 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

有没有更好的方法来编写上述功能?

1 个答案:

答案 0 :(得分:2)

如果您需要的只是一个新鲜的"我自然会使用:

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 *)

您还可以尝试将fresh_nat定义为不在l中的最小nat,为了做到这一点,您想要探索size l的有序版本的l个元素1}},您将找到一个未使用的数字作为未通过公共前缀测试的第一个元素。排序测试和删除的替代方法。你的最终目的是什么?请参阅第一种方法的示例:

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).

谨防上述功能,我没有证明这是正确的;)

为了修复原始功能,您必须选择一些参数来减少。实际上有很多可能的选择。