src/Tools/isac/IsacKnowledge/InsSort.sml
branchisac-update-Isa09-2
changeset 37947 22235e4dbe5f
parent 37906 e2b23ba9df13
equal deleted inserted replaced
37946:a28b5fc129b7 37947:22235e4dbe5f
     1 
       
     2 
       
     3 (*-------------------------from InsSort.thy 8.3.01----------------------*)
       
     4 (*List.thy:
       
     5   foldl       :: [['b,'a] => 'b, 'b, 'a list] => 'b
       
     6 primrec
       
     7   foldl_Nil  "foldl f a [] = a"
       
     8   foldl_Cons "foldl f a (x#xs) = foldl f (f a x) xs"
       
     9 
       
    10 above in sml:
       
    11 fun foldr f [] a = a
       
    12   | foldr f (x::xs) a = foldr f xs (f a x);
       
    13 (*val fold = fn : ('a -> 'b -> 'a) -> 'b list -> 'a -> 'a*)
       
    14 fun ins [] a = [a]
       
    15   | ins (x::xs) a = if x < a then x::(ins xs a) else a::(x::xs);
       
    16 fun sort xs = foldr ins xs [];
       
    17 *)
       
    18 (*-------------------------from InsSort.thy 8.3.01----------------------*)
       
    19 
       
    20 
       
    21 (*-------------------------from InsSort.ML 8.3.01----------------------*)
       
    22 
       
    23 theory' := (!theory') @ [("InsSort.thy",InsSort.thy)];
       
    24 
       
    25 val ins_sort = 
       
    26   Rls{preconds = [], rew_ord = ("tless_true",tless_true),
       
    27       rules = [Thm ("foldr_base",(*num_str*) foldr_base),
       
    28 	       Thm ("foldr_rec",foldr_rec),
       
    29 	       Thm ("ins_base",ins_base),
       
    30 	       Thm ("ins_rec",ins_rec),
       
    31 	       Thm ("sort_def",sort_def),
       
    32 
       
    33 	       Calc ("op <",eval_equ "#less_"),
       
    34 	       Thm ("if_True", if_True),
       
    35 	       Thm ("if_False", if_False)
       
    36 	       ],
       
    37       scr = Script ((term_of o the o (parse thy)) 
       
    38       "empty_script")
       
    39       }:rls;      
       
    40 
       
    41 
       
    42 
       
    43 
       
    44 (* 
       
    45 > get_pbt ["Script.thy","squareroot","univariate","equation"];
       
    46 > get_met ("Script.thy","max_on_interval_by_calculus");
       
    47 *)
       
    48 pbltypes:= (!pbltypes) @ 
       
    49 [
       
    50  prep_pbt InsSort.thy
       
    51  (["InsSort.thy","inssort"]:pblID,
       
    52   [("#Given" ,"unsorted u_"),
       
    53    ("#Find"  ,"sorted s_")
       
    54   ])
       
    55 ];
       
    56 
       
    57 methods:= (!methods) @
       
    58 [
       
    59 (*, -------17.6.00,
       
    60  (("InsSort.thy","inssort"):metID,
       
    61   {ppc = prep_met
       
    62    [("#Given" ,"unsorted u_"),
       
    63     ("#Find"  ,"sorted s_")
       
    64     ],
       
    65    rew_ord'="tless_true",rls'="eval_rls",asm_rls=[],asm_thm=[],
       
    66    scr=Script (((inst_abs (assoc_thm "InsSort.thy")) 
       
    67               o term_of o the o (parse thy))    (*for [#1,#3,#2] only*)
       
    68       "Script Ins_sort (u_::'a list) =          \
       
    69        \ (let u_ = Rewrite sort_def   False u_; \
       
    70        \      u_ = Rewrite foldr_rec  False u_; \
       
    71        \      u_ = Rewrite ins_base   False u_; \
       
    72        \      u_ = Rewrite foldr_rec  False u_; \
       
    73        \      u_ = Rewrite ins_rec    False u_; \
       
    74        \      u_ = Calculate le u_;             \
       
    75        \      u_ = Rewrite if_True    False u_; \
       
    76        \      u_ = Rewrite ins_base   False u_; \
       
    77        \      u_ = Rewrite foldr_rec  False u_; \
       
    78        \      u_ = Rewrite ins_rec    False u_; \
       
    79        \      u_ = Calculate le u_;             \
       
    80        \      u_ = Rewrite if_True    False u_; \
       
    81        \      u_ = Rewrite ins_rec    False u_; \
       
    82        \      u_ = Calculate le u_;             \
       
    83        \      u_ = Rewrite if_False   False u_; \
       
    84        \      u_ = Rewrite foldr_base False u_  \
       
    85        \  in u_)")
       
    86   } : met),
       
    87 
       
    88  (("InsSort.thy","sort"):metID,
       
    89   {ppc = prep_met
       
    90    [("#Given" ,"unsorted u_"),
       
    91     ("#Find"  ,"sorted s_")
       
    92     ],
       
    93    rew_ord'="tless_true",rls'="eval_rls",asm_rls=[],asm_thm=[],
       
    94    scr=Script ((inst_abs o term_of o the o (parse thy))
       
    95 	       "Script Sort (u_::'a list) =   \
       
    96 		\ Rewrite_Set ins_sort False u_")
       
    97   } : met)
       
    98 ------- *)
       
    99 (*,
       
   100   
       
   101  (("",""):metID,
       
   102   {ppc = prep_met
       
   103    [("#Given" ,""),
       
   104     ("#Find"  ,""),
       
   105     ("#Relate","")
       
   106     ],
       
   107    rew_ord'="tless_true",rls'="eval_rls",asm_rls=[],asm_thm=[],
       
   108    scr=EmptyScr} : met),
       
   109 *)
       
   110 ];
       
   111 (*-------------------------from InsSort.ML 8.3.01----------------------*)
       
   112 
       
   113 
       
   114 (*------------------------- nipkow ----------------------*)
       
   115 consts
       
   116   sort    :: 'a list => 'a list
       
   117   ins     :: ['a,'a list] => 'a list
       
   118 (*foldl   :: [['a,'b] => 'a, 'a, 'b list] => 'a 
       
   119 *)
       
   120 rules
       
   121   ins_base  "ins e [] = [e]"
       
   122   ins_rec   "ins e (l#ls) = (if l < e then l#(ins e ls) else e#(l#ls))"  
       
   123 
       
   124 rules
       
   125   sort_def  "sort ls = (foldl ins ls [])"
       
   126 end
       
   127 
       
   128 
       
   129 (** swp: ..L **)
       
   130 (* fn : ('a * 'b -> 'b) -> 'a list -> 'b -> 'b *)
       
   131 fun foldL f [] e = e
       
   132   | foldL f (l::ls) e = f(l,foldL f ls e);
       
   133 
       
   134 (* fn : int * int list -> int list *)
       
   135 fun insL (e,[]) = [e]
       
   136   | insL (e,l::ls) = if l < e then l::(insL(e,ls)) else e::(l::ls);
       
   137 
       
   138 fun sortL ls = foldL insL ls [];
       
   139 
       
   140 sortL [2,3,1]; (* [1,2,3] *)
       
   141 
       
   142 
       
   143 (** swp, curried: ..LC **)
       
   144 (* fn : ('a * 'b -> 'b) -> 'a list -> 'b -> 'b *)
       
   145 fun foldLC f [] e = e
       
   146   | foldLC f (x::xs) e = f x (foldLC f xs e);
       
   147 
       
   148 (* fn : int * int list -> int list *)
       
   149 fun insLC e [] = [e]
       
   150   | insLC e (l::ls) = if l < e then l::(insLC e ls) else e::(l::ls);
       
   151 
       
   152 fun sortLC ls = foldLC insLC ls [];
       
   153 
       
   154 sortLC [2,3,1]; (* [1,2,3] *)
       
   155 
       
   156 
       
   157 (** sml110: ..l **)
       
   158 (* fn : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b *)
       
   159 foldl;
       
   160 (* fn : ('a * 'a -> 'a) -> 'a * 'b list -> 'a :  ANDERS !!! 
       
   161 fun foldl f e [] = e
       
   162   | foldl f e (l::ls) = f e (foldl f (e,ls));     0+...+0+0
       
   163 
       
   164 foldl op+ (0,[100,11,1]);  
       
   165 val it = 0 : int                         ... GEHT NICHT !!! *)
       
   166 
       
   167 fun insl (e,[]) = [e]
       
   168   | insl (e,l::ls) = if l < e then l::(insl(e,ls)) else e::(l::ls);
       
   169 
       
   170 fun sortl ls = foldl insl [] ls;
       
   171 
       
   172 sortl [2,3,1]; (* [1,2,3] *)
       
   173 
       
   174 
       
   175 (** sml110, curried: ..lC **)
       
   176 (* fn : ('a -> 'a -> 'a) -> 'a -> 'b list -> 'a *)
       
   177 fun foldlC f e [] = e
       
   178   | foldlC f e (l::ls) = f e (foldlC f e ls);
       
   179 
       
   180 (* fn : int -> int list -> int list *)
       
   181 fun inslC e [] = [e]
       
   182   | inslC e (l::ls) = if l < e then l::(inslC e ls) else e::(l::ls);
       
   183 
       
   184 fun sortlC ls = foldlC inslC [] ls;
       
   185 
       
   186 sortlC [2,3,1];
       
   187 
       
   188 (*--- 15.6.00 ---*)
       
   189 
       
   190 
       
   191 fun Foldl f a [] = a
       
   192   | Foldl f a (x::xs) = Foldl f (f a x) xs;
       
   193 (*val Foldl = fn : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a*)
       
   194 
       
   195 fun add a b = a+b:int;
       
   196 
       
   197 Foldl add 0 [1,2,3];
       
   198 
       
   199 fun ins0 a [] = [a]
       
   200   | ins0 a (x::xs) = if x < a then x::(ins0 a xs) else a::(x::xs);
       
   201 (*val ins = fn : int -> int list -> int list*)
       
   202 
       
   203 fun ins [] a = [a]
       
   204   | ins (x::xs) a = if x < a then x::(ins xs a) else a::(x::xs);
       
   205 (*val ins = fn : int -> int list -> int list*)
       
   206 
       
   207 ins 3 [1,2,4];
       
   208 
       
   209 fun sort xs = Foldl ins0 xs [];
       
   210 (*operator domain: int -> int list -> int
       
   211   operand:         int -> int list -> int list
       
   212   in expression:
       
   213     Foldl ins    
       
   214                             *)
       
   215 fun sort xs = Foldl ins xs [];
       
   216 
       
   217 
       
   218 
       
   219 (*--- 17.6.00 ---*)
       
   220 
       
   221 
       
   222 fun foldr f [] a = a
       
   223   | foldr f (x::xs) a = foldr f xs (f a x);
       
   224 (*val fold = fn : ('a -> 'b -> 'a) -> 'b list -> 'a -> 'a*)
       
   225 
       
   226 fun add a b = a+b:int;
       
   227 
       
   228 fold add [1,2,3] 0;
       
   229 
       
   230 fun ins [] a = [a]
       
   231   | ins (x::xs) a = if x < a then x::(ins xs a) else a::(x::xs);
       
   232 (*val ins = fn : int list -> int -> int list*)
       
   233 
       
   234 ins [1,2,4] 3;
       
   235 
       
   236 fun sort xs = foldr ins xs [];
       
   237 
       
   238 sort [3,1,4,2];
       
   239 
       
   240 
       
   241 
       
   242 (*--- 17.6.00 II ---*)
       
   243 
       
   244 fun foldl f a [] = a
       
   245   | foldl f a (x::xs) = foldl f (f a x) xs;
       
   246 
       
   247 fun ins [] a = [a]
       
   248   | ins (x::xs) a = if x < a then x::(ins xs a) else a::(x::xs);
       
   249 
       
   250 fun sort xs = foldl ins xs [];
       
   251 
       
   252 sort [3,1,4,2];
       
   253 (*val it = [3,1,4,2] : int list !?!?!?!?!?!?!?!?!?!?!?!?!?!?!?*)
       
   254 
       
   255 (*------------------------- nipkow ----------------------*)
       
   256 consts
       
   257   sort    :: 'a list => 'a list
       
   258   ins     :: ['a,'a list] => 'a list
       
   259 (*foldl   :: [['a,'b] => 'a, 'a, 'b list] => 'a 
       
   260 *)
       
   261 rules
       
   262   ins_base  "ins e [] = [e]"
       
   263   ins_rec   "ins e (l#ls) = (if l < e then l#(ins e ls) else e#(l#ls))"  
       
   264 
       
   265 rules
       
   266   sort_def  "sort ls = (foldl ins ls [])"
       
   267 end
       
   268 
       
   269 
       
   270 (** swp: ..L **)
       
   271 (* fn : ('a * 'b -> 'b) -> 'a list -> 'b -> 'b *)
       
   272 fun foldL f [] e = e
       
   273   | foldL f (l::ls) e = f(l,foldL f ls e);
       
   274 
       
   275 (* fn : int * int list -> int list *)
       
   276 fun insL (e,[]) = [e]
       
   277   | insL (e,l::ls) = if l < e then l::(insL(e,ls)) else e::(l::ls);
       
   278 
       
   279 fun sortL ls = foldL insL ls [];
       
   280 
       
   281 sortL [2,3,1]; (* [1,2,3] *)
       
   282 
       
   283 
       
   284 (** swp, curried: ..LC **)
       
   285 (* fn : ('a * 'b -> 'b) -> 'a list -> 'b -> 'b *)
       
   286 fun foldLC f [] e = e
       
   287   | foldLC f (x::xs) e = f x (foldLC f xs e);
       
   288 
       
   289 (* fn : int * int list -> int list *)
       
   290 fun insLC e [] = [e]
       
   291   | insLC e (l::ls) = if l < e then l::(insLC e ls) else e::(l::ls);
       
   292 
       
   293 fun sortLC ls = foldLC insLC ls [];
       
   294 
       
   295 sortLC [2,3,1]; (* [1,2,3] *)
       
   296 
       
   297 
       
   298 (** sml110: ..l **)
       
   299 (* fn : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b *)
       
   300 foldl;
       
   301 (* fn : ('a * 'a -> 'a) -> 'a * 'b list -> 'a :  ANDERS !!! 
       
   302 fun foldl f e [] = e
       
   303   | foldl f e (l::ls) = f e (foldl f (e,ls));     0+...+0+0
       
   304 
       
   305 foldl op+ (0,[100,11,1]);  
       
   306 val it = 0 : int                         ... GEHT NICHT !!! *)
       
   307 
       
   308 fun insl (e,[]) = [e]
       
   309   | insl (e,l::ls) = if l < e then l::(insl(e,ls)) else e::(l::ls);
       
   310 
       
   311 fun sortl ls = foldl insl [] ls;
       
   312 
       
   313 sortl [2,3,1]; (* [1,2,3] *)
       
   314 
       
   315 
       
   316 (** sml110, curried: ..lC **)
       
   317 (* fn : ('a -> 'a -> 'a) -> 'a -> 'b list -> 'a *)
       
   318 fun foldlC f e [] = e
       
   319   | foldlC f e (l::ls) = f e (foldlC f e ls);
       
   320 
       
   321 (* fn : int -> int list -> int list *)
       
   322 fun inslC e [] = [e]
       
   323   | inslC e (l::ls) = if l < e then l::(inslC e ls) else e::(l::ls);
       
   324 
       
   325 fun sortlC ls = foldlC inslC [] ls;
       
   326 
       
   327 sortlC [2,3,1];
       
   328 
       
   329 (*--- 15.6.00 ---*)
       
   330 
       
   331 
       
   332 fun Foldl f a [] = a
       
   333   | Foldl f a (x::xs) = Foldl f (f a x) xs;
       
   334 (*val Foldl = fn : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a*)
       
   335 
       
   336 fun add a b = a+b:int;
       
   337 
       
   338 Foldl add 0 [1,2,3];
       
   339 
       
   340 fun ins0 a [] = [a]
       
   341   | ins0 a (x::xs) = if x < a then x::(ins0 a xs) else a::(x::xs);
       
   342 (*val ins = fn : int -> int list -> int list*)
       
   343 
       
   344 fun ins [] a = [a]
       
   345   | ins (x::xs) a = if x < a then x::(ins xs a) else a::(x::xs);
       
   346 (*val ins = fn : int -> int list -> int list*)
       
   347 
       
   348 ins 3 [1,2,4];
       
   349 
       
   350 fun sort xs = Foldl ins0 xs [];
       
   351 (*operator domain: int -> int list -> int
       
   352   operand:         int -> int list -> int list
       
   353   in expression:
       
   354     Foldl ins    
       
   355                             *)
       
   356 fun sort xs = Foldl ins xs [];
       
   357 
       
   358 
       
   359 
       
   360 (*--- 17.6.00 ---*)
       
   361 
       
   362 
       
   363 fun foldr f [] a = a
       
   364   | foldr f (x::xs) a = foldr f xs (f a x);
       
   365 (*val fold = fn : ('a -> 'b -> 'a) -> 'b list -> 'a -> 'a*)
       
   366 
       
   367 fun add a b = a+b:int;
       
   368 
       
   369 fold add [1,2,3] 0;
       
   370 
       
   371 fun ins [] a = [a]
       
   372   | ins (x::xs) a = if x < a then x::(ins xs a) else a::(x::xs);
       
   373 (*val ins = fn : int list -> int -> int list*)
       
   374 
       
   375 ins [1,2,4] 3;
       
   376 
       
   377 fun sort xs = foldr ins xs [];
       
   378 
       
   379 sort [3,1,4,2];
       
   380 
       
   381 
       
   382 
       
   383 (*--- 17.6.00 II ---*)
       
   384 
       
   385 fun foldl f a [] = a
       
   386   | foldl f a (x::xs) = foldl f (f a x) xs;
       
   387 
       
   388 fun ins [] a = [a]
       
   389   | ins (x::xs) a = if x < a then x::(ins xs a) else a::(x::xs);
       
   390 
       
   391 fun sort xs = foldl ins xs [];
       
   392 
       
   393 sort [3,1,4,2];
       
   394 (*val it = [3,1,4,2] : int list !?!?!?!?!?!?!?!?!?!?!?!?!?!?!?*)
       
   395 (*------------------------- nipkow ----------------------*)