Theory Finite_Inj
subsection ‹ Finite Injections ›
theory Finite_Inj
imports Partial_Inj Finite_Fun
begin
typedef ('a, 'b) finj = "{f :: 'a ⤔ 'b. finite(pidom(f))}"
morphisms pinj_of_finj finj_of_pinj
by (metis CollectI infinite_imp_nonempty pidom_empty)
setup_lifting type_definition_ffun
setup_lifting type_definition_finj
type_notation finj (infixr "⤕" 1)
lift_definition ffun_of_finj :: "'a ⤕ 'b ⇒ 'a ⇻ 'b" is "λ x. pfun_of_pinj (pinj_of_finj x)"
by (transfer, simp, metis mem_Collect_eq pidom.rep_eq pinj_of_finj)
text ‹ Hide implementation details for finite functions and injections ›
lifting_update ffun.lifting
lifting_forget ffun.lifting
lifting_update finj.lifting
lifting_forget finj.lifting
end