src/Tools/isac/Knowledge/InsSort.sml
author Walther Neuper <neuper@ist.tugraz.at>
Wed, 25 Aug 2010 16:20:07 +0200
branchisac-update-Isa09-2
changeset 37947 22235e4dbe5f
parent 37906 src/Tools/isac/IsacKnowledge/InsSort.sml@e2b23ba9df13
child 37991 028442673981
permissions -rw-r--r--
renamed isac's directories and Build_Isac.thy

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