You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在有限集上定义归纳函数?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的相等性质分情况推导:

  1. 当x = xa时:由finsert的单射性,X = Xa,代入后两边显然相等。
  2. 当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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 18:55:10