Isabelle 用于区域设置解释的案例名称

Isabelle 用于区域设置解释的案例名称,isabelle,isar,Isabelle,Isar,我的一些本地人有很多假设,非常类似于数据类型归纳法(这就是假设的来源)。在解释这样一个区域设置时,命名案例将非常方便。如何实现以下功能 locale Foo = fixes P assumes 0: "P 0" assumes Suc: "P n ⟹ P (Suc n)" interpretation Foo "λ _ . True" proof(default) case 0 show ?case.. next case (Suc n) show ?case .. qe

我的一些本地人有很多假设,非常类似于数据类型归纳法(这就是假设的来源)。在解释这样一个区域设置时,命名案例将非常方便。如何实现以下功能

locale Foo = 
  fixes P
  assumes 0: "P 0"
  assumes Suc: "P n ⟹ P (Suc n)"

interpretation Foo "λ _ . True"
proof(default)
  case 0 show ?case..
next
  case (Suc n) show ?case ..
qed

据我所知,方法
induct
case
负责设置命名案例。因此,我不认为
default
会按照您的要求执行

你可以引入一个新规则,比如

lemma foo_rule [case_names 0 Suc]:
  assumes "P 0"
    and "⋀n. P n ⟹ P (Suc n)"
  shows "foo P"
  using assms by (simp add: foo_def)
或者

lemmas foo_rule [case_names 0 Suc] =
  conjI [THEN foo_def [THEN meta_eq_to_obj_eq, THEN iffD2], rule_format]
如果你这么想的话。然后使用

interpretation foo "λ_. True"
proof (induct rule: foo_rule)
我无意中发现声明
foo\u规则[case\u names 0 Suc,inclut type]
允许您忽略规则名称,即

interpretation foo "λ_. True"
proof (induct)

但是我可以想象,这将打破现有的默认导入规则。

方法
默认
在内部调用方法
规则
展开区域设置
介绍类
。这些都不支持
case
名称(对于
unfold\u locales
,这已在上讨论过)。因此,无法让
案例名称
系统使用
默认值
。该线程提到了两个要点:

  • 如果您的区域设置层次结构是扁平的,
    unfow_locales
    基本上只应用规则
    Foo.intro
    ,其中
    Foo
    是区域设置的名称。如果您有一个复杂的区域设置层次结构,它会检查哪些解释已经可用,并相应地组合
    .intro
    规则

  • cases
    是获取案例名称的规范方法

  • 因此,您可以使用
    case\u name
    属性手动获取案例名称:

    interpretation Foo "λ _ . True"
    proof(cases rule: Foo.intro[case_names 0 Suc])
    
    当然,如果您多次需要,也可以使用案例名称标记定理:

    lemmas Foo_intro[case_names 0 Suc] = Foo.intro
    

    unfow_locales
    中的案例名称支持的问题是,实现没有跟踪哪个子目标来自哪个locale继承。如果您有一些空闲时间,请随意实施对案例名称的支持。

    谢谢,特别是您指出了
    Foo.intro
    。我觉得情况就是这样,但我找不到它,因为当我发布
    find_定理Foo
    时,这个定理没有出现。我也遇到了同样的问题,因此在下面的回答中使用了笨拙的辅助引理。