# HG changeset patch # User Cezary Kaliszyk # Date 1266415204 -3600 # Node ID 6a3be6ef348d6e24410b27969f4a800a8fd41f9b # Parent f6e9ae54b85522b2bf3b31b427bf7c9173832eda Reorganization diff -r f6e9ae54b855 -r 6a3be6ef348d Quot/Nominal/Fv.thy --- a/Quot/Nominal/Fv.thy Wed Feb 17 14:44:32 2010 +0100 +++ b/Quot/Nominal/Fv.thy Wed Feb 17 15:00:04 2010 +0100 @@ -2,20 +2,6 @@ imports "Nominal2_Atoms" "Nominal2_Eqvt" "Nominal2_Supp" "Abs" begin -atom_decl name - -datatype rlam = - rVar "name" -| rApp "rlam" "rlam" -| rLam "name" "rlam" - -ML {* - open Datatype_Aux (* typ_of_dtyp, DtRec, ... *); - fun mk_atom ty = Const (@{const_name atom}, ty --> @{typ atom}) -*} - -ML {* dest_Type @{typ rlam} *} - (* Bindings are given as a list which has a length being equal to the length of the number of constructors. @@ -40,24 +26,37 @@ *) ML {* + open Datatype_Aux; (* typ_of_dtyp, DtRec, ... *); + fun mk_atom ty = Const (@{const_name atom}, ty --> @{typ atom}); + val noatoms = @{term "{} :: atom set"}; + fun mk_single_atom x = HOLogic.mk_set @{typ atom} [mk_atom (type_of x) $ x]; + fun mk_union sets = + fold (fn a => fn b => + if a = noatoms then b else + if b = noatoms then a else + HOLogic.mk_binop @{const_name union} (a, b)) (rev sets) noatoms; + fun mk_diff a b = + if b = noatoms then a else + if b = a then noatoms else + HOLogic.mk_binop @{const_name minus} (a, b); +*} + +atom_decl name + +datatype rlam = + rVar "name" +| rApp "rlam" "rlam" +| rLam "name" "rlam" + +ML {* val {descr, ...} = Datatype.the_info @{theory} "Fv.rlam"; val sorts = []; - val noatoms = @{term "{} :: atom set"} - val binds = [[[]], [[], []], [[], [(NONE, 0)]]]; + val binds = [[[]], [[], []], [[(NONE, 0)], [(NONE, 0)]]]; fun nth_dtyp i = typ_of_dtyp descr sorts (DtRec i); val fv_names = Datatype_Prop.indexify_names (map (fn (i, _) => "fv_" ^ name_of_typ (nth_dtyp i)) descr); val fv_types = map (fn (i, _) => nth_dtyp i --> @{typ "atom set"}) descr; val fv_frees = map Free (fv_names ~~ fv_types); - fun mk_single_atom x = HOLogic.mk_set @{typ atom} [mk_atom (type_of x) $ x] - fun mk_union sets = - fold (fn a => fn b => - if a = noatoms then b else - if b = noatoms then a else - HOLogic.mk_binop @{const_name union} (a, b)) sets noatoms; - fun mk_diff a b = - if b = noatoms then a else - HOLogic.mk_binop @{const_name minus} (a, b); fun fv_eq_constr i (cname, dts) bindcs = let val Ts = map (typ_of_dtyp descr sorts) dts; @@ -71,15 +70,13 @@ fun fv_arg ((dt, x), bindxs) = let val arg = - if is_rec_type dt then nth fv_frees (body_index dt) $ x + if is_rec_type dt then nth fv_frees (body_index dt) $ x else (* TODO: we just assume everything can be 'atomized' *) - else HOLogic.mk_set @{typ atom} [mk_atom (type_of x) $ x] + HOLogic.mk_set @{typ atom} [mk_atom (type_of x) $ x] val sub = mk_union (map fv_bind bindxs) in mk_diff arg sub end; - val _ = tracing (string_of_int (length dts)); - val _ = tracing (string_of_int (length bindcs)); in (Attrib.empty_binding, HOLogic.mk_Trueprop (HOLogic.mk_eq (fv_c $ list_comb (c, args), mk_union (map fv_arg (dts ~~ args ~~ bindcs)))))