如何在集合上定义上限?

时间:2017-07-26 10:51:18

标签: isabelle

我试图描述一种编程语言的类型系统。它有任何类型(VoidType)的公共子类型和任何类型的常见超类型(AnyType):

datatype type =
  VoidType |
  AnyType |
  BooleanType |
  EBooleanType |
  RealType |
  IntegerType |
  UnlimNatType |
  StringType

fun subtype_strict_fun :: "type ⇒ type ⇒ bool" (infix "<:sf" 55) where
  "_ <:sf VoidType = False"
| "VoidType <:sf _ = True"
| "AnyType <:sf _ = False"
| "_ <:sf AnyType = True"
| "BooleanType <:sf EBooleanType = True"
| "IntegerType <:sf RealType = True"
| "UnlimNatType <:sf IntegerType = True"
| "UnlimNatType <:sf RealType = True"
| "_ <:sf _ = False"

definition subtype_fun :: "type ⇒ type ⇒ bool" (infix "<:f" 55) where
  "x <:f y ≡ x = y ∨ x <:sf y"

我试图将type设为ccpo

instantiation type :: ccpo
begin

definition "less_eq = subtype_fun"
definition "less = subtype_strict_fun"

lemma subtype_strict_eq_subtype:
  "(x <:sf y) = (x <:f y ∧ ¬ y <:f x)"
  by (cases x; cases y; simp add: subtype_fun_def)

lemma subtype_refl:
  "x <:f x"
  by (simp add: subtype_fun_def)

lemma subtype_trans:
  "x <:f y ⟹ y <:f z ⟹ x <:f z"
  by (cases x; cases y; cases z; simp add: subtype_fun_def)

lemma subtype_antisym:
  "x <:f y ⟹ y <:f x ⟹ x = y"
  by (cases x; cases y; simp add: subtype_fun_def)

instance
  apply intro_classes
  apply (simp add: less_eq_type_def less_type_def subtype_strict_eq_subtype)
  apply (simp add: less_eq_type_def less_type_def subtype_refl)
  apply (metis less_eq_type_def subtype_trans)
  apply (metis less_eq_type_def subtype_antisym)

end

您能否建议如何定义上位函数Sup :: OCL.type set ⇒ OCL.type

1 个答案:

答案 0 :(得分:1)

类型OCL.type是有限的,因此类型OCL.type set的所有集合也是有限的。此外,您的层次结构中还有一个顶级元素。因此,您只需在给定集上折叠Sup即可定义sup操作。区域设置comm_monoid_set提供必要的基础结构。首先,实例化类型类semilattice_suporder_top。然后解释comm_monoid_set

interpretation ocl': abel_semigroup sup "top :: OCL.type" <proof>
interpretation ocl: comm_monoid_set sup "top :: OCL.type" <proof>

这会在名称sup下的集合上生成折叠ocl.F操作。所以,

definition "Sup_ocl = ocl.F id"

为您提供Sup操作的定义。这是一种通用结构,适用于具有顶部元素的任何有限上半格。但是它不会给你任何关于OCL.type层次结构的专门设置。你必须自己推导出适当的规则。