src/Tools/isac/ProgLang/ListC.thy
author Walther Neuper <wneuper@ist.tugraz.at>
Tue, 18 Oct 2016 12:05:03 +0200
changeset 59252 7d3dbc1171ff
parent 59244 6870ee668115
child 59389 627d25067f2f
permissions -rw-r--r--
back-track after desing error in previous changeset

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