src/HOL/Tools/Groebner_Basis/normalizer.ML
changeset 36708 3db7243c2484
parent 36707 e6933119ea65
child 36709 f7329e6734bd
equal deleted inserted replaced
36707:e6933119ea65 36708:3db7243c2484
    34 end
    34 end
    35 
    35 
    36 structure Normalizer: NORMALIZER = 
    36 structure Normalizer: NORMALIZER = 
    37 struct
    37 struct
    38 
    38 
    39 (* data *)
    39 (** data **)
    40 
    40 
    41 type entry =
    41 type entry =
    42  {vars: cterm list,
    42  {vars: cterm list,
    43   semiring: cterm list * thm list,
    43   semiring: cterm list * thm list,
    44   ring: cterm list * thm list,
    44   ring: cterm list * thm list,
    57   val extend = I;
    57   val extend = I;
    58   val merge = AList.merge Thm.eq_thm (K false);
    58   val merge = AList.merge Thm.eq_thm (K false);
    59 );
    59 );
    60 
    60 
    61 val get = Data.get o Context.Proof;
    61 val get = Data.get o Context.Proof;
    62 
       
    63 
       
    64 (* match data *)
       
    65 
    62 
    66 fun match ctxt tm =
    63 fun match ctxt tm =
    67   let
    64   let
    68     fun match_inst
    65     fun match_inst
    69         ({vars, semiring = (sr_ops, sr_rules), 
    66         ({vars, semiring = (sr_ops, sr_rules), 
   170       raise THM ("No data entry for structure key", 0, [key]);
   167       raise THM ("No data entry for structure key", 0, [key]);
   171     val fns = {is_const = is_const phi, dest_const = dest_const phi,
   168     val fns = {is_const = is_const phi, dest_const = dest_const phi,
   172       mk_const = mk_const phi, conv = conv phi};
   169       mk_const = mk_const phi, conv = conv phi};
   173   in AList.map_entry Thm.eq_thm key (apsnd (K fns)) data end);
   170   in AList.map_entry Thm.eq_thm key (apsnd (K fns)) data end);
   174 
   171 
   175 
       
   176 (* concrete syntax *)
       
   177 
       
   178 local
       
   179 
       
   180 fun keyword k = Scan.lift (Args.$$$ k -- Args.colon) >> K ();
       
   181 fun keyword2 k1 k2 = Scan.lift (Args.$$$ k1 -- Args.$$$ k2 -- Args.colon) >> K ();
       
   182 fun keyword3 k1 k2 k3 =
       
   183   Scan.lift (Args.$$$ k1 -- Args.$$$ k2 -- Args.$$$ k3 -- Args.colon) >> K ();
       
   184 
       
   185 val opsN = "ops";
       
   186 val rulesN = "rules";
       
   187 
       
   188 val normN = "norm";
       
   189 val constN = "const";
       
   190 val delN = "del";
       
   191 
       
   192 val any_keyword =
       
   193   keyword2 semiringN opsN || keyword2 semiringN rulesN ||
       
   194   keyword2 ringN opsN || keyword2 ringN rulesN ||
       
   195   keyword2 fieldN opsN || keyword2 fieldN rulesN ||
       
   196   keyword2 idomN rulesN || keyword2 idealN rulesN;
       
   197 
       
   198 val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat;
       
   199 val terms = thms >> map Drule.dest_term;
       
   200 
       
   201 fun optional scan = Scan.optional scan [];
       
   202 
       
   203 in
       
   204 
       
   205 val normalizer_setup =
       
   206   Attrib.setup @{binding normalizer}
       
   207     (Scan.lift (Args.$$$ delN >> K del) ||
       
   208       ((keyword2 semiringN opsN |-- terms) --
       
   209        (keyword2 semiringN rulesN |-- thms)) --
       
   210       (optional (keyword2 ringN opsN |-- terms) --
       
   211        optional (keyword2 ringN rulesN |-- thms)) --
       
   212       (optional (keyword2 fieldN opsN |-- terms) --
       
   213        optional (keyword2 fieldN rulesN |-- thms)) --
       
   214       optional (keyword2 idomN rulesN |-- thms) --
       
   215       optional (keyword2 idealN rulesN |-- thms)
       
   216       >> (fn ((((sr, r), f), id), idl) => 
       
   217              add {semiring = sr, ring = r, field = f, idom = id, ideal = idl}))
       
   218     "semiring normalizer data";
       
   219 
       
   220 end;
       
   221 
   172 
   222 open Conv;
   173 open Conv;
   223 
   174 
   224 (* Very basic stuff for terms *)
   175 (* Very basic stuff for terms *)
   225 
   176 
   857     NONE => reflexive tm
   808     NONE => reflexive tm
   858   | SOME res => semiring_normalize_ord_wrapper ctxt res ord tm);
   809   | SOME res => semiring_normalize_ord_wrapper ctxt res ord tm);
   859  
   810  
   860 fun semiring_normalize_conv ctxt = semiring_normalize_ord_conv ctxt simple_cterm_ord;
   811 fun semiring_normalize_conv ctxt = semiring_normalize_ord_conv ctxt simple_cterm_ord;
   861 
   812 
   862 (* theory setup *)
   813 
   863 
   814 (** Isar setup **)
   864 val setup = normalizer_setup
   815 
       
   816 local
       
   817 
       
   818 fun keyword k = Scan.lift (Args.$$$ k -- Args.colon) >> K ();
       
   819 fun keyword2 k1 k2 = Scan.lift (Args.$$$ k1 -- Args.$$$ k2 -- Args.colon) >> K ();
       
   820 fun keyword3 k1 k2 k3 =
       
   821   Scan.lift (Args.$$$ k1 -- Args.$$$ k2 -- Args.$$$ k3 -- Args.colon) >> K ();
       
   822 
       
   823 val opsN = "ops";
       
   824 val rulesN = "rules";
       
   825 
       
   826 val normN = "norm";
       
   827 val constN = "const";
       
   828 val delN = "del";
       
   829 
       
   830 val any_keyword =
       
   831   keyword2 semiringN opsN || keyword2 semiringN rulesN ||
       
   832   keyword2 ringN opsN || keyword2 ringN rulesN ||
       
   833   keyword2 fieldN opsN || keyword2 fieldN rulesN ||
       
   834   keyword2 idomN rulesN || keyword2 idealN rulesN;
       
   835 
       
   836 val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat;
       
   837 val terms = thms >> map Drule.dest_term;
       
   838 
       
   839 fun optional scan = Scan.optional scan [];
       
   840 
       
   841 in
       
   842 
       
   843 val setup =
       
   844   Attrib.setup @{binding normalizer}
       
   845     (Scan.lift (Args.$$$ delN >> K del) ||
       
   846       ((keyword2 semiringN opsN |-- terms) --
       
   847        (keyword2 semiringN rulesN |-- thms)) --
       
   848       (optional (keyword2 ringN opsN |-- terms) --
       
   849        optional (keyword2 ringN rulesN |-- thms)) --
       
   850       (optional (keyword2 fieldN opsN |-- terms) --
       
   851        optional (keyword2 fieldN rulesN |-- thms)) --
       
   852       optional (keyword2 idomN rulesN |-- thms) --
       
   853       optional (keyword2 idealN rulesN |-- thms)
       
   854       >> (fn ((((sr, r), f), id), idl) => 
       
   855              add {semiring = sr, ring = r, field = f, idom = id, ideal = idl}))
       
   856     "semiring normalizer data";
   865 
   857 
   866 end;
   858 end;
       
   859 
       
   860 end;