# HG changeset patch # User huffman # Date 1131236497 -3600 # Node ID d196d84c306f1400c9bb1130c78ded37fd982fb7 # Parent 574aa0487069dcf342163f0134f5ffc1ade5b657 add case syntax stuff diff -r 574aa0487069 -r d196d84c306f src/HOLCF/Fixrec.thy --- a/src/HOLCF/Fixrec.thy Sun Nov 06 00:35:24 2005 +0100 +++ b/src/HOLCF/Fixrec.thy Sun Nov 06 01:21:37 2005 +0100 @@ -31,12 +31,14 @@ apply (rule_tac p=y in upE, simp, simp) done -subsection {* Monadic bind operator *} +subsubsection {* Monadic bind operator *} -consts - bind :: "'a maybe \ ('a \ 'b maybe) \ 'b maybe" (infixl ">>=" 50) -defs - bind_def: "bind \ \ m f. sscase\sinl\(fup\f)\m" +constdefs + bind :: "'a maybe \ ('a \ 'b maybe) \ 'b maybe" + "bind \ \ m f. sscase\sinl\(fup\f)\m" + +syntax ">>=" :: "['a maybe, 'a \ 'b maybe] \ 'b maybe" (infixl ">>=" 50) +translations "m >>= f" == "bind\m\f" nonterminals maybebind maybebinds @@ -71,7 +73,7 @@ "(do b <- (do a <- m; k\a); h\b) = (do a <- m; b <- k\a; h\b)" by (rule_tac p=m in maybeE, simp_all) -subsection {* Run operator *} +subsubsection {* Run operator *} constdefs run:: "'a::pcpo maybe \ 'a" @@ -88,12 +90,14 @@ lemma run_return [simp]: "run\(return\x) = x" by (simp add: run_def return_def) -subsection {* Monad plus operator *} +subsubsection {* Monad plus operator *} -consts - mplus :: "'a maybe \ 'a maybe \ 'a maybe" (infixr "+++" 65) -defs - mplus_def: "mplus \ \ m1 m2. sscase\(\ x. m2)\(fup\return)\m1" +constdefs + mplus :: "'a maybe \ 'a maybe \ 'a maybe" + "mplus \ \ m1 m2. sscase\(\ x. m2)\(fup\return)\m1" + +syntax "+++" :: "['a maybe, 'a maybe] \ 'a maybe" (infixr "+++" 65) +translations "m1 +++ m2" == "mplus\m1\m2" text {* rewrite rules for mplus *} @@ -112,6 +116,193 @@ lemma mplus_assoc: "(x +++ y) +++ z = x +++ (y +++ z)" by (rule_tac p=x in maybeE, simp_all) +subsubsection {* Fatbar combinator *} + +constdefs + fatbar :: "('a \ 'b maybe) \ ('a \ 'b maybe) \ ('a \ 'b maybe)" + "fatbar \ \ a b x. a\x +++ b\x" + +syntax + "\" :: "['a \ 'b maybe, 'a \ 'b maybe] \ 'a \ 'b maybe" (infixr "\" 60) +translations + "m1 \ m2" == "fatbar\m1\m2" + +lemma fatbar1: "m\x = \ \ (m \ ms)\x = \" +by (simp add: fatbar_def) + +lemma fatbar2: "m\x = fail \ (m \ ms)\x = ms\x" +by (simp add: fatbar_def) + +lemma fatbar3: "m\x = return\y \ (m \ ms)\x = return\y" +by (simp add: fatbar_def) + +lemmas fatbar_simps = fatbar1 fatbar2 fatbar3 + +subsection {* Pattern combinators *} + +types ('a,'b,'c) pattern = "'b \ 'a \ 'c maybe" + +constdefs + wild_pat :: "('a, 'b, 'b) pattern" + "wild_pat \ \ r a. return\r" + + var_pat :: "('a, 'a \ 'b, 'b) pattern" + "var_pat \ \ r a. return\(r\a)" + + as_pat :: "('a, 'b, 'c) pattern \ ('a, 'a \ 'b, 'c) pattern" + "as_pat p \ \ r a. p\(r\a)\a" + +lemma wild_pat [simp]: "wild_pat\r\a = return\r" +by (simp add: wild_pat_def) + +lemma var_pat [simp]: "var_pat\r\a = return\(r\a)" +by (simp add: var_pat_def) + +lemma as_pat [simp]: "as_pat p\r\a = p\(r\a)\a" +by (simp add: as_pat_def) + +subsection {* Case syntax *} + +nonterminals + Case_syn Cases_syn + +syntax + "_Case_syntax":: "['a, Cases_syn] => 'b" ("(Case _ of/ _)" 10) + "_Case1" :: "['a, 'b] => Case_syn" ("(2_ =>/ _)" 10) + "" :: "Case_syn => Cases_syn" ("_") + "_Case2" :: "[Case_syn, Cases_syn] => Cases_syn" ("_/ | _") + "_as_pattern" :: "[idt, 'a] \ 'a" (infixr "as" 10) + +syntax (xsymbols) + "_Case1" :: "['a, 'b] => Case_syn" ("(2_ \/ _)" 10) + +syntax + "_match" :: "'a \ Case_syn" (* or Cases_syn *) + "_as" :: "[pttrn, Case_syn] \ Case_syn" + "_matches" :: "['a, Case_syn, 'a list] \ Case_syn" + "_cons" :: "['a, 'a list] \ 'a list" + "_nil" :: "'a list" + +translations + "_Case_syntax x (_match m)" == "run\(m\x)" + "_Case2 (_match c) (_match cs)" == "_match (c \ cs)" + "_Case1 dummy_pattern r" == "_match (wild_pat\r)" + "_as x (_match (p\t))" == "_match ((as_pat p)\(\ x. t))" + "_Case1 (_as_pattern x e) r" == "_as x (_Case1 e r)" + "_Case1 x t" == "_match (var_pat\(\ x. t))" + "_Case1 (f\e) r" == "_matches f (_Case1 e r) _nil" + "_matches (f\e) (_match (p\r)) ps" == "_matches f (_Case1 e r) (_cons p ps)" + +lemma run_fatbar1: "m\x = \ \ run\((m \ ms)\x) = \" +by (simp add: fatbar_def) + +lemma run_fatbar2: "m\x = fail \ run\((m \ ms)\x) = run\(ms\x)" +by (simp add: fatbar_def) + +lemma run_fatbar3: "m\x = return\y \ run\((m \ ms)\x) = y" +by (simp add: fatbar_def) + +lemmas run_fatbar_simps [simp] = run_fatbar1 run_fatbar2 run_fatbar3 + +subsection {* Pattern combinators for built-in types *} + +constdefs + cpair_pat :: "_" + "cpair_pat p1 p2 \ \ r1 \x1,x2\. bind\(p1\r1\x1)\(\ r2. p2\r2\x2)" + + spair_pat :: "_" + "spair_pat p1 p2 \ \ r (:x,y:). cpair_pat p1 p2\r\\x,y\" + + sinl_pat :: "_" + "sinl_pat p \ \ r a. case a of sinl\x \ p\r\x | sinr\y \ fail" + + sinr_pat :: "_" + "sinr_pat p \ \ r a. case a of sinl\x \ fail | sinr\y \ p\r\y" + + up_pat :: "_" + "up_pat p \ \ r a. case a of up\x \ p\r\x" + + Def_pat :: "'a::type \ ('a lift, 'b, 'b) pattern" + "Def_pat x \ \ r. FLIFT y. if x = y then return\r else fail" + + ONE_pat :: "_" + "ONE_pat \ \ r ONE. return\r" + + TT_pat :: "(tr, _, _) pattern" + "TT_pat \ \ r b. If b then return\r else fail fi" + + FF_pat :: "(tr, _, _) pattern" + "FF_pat \ \ r b. If b then fail else return\r fi" + +translations + "_matches cpair (_match (p1\r)) (_cons p2 _nil)" + == "_match ((cpair_pat p1 p2)\r)" + + "_matches spair (_match (p1\r)) (_cons p2 _nil)" + == "_match ((spair_pat p1 p2)\r)" + +translations + "_matches sinl (_match (p1\r)) _nil" == "_match ((sinl_pat p1)\r)" + "_matches sinr (_match (p1\r)) _nil" == "_match ((sinr_pat p1)\r)" + "_matches up (_match (p1\r)) _nil" == "_match ((up_pat p1)\r)" + +translations + "_Case1 (Def x) r" == "_match (Def_pat x\r)" + "_Case1 ONE r" == "_match (ONE_pat\r)" + "_Case1 TT r" == "_match (TT_pat\r)" + "_Case1 FF r" == "_match (FF_pat\r)" + +lemma cpair_pat_simps [simp]: + "p1\r\x = \ \ cpair_pat p1 p2\r\ = \" + "p1\r\x = fail \ cpair_pat p1 p2\r\ = fail" + "p1\r\x = return\r' \ cpair_pat p1 p2\r\ = p2\r'\y" +by (simp_all add: cpair_pat_def) + +lemma spair_pat_simps [simp]: + "spair_pat p1 p2\r\\ = \" + "\x \ \; y \ \\ \ spair_pat p1 p2\r\(:x, y:) = cpair_pat p1 p2\r\\x, y\" +by (simp_all add: spair_pat_def) + +lemma sinl_pat_simps [simp]: + "sinl_pat p\r\\ = \" + "x \ \ \ sinl_pat p\r\(sinl\x) = p\r\x" + "x \ \ \ sinl_pat p\r\(sinr\x) = fail" +by (simp_all add: sinl_pat_def) + +lemma sinr_pat_simps [simp]: + "sinr_pat p\r\\ = \" + "x \ \ \ sinr_pat p\r\(sinl\x) = fail" + "x \ \ \ sinr_pat p\r\(sinr\x) = p\r\x" +by (simp_all add: sinr_pat_def) + +lemma up_pat_simps [simp]: + "up_pat p\r\\ = \" + "up_pat p\r\(up\x) = p\r\x" +by (simp_all add: up_pat_def) + +lemma Def_pat_simps [simp]: + "Def_pat x\r\\ = \" + "Def_pat x\r\(Def x) = return\r" + "x \ y \ Def_pat x\r\(Def y) = fail" +by (simp_all add: Def_pat_def) + +lemma ONE_pat_simps [simp]: + "ONE_pat\r\\ = \" + "ONE_pat\r\ONE = return\r" +by (simp_all add: ONE_pat_def) + +lemma TT_pat_simps [simp]: + "TT_pat\r\\ = \" + "TT_pat\r\TT = return\r" + "TT_pat\r\FF = fail" +by (simp_all add: TT_pat_def) + +lemma FF_pat_simps [simp]: + "FF_pat\r\\ = \" + "FF_pat\r\TT = fail" + "FF_pat\r\FF = return\r" +by (simp_all add: FF_pat_def) + subsection {* Match functions for built-in types *} defaultsort pcpo