equal
deleted
inserted
replaced
6 *) |
6 *) |
7 |
7 |
8 header {* Analogues of the Cartesian Product and Disjoint Sum for Datatypes *} |
8 header {* Analogues of the Cartesian Product and Disjoint Sum for Datatypes *} |
9 |
9 |
10 theory Datatype |
10 theory Datatype |
11 imports Nat Relation |
11 imports Nat Product_Type |
12 begin |
12 begin |
13 |
13 |
14 typedef (Node) |
14 typedef (Node) |
15 ('a,'b) node = "{p. EX f x k. p = (f::nat=>'b+nat, x::'a+nat) & f k = Inr 0}" |
15 ('a,'b) node = "{p. EX f x k. p = (f::nat=>'b+nat, x::'a+nat) & f k = Inr 0}" |
16 --{*it is a subtype of @{text "(nat=>'b+nat) * ('a+nat)"}*} |
16 --{*it is a subtype of @{text "(nat=>'b+nat) * ('a+nat)"}*} |
505 |
505 |
506 lemma dsum_Sigma: "(dsum (A <*> B) (C <*> D)) <= (usum A C) <*> (usum B D)" |
506 lemma dsum_Sigma: "(dsum (A <*> B) (C <*> D)) <= (usum A C) <*> (usum B D)" |
507 by blast |
507 by blast |
508 |
508 |
509 lemmas dsum_subset_Sigma = subset_trans [OF dsum_mono dsum_Sigma, standard] |
509 lemmas dsum_subset_Sigma = subset_trans [OF dsum_mono dsum_Sigma, standard] |
510 |
|
511 |
|
512 (*** Domain ***) |
|
513 |
|
514 lemma Domain_dprod [simp]: "Domain (dprod r s) = uprod (Domain r) (Domain s)" |
|
515 by auto |
|
516 |
|
517 lemma Domain_dsum [simp]: "Domain (dsum r s) = usum (Domain r) (Domain s)" |
|
518 by auto |
|
519 |
510 |
520 |
511 |
521 text {* hides popular names *} |
512 text {* hides popular names *} |
522 hide (open) type node item |
513 hide (open) type node item |
523 hide (open) const Push Node Atom Leaf Numb Lim Split Case |
514 hide (open) const Push Node Atom Leaf Numb Lim Split Case |