| author | nipkow | 
| Mon, 06 Jun 2005 21:20:54 +0200 | |
| changeset 16306 | 8117e2037d3b | 
| parent 16224 | 57094b83774e | 
| child 16394 | 495dbcd4f4c9 | 
| permissions | -rw-r--r-- | 
| 2453 | 1 | (* Title: HOLCF/domain/syntax.ML | 
| 2445 
51993fea433f
removed Holcfb.thy and Holcfb.ML, moving classical3 to HOL.ML as classical2
 oheimb parents: 
1637diff
changeset | 2 | ID: $Id$ | 
| 12030 | 3 | Author: David von Oheimb | 
| 2445 
51993fea433f
removed Holcfb.thy and Holcfb.ML, moving classical3 to HOL.ML as classical2
 oheimb parents: 
1637diff
changeset | 4 | |
| 12030 | 5 | Syntax generator for domain section. | 
| 1274 | 6 | *) | 
| 7 | ||
| 8 | structure Domain_Syntax = struct | |
| 9 | ||
| 10 | local | |
| 11 | ||
| 12 | open Domain_Library; | |
| 4122 | 13 | infixr 5 -->; infixr 6 ->>; | 
| 14 | fun calc_syntax dtypeprod ((dname, typevars), | |
| 15 | (cons': (string * mixfix * (bool*string*typ) list) list)) = | |
| 1274 | 16 | let | 
| 4122 | 17 | (* ----- constants concerning the isomorphism ------------------------------- *) | 
| 1274 | 18 | |
| 19 | local | |
| 4122 | 20 | fun opt_lazy (lazy,_,t) = if lazy then mk_uT t else t | 
| 21 | fun prod (_,_,args) = if args = [] then oneT | |
| 22 | else foldr' mk_sprodT (map opt_lazy args); | |
| 23 | fun freetvar s = let val tvar = mk_TFree s in | |
| 24 | 		   if tvar mem typevars then freetvar ("t"^s) else tvar end;
 | |
| 15574 
b1d1b5bfc464
Removed practically all references to Library.foldr.
 skalberg parents: 
15570diff
changeset | 25 | fun when_type (_ ,_,args) = foldr (op ->>) (freetvar "t") (map third args); | 
| 1274 | 26 | in | 
| 27 | val dtype = Type(dname,typevars); | |
| 4122 | 28 | val dtype2 = foldr' mk_ssumT (map prod cons'); | 
| 4008 | 29 | val dnam = Sign.base_name dname; | 
| 4122 | 30 | val const_rep = (dnam^"_rep" , dtype ->> dtype2, NoSyn); | 
| 31 | val const_abs = (dnam^"_abs" , dtype2 ->> dtype , NoSyn); | |
| 15574 
b1d1b5bfc464
Removed practically all references to Library.foldr.
 skalberg parents: 
15570diff
changeset | 32 | val const_when = (dnam^"_when",foldr (op ->>) (dtype ->> freetvar "t") (map when_type cons'), NoSyn); | 
| 4122 | 33 | val const_copy = (dnam^"_copy", dtypeprod ->> dtype ->> dtype , NoSyn); | 
| 1274 | 34 | end; | 
| 35 | ||
| 4122 | 36 | (* ----- constants concerning constructors, discriminators, and selectors --- *) | 
| 1274 | 37 | |
| 38 | local | |
| 39 | val escape = let | |
| 4122 | 40 | 	fun esc (c::cs) = if c mem ["'","_","(",")","/"] then "'"::c::esc cs
 | 
| 41 | else c::esc cs | |
| 42 | | esc [] = [] | |
| 4709 | 43 | in implode o esc o Symbol.explode end; | 
| 15574 
b1d1b5bfc464
Removed practically all references to Library.foldr.
 skalberg parents: 
15570diff
changeset | 44 | fun con (name,s,args) = (name,foldr (op ->>) dtype (map third args),s); | 
| 4122 | 45 | fun dis (con ,s,_ ) = (dis_name_ con, dtype->>trT, | 
| 5700 | 46 | 			   Mixfix(escape ("is_" ^ con), [], Syntax.max_pri));
 | 
| 4122 | 47 | (* stricly speaking, these constants have one argument, | 
| 48 | but the mixfix (without arguments) is introduced only | |
| 49 | to generate parse rules for non-alphanumeric names*) | |
| 16224 
57094b83774e
Domain package generates match functions for new datatypes, for use with the fixrec package
 huffman parents: 
15574diff
changeset | 50 | fun mat (con ,s,args) = (mat_name_ con, dtype->>mk_ssumT(oneT,mk_uT(mk_ctupleT(map third args))), | 
| 
57094b83774e
Domain package generates match functions for new datatypes, for use with the fixrec package
 huffman parents: 
15574diff
changeset | 51 | 			   Mixfix(escape ("match_" ^ con), [], Syntax.max_pri));
 | 
| 4122 | 52 | fun sel (_ ,_,args) = map (fn(_,sel,typ)=>(sel,dtype ->> typ,NoSyn))args; | 
| 1274 | 53 | in | 
| 54 | val consts_con = map con cons'; | |
| 55 | val consts_dis = map dis cons'; | |
| 16224 
57094b83774e
Domain package generates match functions for new datatypes, for use with the fixrec package
 huffman parents: 
15574diff
changeset | 56 | val consts_mat = map mat cons'; | 
| 15570 | 57 | val consts_sel = List.concat(map sel cons'); | 
| 1274 | 58 | end; | 
| 59 | ||
| 4122 | 60 | (* ----- constants concerning induction ------------------------------------- *) | 
| 1274 | 61 | |
| 4122 | 62 | val const_take = (dnam^"_take" , HOLogic.natT-->dtype->>dtype, NoSyn); | 
| 63 | val const_finite = (dnam^"_finite", dtype-->HOLogic.boolT , NoSyn); | |
| 1274 | 64 | |
| 4122 | 65 | (* ----- case translation --------------------------------------------------- *) | 
| 1274 | 66 | |
| 67 | local open Syntax in | |
| 68 | val case_trans = let | |
| 4122 | 69 | fun c_ast con mx = Constant (const_name con mx); | 
| 70 | 	fun expvar n     = Variable ("e"^(string_of_int n));
 | |
| 71 | 	fun argvar n m _ = Variable ("a"^(string_of_int n)^"_"^
 | |
| 72 | (string_of_int m)); | |
| 1637 
b8a8ae2e5de1
Updated: 01-Mar-96 when functional strictified, copy_def based on when_def
 oheimb parents: 
1461diff
changeset | 73 | fun app s (l,r) = mk_appl (Constant s) [l,r]; | 
| 9060 
b0dd884b1848
rename @case to _case_syntax (improves on low-level errors);
 wenzelm parents: 
5700diff
changeset | 74 | fun case1 n (con,mx,args) = mk_appl (Constant "_case1") | 
| 15570 | 75 | [Library.foldl (app "Rep_CFun") (c_ast con mx, (mapn (argvar n) 1 args)), | 
| 1637 
b8a8ae2e5de1
Updated: 01-Mar-96 when functional strictified, copy_def based on when_def
 oheimb parents: 
1461diff
changeset | 76 | expvar n]; | 
| 
b8a8ae2e5de1
Updated: 01-Mar-96 when functional strictified, copy_def based on when_def
 oheimb parents: 
1461diff
changeset | 77 | fun arg1 n (con,_,args) = if args = [] then expvar n | 
| 
b8a8ae2e5de1
Updated: 01-Mar-96 when functional strictified, copy_def based on when_def
 oheimb parents: 
1461diff
changeset | 78 | else mk_appl (Constant "LAM ") | 
| 
b8a8ae2e5de1
Updated: 01-Mar-96 when functional strictified, copy_def based on when_def
 oheimb parents: 
1461diff
changeset | 79 | [foldr' (app "_idts") (mapn (argvar n) 1 args) , expvar n]; | 
| 3534 | 80 | in | 
| 81 | ParsePrintRule | |
| 9060 
b0dd884b1848
rename @case to _case_syntax (improves on low-level errors);
 wenzelm parents: 
5700diff
changeset | 82 | (mk_appl (Constant "_case_syntax") [Variable "x", foldr' | 
| 
b0dd884b1848
rename @case to _case_syntax (improves on low-level errors);
 wenzelm parents: 
5700diff
changeset | 83 | (fn (c,cs) => mk_appl (Constant"_case2") [c,cs]) | 
| 3534 | 84 | (mapn case1 1 cons')], | 
| 15570 | 85 | mk_appl (Constant "Rep_CFun") [Library.foldl | 
| 5291 | 86 | (fn (w,a ) => mk_appl (Constant"Rep_CFun" ) [w,a ]) | 
| 4008 | 87 | (Constant (dnam^"_when"),mapn arg1 1 cons'), | 
| 3534 | 88 | Variable "x"]) | 
| 1274 | 89 | end; | 
| 90 | end; | |
| 91 | ||
| 92 | in ([const_rep, const_abs, const_when, const_copy] @ | |
| 16224 
57094b83774e
Domain package generates match functions for new datatypes, for use with the fixrec package
 huffman parents: 
15574diff
changeset | 93 | consts_con @ consts_dis @ consts_mat @ consts_sel @ | 
| 1274 | 94 | [const_take, const_finite], | 
| 95 | [case_trans]) | |
| 96 | end; (* let *) | |
| 97 | ||
| 4122 | 98 | (* ----- putting all the syntax stuff together ------------------------------ *) | 
| 1274 | 99 | |
| 100 | in (* local *) | |
| 101 | ||
| 4008 | 102 | fun add_syntax (comp_dnam,eqs': ((string * typ list) * | 
| 4122 | 103 | (string * mixfix * (bool*string*typ) list) list) list) thy'' = | 
| 1274 | 104 | let | 
| 4122 | 105 | val dtypes = map (Type o fst) eqs'; | 
| 106 | val boolT = HOLogic.boolT; | |
| 107 | val funprod = foldr' mk_prodT (map (fn tp => tp ->> tp ) dtypes); | |
| 108 | val relprod = foldr' mk_prodT (map (fn tp => tp --> tp --> boolT) dtypes); | |
| 109 | val const_copy = (comp_dnam^"_copy" ,funprod ->> funprod, NoSyn); | |
| 110 | val const_bisim = (comp_dnam^"_bisim" ,relprod --> boolT , NoSyn); | |
| 1274 | 111 | val ctt = map (calc_syntax funprod) eqs'; | 
| 15570 | 112 | in thy'' |> ContConsts.add_consts_i (List.concat (map fst ctt) @ | 
| 4122 | 113 | (if length eqs'>1 then [const_copy] else[])@ | 
| 114 | [const_bisim]) | |
| 15570 | 115 | |> Theory.add_trrules_i (List.concat(map snd ctt)) | 
| 1274 | 116 | end; (* let *) | 
| 117 | ||
| 118 | end; (* local *) | |
| 119 | end; (* struct *) |