sexp.ML
author clasohm
Sun, 24 Apr 1994 11:27:38 +0200
changeset 70 9459592608e2
parent 48 21291189b51e
permissions -rw-r--r--
renamed theory files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	HOL/sexp
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1992  University of Cambridge
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     5
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     6
For sexp.thy.  S-expressions.
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     7
*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     8
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     9
open Sexp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    10
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    11
(** the sexp functional **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    12
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    13
goal Sexp.thy "mono(%Z. range(Leaf) Un range(Numb) Un Z<*>Z)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    14
by (REPEAT (ares_tac [monoI, subset_refl, Un_mono, uprod_mono] 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    15
val Sexp_fun_mono = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    16
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    17
val Sexp_unfold = Sexp_fun_mono RS (Sexp_def RS def_lfp_Tarski);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    18
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    19
(** Induction **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    20
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    21
val major::prems = goal Sexp.thy 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    22
    "[| ii: Sexp;  !!a. P(Leaf(a));   !!k. P(Numb(k));   \
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    23
\       !!i j. [| i: Sexp; j: Sexp; P(i); P(j) |] ==> P(i$j) \
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    24
\    |]  ==> P(ii)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    25
by (rtac (major RS (Sexp_def RS def_induct)) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    26
by (rtac Sexp_fun_mono 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    27
by (fast_tac (set_cs addIs prems addSEs [uprodE]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    28
val Sexp_induct = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    29
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    30
(** Sexp_case **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    31
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    32
goalw Sexp.thy [Sexp_case_def] "Sexp_case(Leaf(a),c,d,e) = c(a)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    33
by (fast_tac (HOL_cs addIs  [select_equality] 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    34
	             addSDs [Leaf_inject]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    35
		     addSEs [Leaf_neq_Scons, Leaf_neq_Numb]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    36
val Sexp_case_Leaf = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    37
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    38
goalw Sexp.thy [Sexp_case_def] "Sexp_case(Numb(k),c,d,e) = d(k)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    39
by (fast_tac (HOL_cs addIs  [select_equality] 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    40
	             addSDs [Numb_inject]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    41
		     addSEs [Numb_neq_Scons, Numb_neq_Leaf]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    42
val Sexp_case_Numb = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    43
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    44
goalw Sexp.thy [Sexp_case_def] "Sexp_case(M$N, c, d, e) = e(M,N)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    45
by (fast_tac (HOL_cs addIs  [select_equality] 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    46
	             addSDs [Scons_inject]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    47
	             addSEs [Scons_neq_Leaf, Scons_neq_Numb]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    48
val Sexp_case_Scons = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    49
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    50
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    51
(** Introduction rules for Sexp constructors **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    52
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    53
val SexpI = Sexp_unfold RS equalityD2 RS subsetD;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    54
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    55
goal Sexp.thy "Leaf(a): Sexp";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    56
by (fast_tac (set_cs addIs [SexpI]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    57
val Sexp_LeafI = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    58
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    59
goal Sexp.thy "Numb(a): Sexp";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    60
by (fast_tac (set_cs addIs [SexpI]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    61
val Sexp_NumbI = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    62
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    63
val prems = goal Sexp.thy 
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    64
    "[| M: Sexp;  N: Sexp |] ==> M$N : Sexp";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    65
by (fast_tac (set_cs addIs ([uprodI,SexpI]@prems)) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    66
val Sexp_SconsI = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    67
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    68
val [prem] = goalw Sexp.thy [In0_def] 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    69
    "M: Sexp ==> In0(M) : Sexp";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    70
by (rtac (prem RS (Sexp_NumbI RS Sexp_SconsI)) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    71
val Sexp_In0I = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    72
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    73
val [prem] = goalw Sexp.thy [In1_def] 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    74
    "M: Sexp ==> In1(M) : Sexp";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    75
by (rtac (prem RS (Sexp_NumbI RS Sexp_SconsI)) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    76
val Sexp_In1I = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    77
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    78
goal Sexp.thy "range(Leaf) <= Sexp";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    79
by (fast_tac (set_cs addIs [SexpI]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    80
val range_Leaf_subset_Sexp = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    81
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
    82
val [major] = goal Sexp.thy "M$N : Sexp ==> M: Sexp & N: Sexp";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    83
by (rtac (major RS setup_induction) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    84
by (etac Sexp_induct 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    85
by (ALLGOALS 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    86
    (fast_tac (set_cs addSEs [Scons_neq_Leaf,Scons_neq_Numb,Scons_inject])));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    87
val Scons_D = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    88
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    89
(** Introduction rules for 'pred_Sexp' **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    90
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    91
val sexp_cs = set_cs addIs [SigmaI, uprodI, SexpI];
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    92
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    93
goalw Sexp.thy [pred_Sexp_def] "pred_Sexp <= Sigma(Sexp, %u.Sexp)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    94
by (fast_tac sexp_cs 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    95
val pred_Sexp_subset_Sigma = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    96
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    97
(* <a,b> : pred_Sexp^+ ==> a : Sexp *)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    98
val trancl_pred_SexpD1 = 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    99
    pred_Sexp_subset_Sigma RS trancl_subset_Sigma RS subsetD RS SigmaD1
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   100
and trancl_pred_SexpD2 = 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   101
    pred_Sexp_subset_Sigma RS trancl_subset_Sigma RS subsetD RS SigmaD2;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   102
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   103
val prems = goalw Sexp.thy [pred_Sexp_def]
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   104
    "[| M: Sexp;  N: Sexp |] ==> <M, M$N> : pred_Sexp";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   105
by (fast_tac (set_cs addIs prems) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   106
val pred_SexpI1 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   107
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   108
val prems = goalw Sexp.thy [pred_Sexp_def]
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   109
    "[| M: Sexp;  N: Sexp |] ==> <N, M$N> : pred_Sexp";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   110
by (fast_tac (set_cs addIs prems) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   111
val pred_SexpI2 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   112
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   113
(*Combinations involving transitivity and the rules above*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   114
val pred_Sexp_t1 = pred_SexpI1 RS r_into_trancl
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   115
and pred_Sexp_t2 = pred_SexpI2 RS r_into_trancl;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   116
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   117
val pred_Sexp_trans1 = pred_Sexp_t1 RSN (2, trans_trancl RS transD)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   118
and pred_Sexp_trans2 = pred_Sexp_t2 RSN (2, trans_trancl RS transD);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   119
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   120
(*Proves goals of the form <M,N>:pred_Sexp^+ provided M,N:Sexp*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   121
val pred_Sexp_simps =
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   122
            [Sexp_LeafI, Sexp_NumbI, Sexp_SconsI, 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   123
	     pred_Sexp_t1, pred_Sexp_t2,
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   124
	     pred_Sexp_trans1, pred_Sexp_trans2, cut_apply];
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   125
val pred_Sexp_ss = HOL_ss addsimps pred_Sexp_simps;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   126
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   127
val major::prems = goalw Sexp.thy [pred_Sexp_def]
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   128
    "[| p : pred_Sexp;  \
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   129
\       !!M N. [| p = <M, M$N>;  M: Sexp;  N: Sexp |] ==> R; \
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   130
\       !!M N. [| p = <N, M$N>;  M: Sexp;  N: Sexp |] ==> R  \
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   131
\    |] ==> R";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   132
by (cut_facts_tac [major] 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   133
by (REPEAT (eresolve_tac ([asm_rl,emptyE,insertE,UN_E]@prems) 1));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   134
val pred_SexpE = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   135
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   136
goal Sexp.thy "wf(pred_Sexp)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   137
by (rtac (pred_Sexp_subset_Sigma RS wfI) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   138
by (etac Sexp_induct 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   139
by (fast_tac (HOL_cs addSEs [mp, pred_SexpE, Pair_inject, Scons_inject]) 3);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   140
by (fast_tac (HOL_cs addSEs [mp, pred_SexpE, Pair_inject, Numb_neq_Scons]) 2);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   141
by (fast_tac (HOL_cs addSEs [mp, pred_SexpE, Pair_inject, Leaf_neq_Scons]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   142
val wf_pred_Sexp = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   143
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   144
(*** Sexp_rec -- by wf recursion on pred_Sexp ***)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   145
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   146
(** conversion rules **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   147
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   148
val Sexp_rec_unfold = wf_pred_Sexp RS (Sexp_rec_def RS def_wfrec);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   149
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   150
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   151
goal Sexp.thy "Sexp_rec(Leaf(a), c, d, h) = c(a)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   152
by (stac Sexp_rec_unfold 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   153
by (rtac Sexp_case_Leaf 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   154
val Sexp_rec_Leaf = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   155
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   156
goal Sexp.thy "Sexp_rec(Numb(k), c, d, h) = d(k)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   157
by (stac Sexp_rec_unfold 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   158
by (rtac Sexp_case_Numb 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   159
val Sexp_rec_Numb = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   160
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   161
goal Sexp.thy "!!M. [| M: Sexp;  N: Sexp |] ==> \
48
21291189b51e changed "." to "$" and Cons to infix "#" to eliminate ambiguity
clasohm
parents: 0
diff changeset
   162
\    Sexp_rec(M$N, c, d, h) = h(M, N, Sexp_rec(M,c,d,h), Sexp_rec(N,c,d,h))";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   163
by (rtac (Sexp_rec_unfold RS trans) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   164
by (asm_simp_tac(HOL_ss addsimps
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   165
               [Sexp_case_Scons,pred_SexpI1,pred_SexpI2,cut_apply])1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   166
val Sexp_rec_Scons = result();