src/HOL/Quotient_Examples/Lift_Set.thy
author eberlm <eberlm@in.tum.de>
Mon, 17 Jul 2017 16:49:19 +0200
changeset 66283 adf3155c57e2
parent 63167 0909deb8059b
child 70009 435fb018e8ee
permissions -rw-r--r--
Printing natural numbers as numerals in evaluation

(*  Title:      HOL/Quotient_Examples/Lift_Set.thy
    Author:     Lukas Bulwahn and Ondrej Kuncar
*)

section \<open>Example of lifting definitions with the lifting infrastructure\<close>

theory Lift_Set
imports Main
begin

definition set where "set = (UNIV :: ('a \<Rightarrow> bool) set)"

typedef 'a set = "set :: ('a \<Rightarrow> bool) set"
  morphisms member Set
  unfolding set_def by (rule UNIV_witness)

setup_lifting type_definition_set[unfolded set_def]

text \<open>Now, we can employ lift_definition to lift definitions.\<close>

lift_definition empty :: "'a set" is "bot :: 'a \<Rightarrow> bool" .

term "Lift_Set.empty"
thm Lift_Set.empty_def

lift_definition insert :: "'a => 'a set => 'a set" is "\<lambda> x P y. y = x \<or> P y" . 

term "Lift_Set.insert"
thm Lift_Set.insert_def

export_code empty insert in SML

end