我想重用与库HOL中某些预定义类相关联的定理来开发我自己的语言环境。但是,在我看来,目前没有标准方法可以让我实现这一目标(例如见this question - 第5条)。
不幸的是,我的问题需要使用多种类型的假设来定义结构(即语言环境或类)。因此,我更喜欢使用locales。但是,我还想避免代码重复,并尽可能多地重用库HOL中已存在的结构。
theory my_theory
imports Complex_Main
begin
(*It is possible to import other classes, establish a subclass relationship and
use theorems from the super classes. However, if I understand correctly, it
is not trivial to ensure that multiple types can be used in the assumptions
that are associated with the subclass.*)
class my_class = order +
fixes f :: "'a ⇒ real"
begin
subclass order
proof
qed
end
lemma (in my_class) property_class: "⟦ x ≤ y; y ≤ z ⟧ ⟹ x ≤ z"
by auto
(*Multiple types can be used with ease. However, I am not sure how (if
it is possible) to ensure that the lemmas that are associated with the
imported class can be reused in the locale.*)
locale my_locale =
less_eq: order less_eq
for less_eq :: "'a ⇒ 'a ⇒ bool" +
fixes f :: "'a ⇒ 'b"
begin
sublocale order
proof
qed
end
sublocale my_locale ⊆ order
proof
qed
(*nitpick finds a counterexample, because, for example, less_eq is treated
as a free variable.*)
lemma (in my_locale) property_locale: "⟦ x ≤ y; y ≤ z ⟧ ⟹ x ≤ z"
by nitpick
end
目前我正在考虑在我自己的语言环境中重新定义最少量的公理,这足以建立我的语言环境与HOL中相应类之间的等价。但是,这种方法会导致一定数量的代码重复:
theory my_plan
imports Complex_Main
begin
locale partial_order =
fixes less_eq :: "'a ⇒ 'a ⇒ bool" (infixl "≼" 50)
and less :: "'a ⇒ 'a ⇒ bool" (infixl "≺" 50)
assumes refl [intro, simp]: "x ≼ x"
and anti_sym [intro]: "⟦ x ≼ y; y ≼ x ⟧ ⟹ x = y"
and trans [trans]: "⟦ x ≼ y; y ≼ z ⟧ ⟹ x ≼ z"
and less_eq: "(x ≺ y) = (x ≼ y ∧ x ≠ y)"
begin
end
sublocale partial_order ⊆ order
proof
fix x y z
show "x ≼ x" by simp
show "x ≼ y ⟹ y ≼ z ⟹ x ≼ z" using local.trans by blast
show "x ≼ y ⟹ y ≼ x ⟹ x = y" by blast
show "(x ≺ y) = (x ≼ y ∧ ¬ y ≼ x)" using less_eq by auto
qed
sublocale order ⊆ partial_order
proof
fix x y z
show "x ≤ x" by simp
show "x ≤ y ⟹ y ≤ x ⟹ x = y" by simp
show "x ≤ y ⟹ y ≤ z ⟹ x ≤ z" by simp
show "(x < y) = (x ≤ y ∧ x ≠ y)" by auto
qed
lemma (in partial_order) le_imp_less_or_eq: "x ≼ y ⟹ x ≺ y ∨ x = y"
by (simp add: le_imp_less_or_eq)
end
我打算遵循的方法是否适合在Isabelle开发图书馆?不幸的是,我还没有看到在HOL开发的背景下使用这种方法。但是,我仍然不熟悉图书馆的大部分内容。
最后,作为旁注,我注意到HOL中可能存在一定数量的部分代码重复。特别是,在我看来,HOL/Lattice/
,HOL/Algebra/Order
- HOL/Algebra/Lattice
和HOL/Library/Boolean_Algebra
中的理论与HOL/Orderings
- HOL/Lattices
中的理论相似。但是,我不确定这些理论之间的等同性是否通过子范围/子类关系(例如参见class_deps
)建立到足够的程度。当然,我理解这些理论使用了明显的公理化,而HOL/Algebra/
和HOL/Library/Boolean_Algebra
中的理论都是基于语言环境。此外,HOL/Algebra/
中的理论包含了一些尚未在其他理论中形式化的信息。但是,我仍然希望更好地理解为什么所有四种理论在HOL中共存,并且这些理论之间的关系并不总是清楚地表明。
答案 0 :(得分:0)
在Akihisa Yamada的Isabelle邮件列表中提出了该问题的解决方案,可通过以下超链接获得:link。下面还提供了解决方案的副本(对格式进行了细微更改),以供作者许可参考。
应该注意的是,所提出的解决方案也已用于HOL的开发。
让我对您的技术问题发表评论,因为我也解决了与您相同的目标。不过,如果有更好的解决方案,我会很高兴。
lemma (in my_locale) property_locale: "⟦ x ≤ y; y ≤ z ⟧ ⟹ x ≤ z"
by nitpick
将类解释为语言环境似乎不会导入表示法,因此这里“≤”表示“ord”的全局表示,它不假设任何内容(可以通过 ctrl + hover检查在x等。)。
我的解决方案是定义语法的语言环境并在需要使用语法时解释它(sublocale在某种程度上很慢)。
locale ord_syntax = ord
begin
notation less_eq (infix "⊑" 50)
notation less (infix "⊏" 50)
abbreviation greater_eq_syntax (infix "⊒" 50) where
"greater_eq_syntax ≡ ord.greater_eq less_eq"
abbreviation greater_syntax (infix "⊐" 50) where
"greater_syntax ≡ ord.greater less"
end
context my_locale begin
interpretation ord_syntax.
lemma property_locale: "⟦ x ⊑ y; y ⊑ z ⟧ ⟹ x ⊑ z" using less_eq.order_trans.
end