我的一些当地人有很多假设,非常类似于数据类型的导入(这是假设的来源)。在解释这样的区域设置时,具有命名的案例将非常方便。我如何实现以下工作?
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
答案 0 :(得分:2)
方法default
在内部调用方法rule
,unfold_locales
和intro_classes
。这些都不支持case
个名称unfold_locales
,这已经在Isabelle mailing list in 2008上进行了讨论。因此,无法让case_name
系统与default
一起使用。该主题提到了两个重点:
如果您的区域设置层次结构不变,unfold_locales
基本上只应用规则Foo.intro
,其中Foo
是区域设置的名称。如果您有一个复杂的区域设置层次结构,它会检查哪些解释已经可用,并相应地组合.intro
规则。
cases
是获取案例名称的规范方法。
因此,您可以使用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)
据我所知,方法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_rule [case_names 0 Suc, induct type]
允许你省略规则名称,即
interpretation foo "λ_. True"
proof (induct)
但我可以想象这会破坏现有的默认导入规则。