Theory Function_Toolkit
section ‹ Function Toolkit ›
theory Function_Toolkit
imports Relation_Toolkit
begin
subsection ‹ Partial Functions ›
lemma partial_functions: "X →⇩p Y = {f ∈ X ↔ Y. ∀ p ∈ f. ∀ q ∈ f. p.1 = q.1 ⟶ p.2 = q.2}"
by (auto simp add: rel_pfun_def single_valued_def)
notation size ("#_" [999] 999)
instantiation set :: (type) size
begin
definition [simp]: "size A = card A"
instance ..
end
instantiation pfun :: (type, type) size
begin
definition size_pfun :: "('a ⇸ 'b) ⇒ nat" where
"size_pfun f = card (pfun_graph f)"
instance ..
end
lemma size_finite_pfun: "finite (pdom f) ⟹ #f = #(dom f)"
by (simp add: card_pfun_graph size_pfun_def)
lemma card_pfun_empty [simp]: "#{}⇩p = 0"
by (simp add: size_pfun_def pfun_graph_zero)
lemma card_pfun_update [simp]: "finite (dom f) ⟹ #(f(k ↦ v)⇩p) = (if (k ∈ dom f) then #f else #f + 1)"
by (auto simp add: size_pfun_def pfun_graph_update Dom_pfun_graph rel_domres_compl_disj)
(metis card_pfun_graph insert_absorb pdom_upd pfun_graph_update)
subsection ‹ Total Functions ›
text ‹ One issue that emerges in this encoding is the treatment of total functions. In Z, a total
function is a particular kind of partial function whose domain covers the type universe. In HOL,
a total function is one of the basic types. Typically, one wishes to apply total functions,
partial functions, and finite functions to values using the notation @{term "f x"}. In order
to implement this, we need to coerce the given function @{term f} to a total function, since
this is fundamental to HOL's application construct. However, that means that we can't also
coerce a total function to a partial function, as expected by Z, since this would lead to
a cycle. Consequently, we actually need to create a new ``total function'' type, different
to the HOL one, to break the cycle. We therefore consider the HOL total function type
to be meta-logical with respect to Z. ›
declare [[coercion pfun_of_tfun]]
subsection ‹ Disjointness ›
consts
disjoint :: "'f ⇒ bool"
adhoc_overloading
disjoint ⇌ rel_disjoint and
disjoint ⇌ pfun_disjoint and
disjoint ⇌ list_disjoint
subsection ‹ Partitions ›
consts partitions :: "'f ⇒ 'a set ⇒ bool" (infix "partitions" 65)
adhoc_overloading
partitions ⇌ rel_partitions and
partitions ⇌ pfun_partitions and
partitions ⇌ list_partitions
end