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) |