Added the new theory Map.
authornipkow
Fri, 24 Oct 1997 10:31:31 +0200
changeset 3981 b4f93a8da835
parent 3980 21ef91734970
child 3982 2a903ba8d39e
Added the new theory Map.
src/HOL/IsaMakefile
src/HOL/Map.ML
src/HOL/Map.thy
src/HOL/ROOT.ML
--- a/src/HOL/IsaMakefile	Thu Oct 23 12:49:16 1997 +0200
+++ b/src/HOL/IsaMakefile	Fri Oct 24 10:31:31 1997 +0200
@@ -10,7 +10,7 @@
 
 NAMES = HOL Ord Set Fun subset equalities Prod Relation Trancl Sum WF WF_Rel \
 	mono Lfp Gfp NatDef Nat intr_elim indrule Inductive Finite Arith \
-	Divides Power Sexp Univ List RelPow Option
+	Divides Power Sexp Univ List RelPow Option Map
 
 PROVERS = hypsubst.ML classical.ML blast.ML \
 	simplifier.ML splitter.ML nat_transitive.ML 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Map.ML	Fri Oct 24 10:31:31 1997 +0200
@@ -0,0 +1,78 @@
+(*  Title:      HOL/Map.ML
+    ID:         $Id$
+    Author:     Tobias Nipkow
+    Copyright   1997 TU Muenchen
+
+Map lemmas
+*)
+
+goalw thy [empty_def] "empty k = None";
+by(Simp_tac 1);
+qed "empty_def2";
+Addsimps [empty_def2];
+
+goalw thy [update_def] "(m[a|->b])x = (if x=a then Some b else m x)";
+by(Simp_tac 1);
+qed "update_def2";
+Addsimps [update_def2];
+
+section "++";
+
+goalw thy [override_def] "m ++ empty = m";
+by(Simp_tac 1);
+qed "override_empty";
+Addsimps [override_empty];
+
+goalw thy [override_def] "empty ++ m = m";
+by(Simp_tac 1);
+br ext 1;
+by(split_tac [expand_option_case] 1);
+by(Simp_tac 1);
+qed "empty_override";
+Addsimps [empty_override];
+
+goalw thy [override_def]
+ "((m ++ n) k = Some x) = (n k = Some x | n k = None & m k = Some x)";
+by(simp_tac (!simpset addsplits [expand_option_case]) 1);
+qed_spec_mp "override_Some_iff";
+
+bind_thm("override_SomeD", standard(override_Some_iff RS iffD1));
+
+goalw thy [override_def]
+ "((m ++ n) k = None) = (n k = None & m k = None)";
+by(simp_tac (!simpset addsplits [expand_option_case]) 1);
+qed "override_None";
+AddIffs [override_None];
+
+goalw thy [override_def] "map_of(xs@ys) = map_of ys ++ map_of xs";
+by(induct_tac "xs" 1);
+by(Simp_tac 1);
+br ext 1;
+by(asm_simp_tac (!simpset addsplits [expand_if,expand_option_case]) 1);
+qed "map_of_append";
+Addsimps [map_of_append];
+
+section "dom";
+
+goalw thy [dom_def] "dom empty = {}";
+by(Simp_tac 1);
+qed "dom_empty";
+Addsimps [dom_empty];
+
+goalw thy [dom_def] "dom(m[a|->b]) = insert a (dom m)";
+by(simp_tac (!simpset addsplits [expand_if]) 1);
+by(Blast_tac 1);
+qed "dom_update";
+Addsimps [dom_update];
+
+goalw thy [dom_def] "dom(m++n) = dom n Un dom m";
+by(Blast_tac 1);
+qed "dom_override";
+Addsimps [dom_override];
+
+section "ran";
+
+goalw thy [ran_def] "ran empty = {}";
+by(Simp_tac 1);
+qed "ran_empty";
+Addsimps [ran_empty];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Map.thy	Fri Oct 24 10:31:31 1997 +0200
@@ -0,0 +1,44 @@
+(*  Title:      HOL/Map.thy
+    ID:         $Id$
+    Author:     Tobias Nipkow, based on a theory by David von Oheimb
+    Copyright   1997 TU Muenchen
+
+The datatype of `maps' (written ~=>); strongly resembles maps in VDM.
+*)
+
+Map = List + Option +
+
+types ('a,'b) "~=>" = 'a => 'b option (infixr 0)
+
+consts
+empty   :: "'a ~=> 'b"
+update  :: "('a ~=> 'b) => 'a => 'b => ('a ~=> 'b)"
+           ("_/[_/|->/_]" [900,0,0] 900)
+override:: "('a ~=> 'b) => ('a ~=> 'b) => ('a ~=> 'b)" (infixl "++" 100)
+dom     :: "('a ~=> 'b) => 'a set"
+ran     :: "('a ~=> 'b) => 'b set"
+map_of  :: "('a * 'b)list => 'a ~=> 'b"
+
+syntax (symbols)
+  "~=>"     :: [type, type] => type
+               (infixr "\\<leadsto>" 0)
+  update    :: "('a ~=> 'b) => 'a => 'b => ('a ~=> 'b)"
+               ("_/[_/\\<mapsto>/_]" [900,0,0] 900)
+  override  :: "('a ~=> 'b) => ('a ~=> 'b) => ('a ~=> 'b)"
+               (infixl "\\<oplus>" 100)
+
+defs
+empty_def "empty == %x. None"
+
+update_def "m[a|->b] == %x. if x=a then Some b else m x"
+
+override_def "m1++m2 == %x. case m2 x of None => m1 x | Some y => Some y"
+
+dom_def "dom(m) == {a. m a ~= None}"
+ran_def "ran(m) == {b. ? a. m a = Some b}"
+
+primrec map_of list
+"map_of [] = empty"
+"map_of (p#ps) = (map_of ps)[fst p |-> snd p]"
+
+end
--- a/src/HOL/ROOT.ML	Thu Oct 23 12:49:16 1997 +0200
+++ b/src/HOL/ROOT.ML	Fri Oct 24 10:31:31 1997 +0200
@@ -43,9 +43,9 @@
 use_thy "RelPow";
 use_thy "Finite";
 use_thy "Sexp";
-use_thy "Option";
 use_thy "WF_Rel";
 use_thy "List";
+use_thy "Map";
 
 (*TFL: recursive function definitions*)
 cd "../TFL";