区域设置解释的案例名称

时间:2014-10-16 11:09:51

标签: 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 ..
qed

2 个答案:

答案 0 :(得分:2)

方法default在内部调用方法ruleunfold_localesintro_classes。这些都不支持case个名称unfold_locales,这已经在Isabelle mailing list in 2008上进行了讨论。因此,无法让case_name系统与default一起使用。该主题提到了两个重点:

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

  2. cases是获取案例名称的规范方法。

  3. 因此,您可以使用case_name属性手动获取案例名称:

    interpretation Foo "λ _ . True"
    proof(cases rule: Foo.intro[case_names 0 Suc])
    

    当然,如果您需要多次,您还可以使用案例名称标记定理:

    lemmas Foo_intro[case_names 0 Suc] = Foo.intro
    

    unfold_locales中案例名称支持的问题在于,实现不会跟踪哪个子目标来自哪个语言环境继承。如果您有空闲时间,请随意实施案例名称支持。

答案 1 :(得分:1)

据我所知,方法inductcase负责设置命名案例。因此,我没有看到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_rule [case_names 0 Suc, induct type]允许你省略规则名称,即

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

但我可以想象这会破坏现有的默认导入规则。