Datatype.ML
author clasohm
Sun, 24 Apr 1994 11:27:38 +0200
changeset 70 9459592608e2
parent 60 43e36c15a831
child 80 d3d727449d7b
permissions -rw-r--r--
renamed theory files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
     1
(*  Title:       Datentypdeklarationen mit Isabelle
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
     2
    Author:      Max Breitling
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
     3
    Copyright    1994 TU Muenchen
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
     4
*)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
     5
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
     6
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
     7
signature DATATYPE =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
     8
sig
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
     9
   val thy : theory
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    10
   val induct : thm
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    11
   val inject : thm list
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    12
   val ineq : thm list 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    13
   val cases : thm list
60
43e36c15a831 new field "simps" added
nipkow
parents: 53
diff changeset
    14
   val simps : thm list
53
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    15
   val induct_tac : string -> int -> tactic
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    16
end;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    17
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    18
signature DATATYPEDEF =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    19
sig
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    20
   val base : theory
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    21
   val data : string
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    22
   val declare_consts : bool
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    23
end;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    24
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    25
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    26
functor DatatypeFUN(Input: DATATYPEDEF)  : DATATYPE =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    27
struct
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    28
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    29
structure Keyword =                  
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    30
 struct
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    31
 val alphas = []
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    32
 val symbols = ["(",")",",","|","="]
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    33
 end;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    34
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    35
val K = 5;    (* Diese Schranke enscheidet zwischen den beiden
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    36
                 Ci_neg-Axiomen-Schemata *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    37
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    38
structure Lex = LexicalFUN (Keyword);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    39
structure Parse = ParseFUN(Lex);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    40
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    41
datatype Typ = Var of string |
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    42
               Id  of string |
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    43
               Comp of Typ list * string |
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    44
               Rek of Typ list * string;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    45
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    46
type InternalRep = (Typ list * string) * (string * Typ list) list; 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    47
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    48
exception Impossible;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    49
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    50
open Parse;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    51
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    52
fun list_of1 ph = ph -- repeat("," $$-- ph) >> (op::);       (* Redefinition *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    53
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    54
(* ---------------------------------------------------------------------- *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    55
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    56
val type_var =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    57
                 typevar >> Var;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    58
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    59
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    60
val type_var_list =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    61
                    type_var >> (fn s => s::nil)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    62
                   ||
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    63
                    "(" $$-- list_of1 (type_var) --$$ ")" ;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    64
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    65
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    66
val typ =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    67
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    68
   id                        >> Id
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    69
  ||
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    70
   type_var_list -- id       >> Comp
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    71
  ||
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    72
   type_var;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    73
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    74
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    75
val typ_list =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    76
                              (*
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    77
                                 typ     >> (fn t => t::nil)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    78
                                           output (std_out, ||  *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    79
   "(" $$-- list_of1(typ) --$$ ")"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    80
  ||
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    81
   empty;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    82
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    83
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    84
val cons =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    85
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    86
    ( stg
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    87
     ||
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    88
      id )
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    89
    -- typ_list;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    90
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    91
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    92
fun constructs toks =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    93
(
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    94
   cons --$$ "|" -- constructs   >> op::
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    95
  ||
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    96
   cons                          >> (fn c => c::nil)    
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    97
) toks;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    98
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
    99
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   100
val type_def =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   101
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   102
   (type_var_list || empty) -- id --$$ "=" -- constructs;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   103
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   104
(* ---------------------------------------------------------------------
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   105
   Pretty-Printer fuer Typlisten
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   106
   Variante 1 hat runde Klammern, Variante2 hat ganz aussen eckige Klammern 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   107
*)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   108
fun pp_typ (Var s) = s
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   109
  | pp_typ (Id s) =s
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   110
  | pp_typ (Comp (typvars,id)) = (pp_typlist1 typvars) ^ id
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   111
  | pp_typ (Rek  (typvars,id)) = (pp_typlist1 typvars) ^ id
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   112
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   113
and 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   114
    pp_typlist' (typ::typ2::ts) = (pp_typ typ) ^ "," ^ (pp_typlist' (typ2::ts))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   115
  | pp_typlist' (typ::nil) = pp_typ typ
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   116
  | pp_typlist' [] = raise Impossible
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   117
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   118
and
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   119
    pp_typlist1 (typ::ts) = "(" ^ (pp_typlist' (typ::ts)) ^ ")"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   120
  | pp_typlist1 [] = ""
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   121
;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   122
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   123
fun pp_typlist2 (typ::ts) = "[" ^ pp_typlist' (typ::ts) ^ "]"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   124
  | pp_typlist2 [] = ""
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   125
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   126
(* ----------------------------------------------------------------------- *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   127
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   128
(* Ueberprueft, ob die Konstruktoren paarweise verschieden sind *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   129
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   130
fun check_cons cs =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   131
  (case findrep (map fst cs) of
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   132
     [] => true
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   133
   | c::_ => error("Constructor \"" ^ c ^ "\" occurs twice"));
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   134
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   135
(* ------------------------------------------------------------------------ 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   136
Diese Funktion ueberprueft, ob alle Typvariablen nichtfrei sind und wandelt
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   137
erkannte rekursive Bezuege in den "Rek"-Konstruktor um *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   138
 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   139
fun analyseOne ((typevars,id), (Var v)::typlist) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   140
     if ((Var v) mem typevars) then (Var v)::analyseOne((typevars,id),typlist)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   141
                               else error("Variable "^v^" is free.")
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   142
  | analyseOne ((typevars,id), (Id s)::typlist) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   143
     if id<>s then (Id s)::analyseOne((typevars,id),typlist)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   144
              else if typevars=[] then Rek([],id)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   145
                                         ::analyseOne((typevars,id),typlist)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   146
                                  else error(s^" used in different ways")
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   147
  | analyseOne ((typevars,id),(Comp(typl,s))::typlist) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   148
     if id<>s then Comp(analyseOne((typevars,id),typl),s)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   149
                                      ::analyseOne((typevars,id),typlist)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   150
              else if typevars=typl then
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   151
                             Rek(typl,s)::analyseOne((typevars,id),typlist)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   152
                                    else 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   153
                             error(s ^ " used in different ways")
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   154
  | analyseOne (_,[]) = []
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   155
  | analyseOne (_,(Rek _)::_) = raise Impossible;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   156
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   157
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   158
fun analyse (deftyp,(cons,typlist) :: cs) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   159
                        (cons, analyseOne(deftyp,typlist))::analyse(deftyp,cs)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   160
  | analyse (_,[])=[];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   161
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   162
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   163
(* ------------------------------------------------------------------------ *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   164
(* testet, ob nicht nur rekusive Elemente in den Typen vorkommen, also ob
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   165
   der definierte Typ nichtleer ist                                         *) 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   166
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   167
val contains_no_rek = forall (fn Rek _ => false | _ => true);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   168
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   169
fun one_not_rek cs = exists (contains_no_rek o snd) cs orelse
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   170
                     error("Empty type not allowed!");
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   171
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   172
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   173
(* ------------------------------------------------------------------------ *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   174
(* Hilfsfunktionen *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   175
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   176
(* gibt 'var_n' bis 'var_m' aus, getrennt durch 'delim'                   *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   177
fun Args(var,delim,n,m) = if n=m then var ^ string_of_int(n) 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   178
                          else var ^ string_of_int(n) ^delim^ Args(var,delim,n+1,m);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   179
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   180
(* gibt    'name_1', ... , 'name_n' zurueck   *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   181
fun C_exp(name,n,var) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   182
  if n>0 then name ^ "(" ^ Args(var,",",1,n) ^ ")"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   183
         else name;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   184
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   185
(* gibt 'x_n = y_n, ... , x_m = y_m' zurueck *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   186
fun Arg_eql(n,m) = 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   187
  if n=m
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   188
  then "x" ^ string_of_int(n) ^ "=y" ^ string_of_int(n) 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   189
  else "x" ^ string_of_int(n) ^ "=y" ^ string_of_int(n) ^ " & " ^ Arg_eql(n+1,m);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   190
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   191
(* --------------------------------------------------------------------- *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   192
(* Ausgabe der Typdeklarationen fuer die einzelnen Konstruktoren *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   193
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   194
fun const_types ((typevars,id),((c,typlist)::cs)) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   195
     ([c],  
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   196
         (if typlist =[] then "" else pp_typlist2(typlist) ^ " => ") ^
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   197
         pp_typlist1(typevars) ^ id
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   198
     )
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   199
     :: const_types ((typevars,id),cs)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   200
  | const_types (_,[]) = [];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   201
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   202
(* --------------------------------------------------------------------- *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   203
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   204
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   205
fun Ci_ing (c :: cs) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   206
  let val (name,typlist) = c
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   207
      val arity = length typlist
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   208
      in  
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   209
        if arity>0 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   210
        then ("inject_" ^ name,
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   211
             "(" ^ C_exp(name,arity,"x") ^ "=" ^ C_exp(name,arity,"y") ^ ") = ("
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   212
             ^ Arg_eql(1,arity) ^ ")") :: (Ci_ing cs)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   213
           
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   214
        else (Ci_ing cs)      
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   215
     end
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   216
  | Ci_ing [] = [];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   217
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   218
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   219
(* ----------------------------------------------------------------------- *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   220
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   221
fun Ci_negOne (c::nil) = []
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   222
  | Ci_negOne (c::c1::cs) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   223
       let val (name1,tl1) = c
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   224
           val (name2,tl2) = c1
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   225
           val arit1 = length tl1
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   226
           val arit2 = length tl2
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   227
           val h = "(" ^ C_exp(name1,arit1,"x") ^ "~=" ^
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   228
                         C_exp(name2,arit2,"y") ^ ")"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   229
        in ("ineq_"^name1^"_"^name2,h):: (Ci_negOne (c::cs))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   230
        end
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   231
  | Ci_negOne [] = [];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   232
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   233
fun Ci_neg1 (c1::c2::nil) = Ci_negOne(c1::c2::nil)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   234
  | Ci_neg1 (c1::c2::cs) = Ci_negOne(c1::c2::cs) @ Ci_neg1(c2::cs)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   235
  | Ci_neg1 _ = [];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   236
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   237
fun suc_expr n = if n=0 then "0"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   238
                        else "Suc(" ^ suc_expr(n-1) ^ ")";
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   239
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   240
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   241
fun Ci_neg2equals (ord_t,((c,typlist)::cs), n) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   242
    let val h = ord_t ^ "(" ^ (C_exp(c,length typlist,"x")) ^ ") = " ^
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   243
                (suc_expr n)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   244
    in 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   245
       (ord_t^(string_of_int(n+1)),h) :: (Ci_neg2equals (ord_t, cs ,n+1))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   246
    end
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   247
  | Ci_neg2equals (_, [], _) = [];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   248
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   249
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   250
fun Ci_neg2 ((typlist,id),conslist) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   251
    let val ord_t = id ^ "_ord"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   252
        in 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   253
           (Ci_neg2equals (ord_t, conslist, 0)) @
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   254
           [(ord_t^"0",
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   255
             "(" ^ ord_t ^ "(x) ~= " ^ ord_t ^ "(y)) ==> (x ~= y)")]
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   256
        end;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   257
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   258
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   259
(* --------------------------------------------------------------------- *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   260
(* Die Funktionen fuer das Induktionsaxiom, mit komplizierer Vergabestrategie
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   261
   fuer die Variablennamen *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   262
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   263
(* fuegt einen Typ mit dem vorgeschlagenen Namen varname in die Tabelle ein *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   264
fun insert typ varname ((t,s,n)::xs) = 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   265
    if typ=t then (t,s,n+1)::xs
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   266
             else if varname=s then (t,s,n)::(insert typ (varname^"'") xs)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   267
                               else (t,s,n)::(insert typ varname xs)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   268
  | insert typ varname [] = [(typ,varname,1)];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   269
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   270
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   271
fun insert_types ((Rek(l,id))::ts) tab =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   272
          insert_types ts (insert (Rek(l,id)) id tab)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   273
  | insert_types ((Var s)::ts)     tab =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   274
          insert_types ts (insert (Var s) (implode(tl(explode s))) tab)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   275
  | insert_types ((Id s)::ts)      tab =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   276
          insert_types ts (insert (Id s) s tab)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   277
  | insert_types (Comp(l,id)::ts)  tab =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   278
          insert_types ts (insert (Comp(l,id)) id tab)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   279
  | insert_types [] tab = tab;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   280
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   281
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   282
fun update(Rek(_),s,v::vs,(Rek(_))::ts) = s::vs
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   283
  | update(t,     s,v::vs,t1::ts      ) = if t=t1 then s::vs
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   284
                                                  else v::(update(t,s,vs,ts))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   285
  | update(_,_,_,_) = raise Impossible;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   286
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   287
fun update_n(Rek(r1),s,v::vs,(Rek(r2))::ts,n) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   288
          if r1=r2 then (s^(string_of_int n))::(update_n(Rek(r1),s,vs,ts,n+1))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   289
                   else v::(update_n(Rek(r1),s,vs,ts,n))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   290
  | update_n(t,s,v::vs,t1::ts,n) = 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   291
              if t=t1 then (s^(string_of_int n))::(update_n(t,s,vs,ts,n+1))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   292
                      else v::(update_n(t,s,vs,ts,n))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   293
  | update_n(_,_,[],[],_) = []
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   294
  | update_n(_,_,_,_,_) = raise Impossible;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   295
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   296
(* geht durch die Tabelle und traegt die Typvariablen ein *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   297
fun convert ((t,s,n)::ts) var_list typ_list =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   298
    let val h = ( if n=1 then update(t,s,var_list,typ_list)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   299
                         else update_n(t,s,var_list,typ_list,1))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   300
    in convert ts h typ_list
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   301
    end
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   302
  | convert [] var_list _ = var_list;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   303
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   304
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   305
fun empty_list n = replicate n "";
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   306
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   307
fun assumpt (Rek(_)::ts, v::vs ,found) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   308
        let val h = if found then ";P(" ^ v ^ ")"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   309
                             else "[| P(" ^ v ^ ")"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   310
        in h ^ (assumpt (ts, vs, true))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   311
        end
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   312
  | assumpt ((t::ts), v::vs, found) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   313
        assumpt (ts, vs, found)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   314
  | assumpt ([], [], found) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   315
        if found then "|] ==>"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   316
                 else ""
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   317
  | assumpt(_,_,_) = raise Impossible;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   318
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   319
fun t_inducting ((name,typl)::cs) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   320
    let val tab = insert_types typl []
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   321
        val arity = length typl
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   322
        val var_list = convert tab (empty_list arity) typl 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   323
        val h = if arity=0 then " P(" ^ name ^ ")"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   324
                  else " !!" ^ (space_implode " " var_list) ^ "." ^
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   325
                       (assumpt (typl, var_list, false))
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   326
                       ^ "P(" ^ name ^ "(" ^ (space_implode "," var_list) ^ "))"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   327
        val rest = t_inducting cs
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   328
        in if rest="" then h
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   329
                      else h ^ "; " ^ rest
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   330
    end
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   331
  | t_inducting [] = "";
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   332
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   333
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   334
fun t_induct cl typ_name=
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   335
    "[|" ^ (t_inducting cl) ^ "|] ==> P("^typ_name^")";
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   336
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   337
(* -------------------------------------------------------------------- *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   338
(* Die Funktionen fuer die t_case - Funktion                            *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   339
fun case_typlist typevar ((c,typlist)::cs) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   340
   let val h = if (length typlist) > 0 then (pp_typlist2 typlist) ^ "=>"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   341
                                       else ""
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   342
       in "," ^ h ^ typevar ^ (case_typlist typevar cs)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   343
    end
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   344
  | case_typlist _ [] = "";
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   345
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   346
fun case_rules t_case arity n ((id,typlist)::cs) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   347
  let val args = if (length typlist)>0 then "("^Args("x",",",1,length typlist)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   348
                     ^ ")"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   349
                     else ""
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   350
  in (t_case ^ "_" ^ id,
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   351
      t_case ^ "(" ^ id ^ args ^ "," ^ Args("f",",",1,arity) ^ ") = f" ^
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   352
       string_of_int(n) ^ args)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   353
     :: (case_rules t_case arity (n+1) cs)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   354
  end
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   355
  | case_rules _ _ _ [] = [];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   356
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   357
fun create_typevar (Var s) typlist =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   358
    if (Var s) mem typlist then create_typevar (Var (s^"'")) typlist else s
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   359
|  create_typevar _ _ = raise Impossible;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   360
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   361
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   362
fun case_consts ((typlist,id),conslist) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   363
   let val typevar = create_typevar (Var "'beta") typlist
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   364
       val t_case = id ^ "_case"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   365
       val arity = length conslist
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   366
       val dekl = ([t_case],"[" ^ (pp_typlist1 typlist) ^ id ^
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   367
                  (case_typlist typevar conslist) ^ "]=>" ^ typevar)::nil
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   368
       val rules = case_rules t_case arity 1 conslist
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   369
       in (dekl,rules)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   370
   end;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   371
(* ------------------------------------------------------------------------- *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   372
(* Die Funktionen fuer das Erzeugen der Syntax-Umsetzung der case-Regeln     *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   373
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   374
fun calc_xrules c_nr y_nr ((c,typlist)::cs) = 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   375
  let val arity = length typlist
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   376
      val body  = "z" ^ string_of_int(c_nr)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   377
      val args1 = if arity=0 then ""
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   378
                             else "("^Args("y",",",y_nr,y_nr+arity-1) ^ ")"
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   379
      val args2 = if arity=0 then ""
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   380
                  else "% "^Args("y"," ",y_nr,y_nr+arity-1) ^ ". "
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   381
      val (rest1,rest2) = if cs = [] then ("","")
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   382
                          else let val (h1,h2) = calc_xrules (c_nr+1) (y_nr+arity) cs
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   383
                               in (" | " ^ h1, ", " ^ h2)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   384
                               end
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   385
      in (c^args1^" => "^body^rest1,
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   386
          args2 ^ body ^ rest2)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   387
  end
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   388
  | calc_xrules _ _ [] = raise Impossible;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   389
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   390
fun xrules ((typlist,id),conslist) =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   391
   let val (first_part,scnd_part) = calc_xrules 1 1 conslist
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   392
   in  [("logic","case x of " ^ first_part) <->
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   393
        ("logic",id ^ "_case(x," ^ scnd_part ^ ")" )]
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   394
   end;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   395
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   396
(* ------------------------------------------------------------------------- *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   397
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   398
fun parse InputString =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   399
   let val (deftyp,conslist') = ((reader type_def) o explode) InputString
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   400
       val test = check_cons(conslist')
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   401
       val conslist = analyse (deftyp,conslist')
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   402
       val test2 = one_not_rek conslist
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   403
   in (deftyp,conslist)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   404
   end;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   405
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   406
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   407
(* -------------------------------------------------------------------------- *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   408
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   409
val Datatype = parse Input.data;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   410
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   411
val datatype_id = (#2 o #1) Datatype;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   412
val datatype_arity = length ((#1 o #1) Datatype);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   413
val cons_list = #2 Datatype;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   414
val datatype_name = pp_typlist1((#1 o #1) Datatype) ^ datatype_id;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   415
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   416
val thy_name = datatype_id;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   417
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   418
val base_thy = if length(cons_list) < K then Input.base
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   419
                                        else merge_theories(Input.base,Arith.thy);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   420
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   421
val (case_const,rules_case) = case_consts Datatype;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   422
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   423
val q = (case_const);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   424
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   425
val types = if Input.declare_consts then [([datatype_id],datatype_arity)]
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   426
                                    else [];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   427
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   428
fun term_list n = replicate n ["term"];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   429
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   430
val arities :(string list * (sort list * class))list 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   431
           = if Input.declare_consts then
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   432
                [([datatype_id],((term_list datatype_arity),"term"))]
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   433
             else [];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   434
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   435
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   436
val consts = (if Input.declare_consts then
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   437
                (const_types Datatype) else []) @
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   438
             (if length(cons_list) < K then []
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   439
                else [([datatype_id^"_ord"],datatype_name^"=>nat")]) @
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   440
             case_const;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   441
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   442
val sextopt = Some(NewSext{mixfix=[],
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   443
                           xrules=(xrules Datatype),
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   444
                           parse_ast_translation=[],
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   445
                           parse_translation=[],
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   446
                           print_translation=[],
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   447
                           print_ast_translation=[]});
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   448
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   449
val rules_ineq = if (length cons_list) < K then Ci_neg1 cons_list
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   450
                                           else Ci_neg2 Datatype;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   451
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   452
val rules_inject = Ci_ing cons_list;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   453
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   454
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   455
val rule_induct =  ("induct",t_induct cons_list datatype_id);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   456
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   457
val rules = rule_induct::(rules_inject @ rules_ineq @ rules_case);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   458
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   459
fun getaxioms ((name,axiom)::axioms) thy = (get_axiom thy name)::
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   460
                                           (getaxioms axioms thy)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   461
  | getaxioms [] _ = [];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   462
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   463
fun sym_ineq (t::ts) = (sym COMP (t RS contrapos)) :: (sym_ineq ts)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   464
  | sym_ineq [] = [];
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   465
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   466
(* -----------------------------------------------------------------------*) 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   467
(* Das folgende wird exportiert *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   468
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   469
val thy = extend_theory base_thy thy_name 
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   470
                        ([],[],types,[],arities,consts,sextopt)   rules;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   471
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   472
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   473
val inject = getaxioms rules_inject thy;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   474
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   475
val ineq = let val ineq' = getaxioms rules_ineq thy
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   476
           in if length(cons_list) < K then ineq' @ (sym_ineq ineq')
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   477
                                       else ineq'
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   478
           end;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   479
           
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   480
val induct = get_axiom thy "induct";
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   481
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   482
val cases = getaxioms rules_case thy;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   483
60
43e36c15a831 new field "simps" added
nipkow
parents: 53
diff changeset
   484
val simps = inject @ ineq @ cases;
43e36c15a831 new field "simps" added
nipkow
parents: 53
diff changeset
   485
53
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   486
fun induct_tac a = res_inst_tac [(datatype_id,a)] induct;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   487
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   488
(* -------------------------------------------------------------------  *)
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   489
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   490
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   491
end;
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   492
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   493
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   494
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   495
functor Datatype(val base:theory and data:string) : DATATYPE =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   496
  DatatypeFUN(val base=base and data=data and declare_consts=true);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   497
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   498
functor DeclaredDatatype(val base:theory and data:string) : DATATYPE =
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   499
  DatatypeFUN(val base=base and data=data and declare_consts=false);
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   500
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   501
5e0570ea8b70 ML-like datatype decalaration facility. Axiomatic.
nipkow
parents:
diff changeset
   502