src/ZF/Datatype.ML
author wenzelm
Sat, 10 Nov 2001 16:25:17 +0100
changeset 12134 7049eead7a50
parent 9000 c20d58286a51
child 12175 5cf58a1799a7
permissions -rw-r--r--
use Tactic.prove;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 477
diff changeset
     1
(*  Title:      ZF/Datatype.ML
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 477
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1993  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
120
09287f26bfb8 changed all co- and co_ to co
lcp
parents: 70
diff changeset
     6
(Co)Datatype Definitions for Zermelo-Fraenkel Set Theory
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
6053
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    10
(*Typechecking rules for most datatypes involving univ*)
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    11
structure Data_Arg =
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    12
  struct
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    13
  val intrs = 
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    14
      [SigmaI, InlI, InrI,
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    15
       Pair_in_univ, Inl_in_univ, Inr_in_univ, 
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    16
       zero_in_univ, A_into_univ, nat_into_univ, UnCI];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
6112
5e4871c5136b datatype package improvements
paulson
parents: 6053
diff changeset
    18
5e4871c5136b datatype package improvements
paulson
parents: 6053
diff changeset
    19
  val elims = [make_elim InlD, make_elim InrD,   (*for mutual recursion*)
12134
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    20
               SigmaE, sumE];                    (*allows * and + in spec*)
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 477
diff changeset
    21
  end;
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 477
diff changeset
    22
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 477
diff changeset
    23
6053
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    24
structure Data_Package = 
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    25
    Add_datatype_def_Fun
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    26
      (structure Fp=Lfp and Pr=Standard_Prod and CP=Standard_CP
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    27
       and Su=Standard_Sum
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    28
       and Ind_Package = Ind_Package
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    29
       and Datatype_Arg = Data_Arg);
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 477
diff changeset
    30
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 477
diff changeset
    31
6053
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    32
(*Typechecking rules for most codatatypes involving quniv*)
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    33
structure CoData_Arg =
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    34
  struct
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    35
  val intrs = 
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    36
      [QSigmaI, QInlI, QInrI,
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    37
       QPair_in_quniv, QInl_in_quniv, QInr_in_quniv, 
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    38
       zero_in_quniv, A_into_quniv, nat_into_quniv, UnCI];
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 477
diff changeset
    39
6112
5e4871c5136b datatype package improvements
paulson
parents: 6053
diff changeset
    40
  val elims = [make_elim QInlD, make_elim QInrD,   (*for mutual recursion*)
12134
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    41
               QSigmaE, qsumE];                    (*allows * and + in spec*)
6053
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    42
  end;
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 477
diff changeset
    43
6053
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    44
structure CoData_Package = 
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    45
    Add_datatype_def_Fun(structure Fp=Gfp and Pr=Quine_Prod and CP=Quine_CP
8a1059aa01f0 new inductive, datatype and primrec packages, etc.
paulson
parents: 1461
diff changeset
    46
                          and Su=Quine_Sum
12134
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    47
                          and Ind_Package = CoInd_Package
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    48
                          and Datatype_Arg = CoData_Arg);
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 477
diff changeset
    49
6141
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    50
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    51
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    52
(*Simproc for freeness reasoning: compare datatype constructors for equality*)
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    53
structure DataFree =
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    54
struct
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    55
  val trace = ref false;
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    56
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    57
  fun mk_new ([],[]) = Const("True",FOLogic.oT)
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    58
    | mk_new (largs,rargs) =
12134
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    59
        fold_bal FOLogic.mk_conj
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    60
                 (map FOLogic.mk_eq (ListPair.zip (largs,rargs)));
6141
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    61
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    62
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    63
 fun proc sg _ old =
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    64
   let val _ = if !trace then writeln ("data_free: OLD = " ^ 
12134
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    65
                                       string_of_cterm (cterm_of sg old))
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    66
               else ()
6141
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    67
       val (lhs,rhs) = FOLogic.dest_eq old
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    68
       val (lhead, largs) = strip_comb lhs
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    69
       and (rhead, rargs) = strip_comb rhs
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    70
       val lname = #1 (dest_Const lhead)
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    71
       and rname = #1 (dest_Const rhead)
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    72
       val lcon_info = the (Symtab.lookup (ConstructorsData.get_sg sg, lname))
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    73
       and rcon_info = the (Symtab.lookup (ConstructorsData.get_sg sg, rname))
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    74
       val new = 
12134
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    75
           if #big_rec_name lcon_info = #big_rec_name rcon_info 
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    76
               andalso not (null (#free_iffs lcon_info)) then
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    77
               if lname = rname then mk_new (largs, rargs)
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    78
               else Const("False",FOLogic.oT)
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    79
           else raise Match
6141
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    80
       val _ = if !trace then 
12134
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    81
                 writeln ("NEW = " ^ string_of_cterm (Thm.cterm_of sg new))
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    82
               else ();
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    83
       val goal = Logic.mk_equals (old, new)
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    84
       val thm = Tactic.prove sg [] [] goal (fn _ => rtac iff_reflection 1 THEN
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    85
           simp_tac (simpset_of Datatype.thy addsimps #free_iffs lcon_info) 1)
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    86
         handle ERROR =>
7049eead7a50 use Tactic.prove;
wenzelm
parents: 9000
diff changeset
    87
         error ("data_free simproc:\nfailed to prove " ^ Sign.string_of_term sg goal)
6141
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    88
   in Some thm end
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    89
   handle _ => None;
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    90
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    91
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    92
 val conv = 
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    93
     Simplifier.mk_simproc "data_free"
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    94
       [Thm.read_cterm (sign_of ZF.thy) ("(x::i) = y", FOLogic.oT)]
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    95
       proc;
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    96
end;
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    97
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    98
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    99
Addsimprocs [DataFree.conv];