quotient.ML
changeset 148 8e24e65f1e9b
parent 135 6f0d14ba096c
child 165 2c83d04262f9
equal deleted inserted replaced
147:f8a35cf814de 148:8e24e65f1e9b
     5   val mk_quotient_type_cmd: (((bstring * mixfix) * string) * string) list -> Proof.context -> Proof.state
     5   val mk_quotient_type_cmd: (((bstring * mixfix) * string) * string) list -> Proof.context -> Proof.state
     6   val define: binding * mixfix * term -> local_theory -> (term * thm) * local_theory
     6   val define: binding * mixfix * term -> local_theory -> (term * thm) * local_theory
     7   val note: binding * thm -> local_theory -> thm * local_theory
     7   val note: binding * thm -> local_theory -> thm * local_theory
     8   val maps_lookup: theory -> string -> maps_info option
     8   val maps_lookup: theory -> string -> maps_info option
     9   val maps_update: string -> maps_info -> theory -> theory                                  
     9   val maps_update: string -> maps_info -> theory -> theory                                  
    10 
    10   val print_quotdata: Proof.context -> unit
    11 end;
    11 end;
    12 
    12 
    13 structure Quotient: QUOTIENT =
    13 structure Quotient: QUOTIENT =
    14 struct
    14 struct
    15 
    15 
    28 
    28 
    29 val maps_lookup = Symtab.lookup o MapsData.get
    29 val maps_lookup = Symtab.lookup o MapsData.get
    30 fun maps_update k v = MapsData.map (Symtab.update (k, v))
    30 fun maps_update k v = MapsData.map (Symtab.update (k, v))
    31 
    31 
    32 
    32 
    33 
       
    34 (* info about the quotient types *)
    33 (* info about the quotient types *)
    35 type quotient_info = {qtyp: typ, rtyp: typ, rel: term}
    34 type quotient_info = {qtyp: typ, rtyp: typ, rel: term}
    36 
    35 
    37 structure QuotData = TheoryDataFun
    36 structure QuotData = TheoryDataFun
    38   (type T = quotient_info list
    37   (type T = quotient_info list
    45 fun quotdata_update (qty, rty, rel) = 
    44 fun quotdata_update (qty, rty, rel) = 
    46       QuotData.map (fn ls => {qtyp = qty, rtyp = rty, rel = rel}::ls)
    45       QuotData.map (fn ls => {qtyp = qty, rtyp = rty, rel = rel}::ls)
    47 
    46 
    48 fun print_quotdata ctxt =
    47 fun print_quotdata ctxt =
    49 let
    48 let
    50   val quots = QuotData.get (Context.theory_of_proof ctxt)
    49   val quots = QuotData.get (ProofContext.theory_of ctxt)
    51   fun prt_quot {qtyp, rtyp, rel} = Pretty.block
    50   fun prt_quot {qtyp, rtyp, rel} = 
    52       [Pretty.str ("quotient:"), 
    51       Pretty.block [Pretty.str ("quotient:"), 
    53        Pretty.brk 2, 
    52                     Pretty.brk 2, Syntax.pretty_typ ctxt qtyp,
    54        Syntax.pretty_typ ctxt qtyp,
    53                     Pretty.brk 2, Syntax.pretty_typ ctxt rtyp,
    55        Pretty.brk 2, 
    54                     Pretty.brk 2, Syntax.pretty_term ctxt rel]
    56        Syntax.pretty_typ ctxt rtyp,
       
    57        Pretty.brk 2, 
       
    58        Syntax.pretty_term ctxt rel]
       
    59 in
    55 in
    60   [Pretty.big_list "quotients:" (map prt_quot quots)]
    56   [Pretty.big_list "quotients:" (map prt_quot quots)]
    61   |> Pretty.chunks |> Pretty.writeln
    57   |> Pretty.chunks |> Pretty.writeln
    62 end
    58 end
    63 
    59 
   174   val rep_ty = #rep_type typedef_info
   170   val rep_ty = #rep_type typedef_info
   175   val abs_name = #Abs_name typedef_info
   171   val abs_name = #Abs_name typedef_info
   176   val rep_name = #Rep_name typedef_info
   172   val rep_name = #Rep_name typedef_info
   177   val abs = Const (abs_name, rep_ty --> abs_ty)
   173   val abs = Const (abs_name, rep_ty --> abs_ty)
   178   val rep = Const (rep_name, abs_ty --> rep_ty)
   174   val rep = Const (rep_name, abs_ty --> rep_ty)
       
   175 
       
   176   (* storing the quot-info *)
       
   177   val _ = quotdata_update (abs_ty, rty, rel) (ProofContext.theory_of lthy)
   179 
   178 
   180   (* ABS and REP definitions *)
   179   (* ABS and REP definitions *)
   181   val ABS_const = Const (@{const_name "QUOT_TYPE.ABS"}, dummyT )
   180   val ABS_const = Const (@{const_name "QUOT_TYPE.ABS"}, dummyT )
   182   val REP_const = Const (@{const_name "QUOT_TYPE.REP"}, dummyT )
   181   val REP_const = Const (@{const_name "QUOT_TYPE.REP"}, dummyT )
   183   val ABS_trm = Syntax.check_term lthy1 (ABS_const $ rel $ abs)
   182   val ABS_trm = Syntax.check_term lthy1 (ABS_const $ rel $ abs)
   244 
   243 
   245 fun mk_quotient_type quot_list lthy = 
   244 fun mk_quotient_type quot_list lthy = 
   246 let
   245 let
   247   fun get_goal (rty, rel) =
   246   fun get_goal (rty, rel) =
   248   let
   247   let
   249       val EQUIV_ty = ([rty, rty] ---> @{typ bool}) --> @{typ bool}
   248     val EQUIV_ty = ([rty, rty] ---> @{typ bool}) --> @{typ bool}
   250   in 
   249   in 
   251     (HOLogic.mk_Trueprop (Const (@{const_name EQUIV}, EQUIV_ty) $ rel), [])
   250     (HOLogic.mk_Trueprop (Const (@{const_name EQUIV}, EQUIV_ty) $ rel), [])
   252   end
   251   end
   253 
   252 
   254   val goals = map (get_goal o snd) quot_list
   253   val goals = map (get_goal o snd) quot_list
   272     val qty_name = Binding.name qty_str
   271     val qty_name = Binding.name qty_str
   273     val rty = Syntax.parse_typ lthy rty_str
   272     val rty = Syntax.parse_typ lthy rty_str
   274     val rel = Syntax.parse_term lthy rel_str
   273     val rel = Syntax.parse_term lthy rel_str
   275               |> Syntax.check_term lthy
   274               |> Syntax.check_term lthy
   276   in
   275   in
   277      ((qty_name, mx), (rty, rel))
   276     ((qty_name, mx), (rty, rel))
   278   end
   277   end
   279 in
   278 in
   280   mk_quotient_type (map parse_spec spec) lthy
   279   mk_quotient_type (map parse_spec spec) lthy
   281 end
   280 end
   282 
   281