src/Tools/isac/ProgLang/ListC.thy
author Walther Neuper <wneuper@ist.tugraz.at>
Fri, 02 Mar 2018 16:19:02 +0100
changeset 59390 f6374c995ac5
parent 59389 627d25067f2f
child 59393 4274a44ec183
permissions -rw-r--r--
TermC: clean signature, partially
     1 (* Title:  functions on lists for Programs
     2    Author: Walther Neuper 0108
     3    (c) due to copyright terms
     4 *)
     5 
     6 theory ListC 
     7 imports "~~/src/Tools/isac/KEStore"
     8 begin
     9 
    10 ML_file "~~/src/Tools/isac/ProgLang/termC.sml"
    11 ML_file "~~/src/Tools/isac/ProgLang/calculate.sml"
    12 ML_file "~~/src/Tools/isac/ProgLang/rewrite.sml"
    13 ML {*
    14 *} ML {*
    15 HOLogic.realT;
    16 HOLogic.boolT;
    17 *} ML {*
    18 *} ML {*
    19 *} ML {*
    20 *} ML {*
    21 *} 
    22 
    23 subsection {* Notes on Isac's programming language *}
    24 text {*
    25   Isac's programming language combines tacticals (TRY, etc) and 
    26   tactics (Rewrite, etc) with list processing.
    27 
    28   In order to distinguish list expressions of the meta (programming)
    29   language from the object language in Lucas-Interpretation, a 
    30   new 'type xlist' is introduced.
    31   TODO: Switch the role of 'xlist' and 'list' (the former only used
    32   by InsSort.thy)
    33 
    34   Isac's programming language preceeded the function package
    35   in 2002. For naming "axiomatization" is used for reasons of uniformity
    36   with the other replacements for "axioms".
    37   Another reminiscence from Isabelle2002 are Isac-specific numerals,
    38   introduced in order to have floating point numerals at a time, 
    39   when Isabelle did not consider that requirement. For the sake of uniformity
    40   'nat' from List.thy is replaced by 'real' by 'fun parse',
    41   however, 'fun parseNEW' has started to replace this fix (after finishing
    42   this fix, there will be a 'rename all parseNEW --> parse).
    43 
    44   Note: *one* "axiomatization" over all equations caused strange "'a list list"
    45   types.
    46 *}
    47 
    48 subsection {* Type 'xlist' for Lucas-Interpretation *}
    49 (*TODO: ask for shorter deliminters in xlist *)
    50 datatype 'a xlist =
    51     XNil    ("{|| ||}")
    52   | XCons 'a  "'a xlist"    (infixr "@#" 65)
    53 
    54 syntax
    55   -- {* list Enumeration *}
    56   "_xlist" :: "args => 'a xlist"    ("{|| (_) ||}")
    57 
    58 translations
    59   "{||x, xs||}" == "x@#{||xs||}"
    60   "{||x||}" == "x@#{|| ||}"
    61 
    62 term "{|| ||}"
    63 term "{||1,2,3||}"
    64 
    65 subsection {* Functions for 'xlist' *}
    66 (* TODO: 
    67 (1) revise, if definition of identifiers like LENGTH_NIL are still required.
    68 (2) switch the role of 'xlist' and 'list' in the functions below, in particular for
    69   'foldr', 'foldr_Nil', 'foldr_Cons' and 'xfoldr', 'xfoldr_Nil', 'xfoldr_Cons'.
    70   For transition phase just outcomment InsSort.thy and inssort.sml.
    71 *)
    72 
    73 primrec xfoldr :: "('a \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'a xlist \<Rightarrow> 'b \<Rightarrow> 'b" where
    74 xfoldr_Nil:  "xfoldr f {|| ||} = id" |
    75 xfoldr_Cons: "xfoldr f (x @# xs) = f x \<circ> xfoldr f xs"
    76 
    77 primrec LENGTH   :: "'a list => real"
    78 where
    79 LENGTH_NIL:	"LENGTH [] = 0" |
    80 LENGTH_CONS: "LENGTH (x#xs) = 1 + LENGTH xs"
    81 
    82 consts NTH ::  "[real, 'a list] => 'a"
    83 axiomatization where
    84 NTH_NIL: "NTH 1 (x # xs) = x" and
    85 NTH_CONS: (*NO primrec, fun ..*)"1 < n ==> NTH n (x # xs) = NTH (n + -1) xs"
    86 
    87 axiomatization where
    88 hd_thm:	"hd (x # xs) = x"
    89 
    90 axiomatization where
    91 tl_Nil:	"tl []  = []" and
    92 tl_Cons: "tl (x # xs) = xs"
    93 
    94 axiomatization where
    95 LAST:	"last (x # xs) = (if xs = [] then x else last xs)"
    96 
    97 axiomatization where
    98 butlast_Nil: "butlast []    = []" and
    99 butlast_Cons:	"butlast (x # xs) = (if xs = [] then [] else x # butlast xs)"
   100 
   101 axiomatization where
   102 map_Nil:"map f [] = []" and
   103 map_Cons:	"map f (x # xs) = f x  #  map f xs"
   104 
   105 axiomatization where
   106 rev_Nil: "rev [] = []" and
   107 rev_Cons:	"rev (x # xs) = rev xs @ [x]"
   108 
   109 axiomatization where
   110 filter_Nil:	"filter P [] = []" and
   111 filter_Cons: "filter P (x # xs) = (if P x then x # filter P xs else filter P xs)" 
   112 
   113 axiomatization where
   114 concat_Nil:	"concat [] = []" and
   115 concat_Cons: "concat (x # xs) = x @ concat xs"
   116 
   117 axiomatization where
   118 takeWhile_Nil: "takeWhile P []     = []" and
   119 takeWhile_Cons: "takeWhile P (x # xs) = (if P x then x # takeWhile P xs else [])"
   120 
   121 axiomatization where
   122 dropWhile_Nil: "dropWhile P [] = []" and
   123 dropWhile_Cons: "dropWhile P (x # xs) = (if P x then dropWhile P xs else x#xs)"
   124 
   125 axiomatization where
   126 zip_Nil: "zip xs [] = []" and
   127 zip_Cons:	"zip xs (y # ys) = (case xs of [] => [] | z # zs => (z,y) # zip zs ys)"
   128 
   129 axiomatization where
   130 distinct_Nil:	"distinct []     = True" and
   131 distinct_Cons:	"distinct (x # xs) = (x ~: set xs & distinct xs)"
   132 
   133 axiomatization where
   134 remdups_Nil:	"remdups [] = []" and
   135 remdups_Cons:	"remdups (x#xs) = (if x : set xs then remdups xs else x # remdups xs)" 
   136 
   137 (** Lexicographic orderings on lists ...!!!**)
   138 
   139 ML{* (*the former ListC.ML*)
   140 (** rule set for evaluating listexpr in scripts **)
   141 val list_rls = 
   142   Rls{id = "list_rls", preconds = [], rew_ord = ("dummy_ord", dummy_ord), 
   143     erls = Erls, srls = Erls, calc = [], errpatts = [],
   144     rules = [Thm ("refl", TermC.num_str @{thm refl}),  (*'a<>b -> FALSE' by fun eval_equal*)
   145        Thm ("o_apply", TermC.num_str @{thm o_apply}),
   146 
   147        Thm ("NTH_CONS",TermC.num_str @{thm NTH_CONS}),(*erls for cond. in Atools.ML*)
   148        Thm ("NTH_NIL",TermC.num_str @{thm NTH_NIL}),
   149        Thm ("append_Cons",TermC.num_str @{thm append_Cons}),
   150        Thm ("append_Nil",TermC.num_str @{thm append_Nil}),
   151 (*       Thm ("butlast_Cons",num_str @{thm butlast_Cons}),
   152        Thm ("butlast_Nil",num_str @{thm butlast_Nil}),*)
   153        Thm ("concat_Cons",TermC.num_str @{thm concat_Cons}),
   154        Thm ("concat_Nil",TermC.num_str @{thm concat_Nil}),
   155 (*       Thm ("del_base",num_str @{thm del_base}),
   156        Thm ("del_rec",num_str @{thm del_rec}), *)
   157 
   158        Thm ("distinct_Cons",TermC.num_str @{thm distinct_Cons}),
   159        Thm ("distinct_Nil",TermC.num_str @{thm distinct_Nil}),
   160        Thm ("dropWhile_Cons",TermC.num_str @{thm dropWhile_Cons}),
   161        Thm ("dropWhile_Nil",TermC.num_str @{thm dropWhile_Nil}),
   162        Thm ("filter_Cons",TermC.num_str @{thm filter_Cons}),
   163        Thm ("filter_Nil",TermC.num_str @{thm filter_Nil}),
   164        Thm ("foldr_Cons",TermC.num_str @{thm foldr_Cons}),
   165        Thm ("foldr_Nil",TermC.num_str @{thm foldr_Nil}),
   166        Thm ("hd_thm",TermC.num_str @{thm hd_thm}),
   167        Thm ("LAST",TermC.num_str @{thm LAST}),
   168        Thm ("LENGTH_CONS",TermC.num_str @{thm LENGTH_CONS}),
   169        Thm ("LENGTH_NIL",TermC.num_str @{thm LENGTH_NIL}),
   170 (*       Thm ("list_diff_def",num_str @{thm list_diff_def}),*)
   171        Thm ("map_Cons",TermC.num_str @{thm map_Cons}),
   172        Thm ("map_Nil",TermC.num_str @{thm map_Cons}),
   173 (*       Thm ("mem_Cons",TermC.num_str @{thm mem_Cons}),
   174        Thm ("mem_Nil",TermC.num_str @{thm mem_Nil}), *)
   175 (*       Thm ("null_Cons",TermC.num_str @{thm null_Cons}),
   176        Thm ("null_Nil",TermC.num_str @{thm null_Nil}),*)
   177        Thm ("remdups_Cons",TermC.num_str @{thm remdups_Cons}),
   178        Thm ("remdups_Nil",TermC.num_str @{thm remdups_Nil}),
   179        Thm ("rev_Cons",TermC.num_str @{thm rev_Cons}),
   180        Thm ("rev_Nil",TermC.num_str @{thm rev_Nil}),
   181        Thm ("take_Nil",TermC.num_str @{thm take_Nil}),
   182        Thm ("take_Cons",TermC.num_str @{thm take_Cons}),
   183        Thm ("tl_Cons",TermC.num_str @{thm tl_Cons}),
   184        Thm ("tl_Nil",TermC.num_str @{thm tl_Nil}),
   185        Thm ("zip_Cons",TermC.num_str @{thm zip_Cons}),
   186        Thm ("zip_Nil",TermC.num_str @{thm zip_Nil})],
   187     scr = EmptyScr}:rls;
   188 *}
   189 setup {* KEStore_Elems.add_rlss [("list_rls", (Context.theory_name @{theory}, list_rls))] *}
   190 
   191 end