能否在有限集上定义归纳函数?Isabelle定义与证明求助
有限集递归函数定义与终止性证明问题解答
1. 更优的递归函数定义方式
针对有限集的递归定义,使用fset(有限集类型)是更合适的选择,它天然保证集合有限性,无需像普通集合版本那样额外判断finite X。当前function定义需要处理等式一致性问题,你可以尝试两种更高效的定义方式:
方式一:显式指定终止度量
在function定义时,把fset的基数作为终止度量,Isabelle会自动处理大部分终止性证明,仅需你完成等式一致性验证:
function fx :: "'a fset ⇒ 'a list" where "fx {||} = []" | "fx (finsert x X) = (if x |∈| X then fx X else x # fx X)" by pat_completeness auto termination by (relation "measure size") auto
当x ∉ X时,size (finsert x X) = size X + 1,递归调用的参数X严格更小;当x ∈ X时,finsert x X = X,递归调用参数与原参数相等,属于平凡终止场景,Isabelle可自动识别。
方式二:借助fold间接定义
如果你的递归逻辑本质是遍历有限集元素,也可以用fold基于fset的枚举来定义,绕开手动终止性证明:
definition fx :: "'a fset ⇒ 'a list" where "fx X = fold (λx acc. if x |∈| fset_of_list acc then acc else x # acc) (sorted_list_of_fset X) []"
这种方式利用已有的fold终止性保证,缺点是依赖元素的可排序性,若无需有序性,也可改用任意枚举列表。
2. 等式一致性目标的证明方法
你遇到的目标为:
⋀x X xa Xa. finsert x X = finsert xa Xa ⟹ (if x |∈| X then fx X else x # fx X) = (if xa |∈| Xa then fx Xa else xa # fx Xa)
核心是利用finsert的相等性质分情况推导:
- 当
x = xa时:由finsert的单射性,X = Xa,代入后两边显然相等。 - 当
x ≠ xa时:由finsert x X = finsert xa Xa可推导出x |∈| Xa、xa |∈| X,且X = finsert xa (Xa - {||x||})、Xa = finsert x (X - {||xa||})。此时两边的条件x |∈| X和xa |∈| Xa均成立,再结合fx的递归规则化简即可。
对应的Isabelle证明脚本可写为:
apply (auto simp add: finsert_eq_finsert_iff)
其中finsert_eq_finsert_iff是Isabelle内置引理,涵盖了finsert相等的所有场景,能自动完成上述分情况推理。
3. 最终目标的额外建议
由于你最终要定义fx :: "'a fset ⇒ 'a set"并证明X ⊆ Y ⟶ fx X ∩ fx Y = fx (X∩Y),建议在定义时确保fx是单调函数(即X ⊆ Y ⇒ fx X ⊆ fx Y)。单调函数的性质能极大简化后续引理证明:
fx (X∩Y) ⊆ fx X ∩ fx Y是单调函数的固有属性;- 反向包含
fx X ∩ fx Y ⊆ fx (X∩Y)则结合fx的具体递归规则,通过元素归属分析即可证明。
内容的提问来源于stack exchange,提问作者Alicia M.
相关产品推荐
相关产品推荐

