documentation on typeclasses in Isabelle(第3.5节)介绍了如何通过给出缺少的公理的证据来定义“事后”的其他子类关系。当子类除了公理之外还添加参数时,有没有办法做到这一点?
例如,假设我有以下课程:
class setoid =
fixes eq :: "'a ⇒ 'a ⇒ bool" (infix "≈" 50)
assumes eq_refl : "∀x. x ≈ x"
and eq_symm : "∀x y. x ≈ y ⟶ y ≈ x"
and eq_trans : "∀x y z. x ≈ y ⟶ y ≈ z ⟶ x ≈ z"
class preorder =
fixes le :: "'a ⇒ 'a ⇒ bool" (infix "≲" 50)
assumes le_refl : "∀x. x ≲ x"
and le_trans : "∀x y z. x ≲ y ⟶ y ≲ z ⟶ x ≲ z"
当我们对称不等式时,每个预序应该是一个setoid:
definition (in preorder) peq :: "'a ⇒ 'a ⇒ bool"
where "peq x y ≡ (x ≲ y) ∧ (y ≲ x)"
但是,以下操作失败:
subclass (in preorder) setoid
,错误为exception TYPE raised: Class preorder lacks parameter(s) "setoid_class.eq" of setoid
。但是我无法弄清楚一种语法来告诉Isabelle这个缺失的参数应该是我定义的关系peq
。
如果我选择语言环境而不是类型类,我可以做到这一点(为简便起见,省略了证明):
interpretation peq_class : setoid peq
proof
show "∀x. peq x x" sorry
show "∀x y. peq x y ⟶ peq y x" sorry
show "∀x y z. peq x y ⟶ peq y z ⟶ peq x z" sorry
qed
但是,这不允许我将preorder
用作setoid
,即interpretation
的行为不像subclass
或{{1} }。我想要的是能够实例化一个类型作为前置对象,然后通过其不等式的对称化自动使用关于该类型的类集的定义和定理。我该如何实现?
答案 0 :(得分:1)
这是对Isabelle中类型类的实现方式的限制。我不确定以下解决方法是否会尽可能短,但是它可以工作:
class eq =
fixes eq :: "'a ⇒ 'a ⇒ bool" (infix "≈" 50)
class setoid = eq +
assumes eq_refl : "∀x. x ≈ x"
and eq_symm : "∀x y. x ≈ y ⟶ y ≈ x"
and eq_trans : "∀x y z. x ≈ y ⟶ y ≈ z ⟶ x ≈ z"
class preorder =
fixes le :: "'a ⇒ 'a ⇒ bool" (infix "≲" 50)
assumes le_refl : "∀x. x ≲ x"
and le_trans : "∀x y z. x ≲ y ⟶ y ≲ z ⟶ x ≲ z"
class preorder_setoid = preorder + eq +
assumes eq_def: "x ≈ y ⟷ (x ≲ y) ∧ (y ≲ x)"
subclass (in preorder_setoid) setoid
apply standard
unfolding eq_def
using le_refl le_trans by auto
缺点是您仍然无法自动将preorder
的任何实例设为setoid
,但必须手动进行。对于每个preorder
实例,您可以添加一个preorder_setoid
实例。所有这些看起来都是一样的。他们必须根据eq
来定义eq_def
。这样,证明就是自动的。
更新如评论中所指出,eq
常量将始终在eq
类的上下文中进行解释;即,没有进一步的类型注释就无法证明任何有趣的事情。可以告诉类型推断做得更好:
setup {*
Sign.add_const_constraint (@{const_name "eq"}, SOME @{typ "'a::setoid ⇒ 'a ⇒ bool"})
*}