src/sml/IsacKnowledge/InsSort.sml
author agriesma
Thu, 17 Apr 2003 18:01:03 +0200
branchgriesmayer
changeset 318 a0c068d1e54e
child 701 8c061a9c46ab
permissions -rw-r--r--
neues cvs-verzeichnis
     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   } : meth'),
    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   } : meth')
    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} : meth'),
   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 ----------------------*)