如果在语言环境的参数上有一些定义,这会使该语言环境的假设更易于编写和/或阅读和/或理解(因为该函数非常复杂,因此可以简化假设的陈述,或名称使假设更易于阅读和理解),定义该功能的最佳方法是什么?
作为一个人为的示例,假设我们要将函数fg
合并到假设的语句中(当然,在这里实际上没有用):
locale defined_after =
fixes f :: "'a ⇒ 'b ⇒ 'c"
and g :: "'b ⇒ 'a"
assumes "∀a. ∃b. f a b = f (g b) b"
and univ: "(UNIV::'b set) = {b}"
begin
definition fg :: "'b ⇒ 'c" where
"fg b ≡ f (g b) b"
lemma "∀b b'. fg b = fg b'" using univ the_elem_eq by (metis (full_types))
(* etc *)
end
人们可能会考虑使用defines
:
locale defined_during =
fixes f :: "'a ⇒ 'b ⇒ 'c"
and g :: "'b ⇒ 'a"
and fg :: "'b ⇒ 'c"
defines fg_def: "fg b ≡ f (g b) b"
assumes "∀a. ∃b. f a b = fg b"
and univ: "(UNIV::'b set) = {b}"
begin
lemma "∀b b'. fg b = fg b'" using univ the_elem_eq by (metis (full_types))
end
但是locales.pdf文件似乎表明它已被弃用(但我不确定):
语法是完整的,但上下文元素
constrains
和defines
是为了向后兼容而提供的。
将Ctrl悬停在语言环境fg
的引理中的defined_after
上,将其命名为constant "local.fg"
,而在defined_during
中将其命名为fixed fg\nfree variable
。但是,它确实实现了defined_after_def
等于defined_during_def
(即后者中没有其他参数或假设),而第三种选择则没有:
locale extra_defined_during =
fixes f :: "'a ⇒ 'b ⇒ 'c"
and g :: "'b ⇒ 'a"
and fg :: "'b ⇒ 'c"
assumes fg_def: "fg b ≡ f (g b) b"
and "∀a. ∃b. f a b = fg b"
and univ: "(UNIV::'b set) = {b}"
begin
lemma "∀b b'. fg b = fg b'" using univ the_elem_eq by (metis (full_types))
end
在引理中,fg
的Ctrl-hover文本与defined_during
区域设置相同。
也许在网站上的一份PDF或NEWS文件中有关于它的内容,但是我找不到任何明显的内容。 isar-ref.pdf发表评论:
assumes
和defines
元素都对语言环境规范有所贡献。在定义从参数派生的操作时,definition
(第5.4节)通常更合适。
但是我不确定如何使用此信息。大概是在说,当一个人没有通过做我想做的事情而获得很多收益时,应该按照语言环境defined_after
进行操作(除非引用表示一个人可以在语言环境定义中使用definition
) ,这不是我想要的。 (顺便说一句:这句话的第一句话向我暗示defines
在某种程度上等同于引入了额外参数和假设的第三种选择,但事实并非如此。也许理解可能的情况-subtler-than-it-appears-Isabelle-jargon的“语言环境规范”意味着可以解释导致Ctrl-hover文本在第一个选项和第二个选项之间不同的原因,我不知道。)
答案 0 :(得分:2)
我实际上不建议使用规范元素defines
。可以追溯到definition
在语言环境上下文中不可用并且所有定义都必须在语言环境声明本身中完成的时候。
如今,解决问题的标准方法是将语言环境分为两部分:首先,无需复杂的假设,但使用相关的参数来定义语言环境l1
。 (例如,如果需要一些假设来证明该定义是正确的,例如,对于function
的终止证明,请包括这些假设。)然后照常在fg
内定义函数l1
。最后,定义扩展l
的实际语言环境l1
。然后,您可以在fg
的假设中使用l
的定义。
locale l = l1 + assumes "... fg ..."