src/HOL/Tools/datatype_prop.ML
changeset 5695 898429dbb162
parent 5578 7de426cf179c
child 6394 3d9fd50fcc43
equal deleted inserted replaced
5694:39af7b3dd1c4 5695:898429dbb162
   368     fun mk_asts i j ((cname, cargs)::constrs) =
   368     fun mk_asts i j ((cname, cargs)::constrs) =
   369       let
   369       let
   370         val k = length cargs;
   370         val k = length cargs;
   371         val xs = map (fn i => Variable ("x" ^ string_of_int i)) (i upto i + k - 1);
   371         val xs = map (fn i => Variable ("x" ^ string_of_int i)) (i upto i + k - 1);
   372         val t = Variable ("t" ^ string_of_int j);
   372         val t = Variable ("t" ^ string_of_int j);
   373         val ast = Ast.mk_appl (Constant "@case1")
   373         val ast = Syntax.mk_appl (Constant "@case1")
   374           [Ast.mk_appl (Constant (Sign.base_name cname)) xs, t];
   374           [Syntax.mk_appl (Constant (Sign.base_name cname)) xs, t];
   375         val ast' = foldr (fn (x, y) =>
   375         val ast' = foldr (fn (x, y) =>
   376           Ast.mk_appl (Constant "_abs") [x, y]) (xs, t)
   376           Syntax.mk_appl (Constant "_abs") [x, y]) (xs, t)
   377       in
   377       in
   378         (case constrs of
   378         (case constrs of
   379             [] => (ast, [ast'])
   379             [] => (ast, [ast'])
   380           | cs => let val (ast'', asts) = mk_asts (i + k) (j + 1) cs
   380           | cs => let val (ast'', asts) = mk_asts (i + k) (j + 1) cs
   381               in (Ast.mk_appl (Constant "@case2") [ast, ast''],
   381               in (Syntax.mk_appl (Constant "@case2") [ast, ast''],
   382                   ast'::asts)
   382                   ast'::asts)
   383               end)
   383               end)
   384       end;
   384       end;
   385 
   385 
   386     fun mk_trrule ((_, (_, _, constrs)), tname) =
   386     fun mk_trrule ((_, (_, _, constrs)), tname) =
   387       let val (ast, asts) = mk_asts 1 1 constrs
   387       let val (ast, asts) = mk_asts 1 1 constrs
   388       in Syntax.ParsePrintRule
   388       in Syntax.ParsePrintRule
   389         (Ast.mk_appl (Constant "@case") [Variable "t", ast],
   389         (Syntax.mk_appl (Constant "@case") [Variable "t", ast],
   390          Ast.mk_appl (Constant (tname ^ "_case"))
   390          Syntax.mk_appl (Constant (tname ^ "_case"))
   391            (asts @ [Variable "t"]))
   391            (asts @ [Variable "t"]))
   392       end
   392       end
   393 
   393 
   394   in
   394   in
   395     map mk_trrule (hd descr ~~ new_type_names)
   395     map mk_trrule (hd descr ~~ new_type_names)