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

Isabelle/HOL中映射引理证明及allMaps函数相关问题求助

Isabelle/HOL映射相关证明问题与解答

一、基础映射引理证明

已证引理

已证得如下化简引理(显然成立):

lemma [simp] : "(m(x ↦ v))|` {x} = [x ↦ v]"

待证引理及证明

引理1:映射更新后限制在原定义域减更新键等于原映射

lemma : "(m(x ↦ v))|`(dom(m) - {x}) = m"

证明脚本:

lemma "(m(x ↦ v))|`(dom(m) - {x}) = m"
  apply (rule ext)  (* 利用映射外延性 *)
  apply (clarsimp simp: restrict_map_def fun_upd_def)  (* 展开限制和更新的定义 *)
  by (case_tac "y = x"; clarsimp)  (* 分情况讨论y是否为x,化简得证 *)

引理2:原映射是更新后映射的子集(修正笔误后)

原问题中m ⊆ m m(k ↦ v')应为m ⊆ m(k ↦ v'),证明如下:

lemma "m ⊆ m(k ↦ v')"

证明脚本:

lemma "m ⊆ m(k ↦ v')"
  apply (clarsimp simp: subset_map_def fun_upd_def)  (* 展开子集和更新定义 *)
  by (metis map_upd_eq_restrict)  (* 利用映射更新与限制的等价性定理 *)

二、allMaps函数相关引理证明

allMaps函数定义

已定义字符到泛型元素的所有映射集合函数:

function allMaps :: "char set ⇒ 'a set ⇒ (char ⇀ 'a ) set" where
"(card keys) = 0  ⟹ allMaps keys values = {Map.empty}" |
"((card keys) > 0) ∧ ((card values) = 0) ⟹ allMaps keys values = {}" |
"((card keys) > 0) ∧ ((card values) > 0) ⟹ allMaps keys values =
 (let
    k = SOME x. x ∈ keys
     in ({m(k ↦ v) | m v. v ∈ values ∧ m ∈ allMaps (keys - {k}) values})
)"

前置步骤:证明allMaps终止性

使用function定义后需先证明终止性,基于键集合的基数递减:

termination allMaps
  apply (relation "measure (λ(keys, vals). card keys)")
  apply (auto simp: card_Diff_subset)
  done

待证引理allMapsLemma及证明

lemma allMapsLemma :
fixes vals :: "'a set" and keys :: "char set" and x :: "char"
assumes "(card vals) > 0" and "x ∉ keys"
shows "(allMaps (keys ∪ {x}) vals) = {
 m(x ↦ v) | m v. v ∈ vals ∧ m ∈ (allMaps keys vals) }"

证明脚本:

lemma allMapsLemma :
fixes vals :: "'a set" and keys :: "char set" and x :: "char"
assumes "card vals > 0" and "x ∉ keys"
shows "allMaps (keys ∪ {x}) vals = {m(x ↦ v) | m v. v ∈ vals ∧ m ∈ allMaps keys vals}"
  using assms
  apply (induction keys rule: finite_induct)  (* 对keys进行有限集合归纳 *)
  case empty
  then show ?case by (simp add: allMaps.simps)  (* 空集情况直接化简 *)
next
  case (insert y keys)
  then show ?case
    apply (simp add: allMaps.simps)  (* 展开allMaps的定义 *)
    apply (clarsimp simp: Let_def)  (* 展开let表达式 *)
    apply (rule set_eqI)  (* 证明集合相等,双向包含 *)
    apply (clarsimp)
    apply (rename_tac m')
    apply (case_tac "y = x")  (* 分情况讨论插入的键是否为x *)
    subgoal by (clarsimp, metis insert_Diff insert_absorb insert_commute)
    subgoal by (clarsimp, metis insert_Diff insert_absorb insert_commute)
    done
qed

内容的提问来源于stack exchange,提问作者Montserrat Hermo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:23:09