Theory Functions_Injective
subsubsection ‹Injective›
theory Functions_Injective
imports
Bounded_Quantifiers
Functions_Monotone
HOL_Syntax_Bundles_Lattices
begin
consts injective_on :: "'a ⇒ 'b ⇒ bool"
overloading
injective_on_pred ≡ "injective_on :: ('a ⇒ bool) ⇒ ('a ⇒ 'b) ⇒ bool"
begin
definition "injective_on_pred P f ≡ ∀x x' : P. f x = f x' ⟶ x = x'"
end
lemma injective_onI [intro]:
assumes "⋀x x'. P x ⟹ P x' ⟹ f x = f x' ⟹ x = x'"
shows "injective_on P f"
unfolding injective_on_pred_def using assms by blast
lemma injective_onD:
assumes "injective_on P f"
and "P x" "P x'"
and "f x = f x'"
shows "x = x'"
using assms unfolding injective_on_pred_def by blast
lemma injective_on_comp_if_injective_onI:
assumes "injective_on (P :: 'a ⇒ bool) f" "injective_on Q g"
and "(P ⇒ Q) f"
shows "injective_on P (g ∘ f)"
by (urule injective_onI) (use assms in ‹auto dest: injective_onD›)
consts injective :: "'a ⇒ bool"
overloading
injective ≡ "injective :: ('a ⇒ 'b) ⇒ bool"
begin
definition "(injective :: ('a ⇒ 'b) ⇒ bool) ≡ injective_on (⊤ :: 'a ⇒ bool)"
end
lemma injective_eq_injective_on:
"(injective :: ('a ⇒ 'b) ⇒ bool) = injective_on (⊤ :: 'a ⇒ bool)"
unfolding injective_def ..
lemma injective_eq_injective_on_uhint [uhint]:
assumes "P ≡ (⊤ :: 'a ⇒ bool)"
shows "injective :: ('a ⇒ 'b) ⇒ bool ≡ injective_on P"
using assms by (simp add: injective_eq_injective_on)
lemma injectiveI [intro]:
assumes "⋀x x'. f x = f x' ⟹ x = x'"
shows "injective f"
using assms by (urule injective_onI)
lemma injectiveD:
assumes "injective f"
and "f x = f x'"
shows "x = x'"
using assms by (urule (d) injective_onD where chained = insert) simp_all
lemma injective_on_if_injective:
fixes P :: "'a ⇒ bool" and f :: "'a ⇒ _"
assumes "injective f"
shows "injective_on P f"
using assms by (intro injective_onI) (blast dest: injectiveD)
paragraph ‹Instantiations›
lemma injective_id: "injective id" by auto
end