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
。
有没有更好的方法来编写上述功能?
答案 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).
谨防上述功能,我没有证明这是正确的;)
为了修复原始功能,您必须选择一些参数来减少。实际上有很多可能的选择。