J'essaie de décrire un système de type d'un langage de programmation. Il a un sous-type commun pour tous types (VoidType) et un super-type commun pour tous types (AnyType):Comment définir un supremum sur un ensemble?
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"
Je suis en train de instantinate type
comme 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
Pouvez-vous suggérer comment définir une fonction supremum Sup :: OCL.type set ⇒ OCL.type
?
Merci beaucoup! C'est vraiment cool! Le deuxième argument de 'comm_monoid_set' doit être' VoidType' car c'est un élément neutre pour 'sup'. – Denis
Pourriez-vous suggérer s'il vous plaît, quelle approche devrait être utilisée pour les types infinis? https://stackoverflow.com/questions/46618400/how-to-define-sup-for-an-inductive-datatype – Denis
Vous ne pouvez pas calculer suprema pour les ensembles infinis à moins que vous ne connaissiez quelque chose sur la structure de l'ensemble infini. –