Sexp.ML
author clasohm
Wed, 02 Nov 1994 15:26:13 +0100
changeset 157 45d0cf6e309d
parent 128 89669c58e506
child 171 16c4ea954511
permissions -rw-r--r--
added IOA files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
     1
(*  Title: 	HOL/Sexp
0
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
110
7c6476c53a6c HOL/Sexp: rotated arguments of Sexp_case
lcp
parents: 48
diff changeset
     4
    Copyright   1994  University of Cambridge
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     5
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
     6
S-expressions, general binary trees for defining recursive data structures
0
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
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    11
(** sexp_case **)
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    12
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    13
val sexp_free_cs = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    14
    set_cs addSDs [Leaf_inject, Numb_inject, Scons_inject] 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    15
	   addSEs [Leaf_neq_Scons, Leaf_neq_Numb,
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    16
		   Numb_neq_Scons, Numb_neq_Leaf,
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    17
		   Scons_neq_Leaf, Scons_neq_Numb];
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    18
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    19
goalw Sexp.thy [sexp_case_def] "sexp_case(c, d, e, Leaf(a)) = c(a)";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    20
by (resolve_tac [select_equality] 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    21
by (ALLGOALS (fast_tac sexp_free_cs));
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    22
val sexp_case_Leaf = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    23
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    24
goalw Sexp.thy [sexp_case_def] "sexp_case(c, d, e, Numb(k)) = d(k)";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    25
by (resolve_tac [select_equality] 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    26
by (ALLGOALS (fast_tac sexp_free_cs));
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    27
val sexp_case_Numb = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    28
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    29
goalw Sexp.thy [sexp_case_def] "sexp_case(c, d, e, M$N) = e(M,N)";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    30
by (resolve_tac [select_equality] 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    31
by (ALLGOALS (fast_tac sexp_free_cs));
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    32
val sexp_case_Scons = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    33
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    34
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    35
(** Introduction rules for sexp constructors **)
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    36
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    37
val [prem] = goalw Sexp.thy [In0_def] 
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    38
    "M: sexp ==> In0(M) : sexp";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    39
by (rtac (prem RS (sexp.NumbI RS sexp.SconsI)) 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    40
val sexp_In0I = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    41
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    42
val [prem] = goalw Sexp.thy [In1_def] 
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    43
    "M: sexp ==> In1(M) : sexp";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    44
by (rtac (prem RS (sexp.NumbI RS sexp.SconsI)) 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    45
val sexp_In1I = result();
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    46
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    47
val sexp_cs = set_cs addIs sexp.intrs@[SigmaI, uprodI];
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    48
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    49
goal Sexp.thy "range(Leaf) <= sexp";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    50
by (fast_tac sexp_cs 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    51
val range_Leaf_subset_sexp = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    52
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    53
val [major] = goal Sexp.thy "M$N : sexp ==> M: sexp & N: sexp";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    54
by (rtac (major RS setup_induction) 1);
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    55
by (etac sexp.induct 1);
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    56
by (ALLGOALS 
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    57
    (fast_tac (set_cs addSEs [Scons_neq_Leaf,Scons_neq_Numb,Scons_inject])));
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    58
val Scons_D = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    59
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    60
(** Introduction rules for 'pred_sexp' **)
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    61
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    62
goalw Sexp.thy [pred_sexp_def] "pred_sexp <= Sigma(sexp, %u.sexp)";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    63
by (fast_tac sexp_cs 1);
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    64
val pred_sexp_subset_Sigma = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    65
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    66
(* <a,b> : pred_sexp^+ ==> a : sexp *)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    67
val trancl_pred_sexpD1 = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    68
    pred_sexp_subset_Sigma RS trancl_subset_Sigma RS subsetD RS SigmaD1
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    69
and trancl_pred_sexpD2 = 
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    70
    pred_sexp_subset_Sigma RS trancl_subset_Sigma RS subsetD RS SigmaD2;
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    71
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    72
val prems = goalw Sexp.thy [pred_sexp_def]
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    73
    "[| M: sexp;  N: sexp |] ==> <M, M$N> : pred_sexp";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    74
by (fast_tac (set_cs addIs prems) 1);
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    75
val pred_sexpI1 = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    76
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    77
val prems = goalw Sexp.thy [pred_sexp_def]
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    78
    "[| M: sexp;  N: sexp |] ==> <N, M$N> : pred_sexp";
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    79
by (fast_tac (set_cs addIs prems) 1);
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    80
val pred_sexpI2 = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    81
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    82
(*Combinations involving transitivity and the rules above*)
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    83
val pred_sexp_t1 = pred_sexpI1 RS r_into_trancl
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    84
and pred_sexp_t2 = pred_sexpI2 RS r_into_trancl;
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    85
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    86
val pred_sexp_trans1 = pred_sexp_t1 RSN (2, trans_trancl RS transD)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    87
and pred_sexp_trans2 = pred_sexp_t2 RSN (2, trans_trancl RS transD);
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    88
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    89
(*Proves goals of the form <M,N>:pred_sexp^+ provided M,N:sexp*)
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    90
val pred_sexp_simps =
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    91
            sexp.intrs @
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    92
	    [pred_sexp_t1, pred_sexp_t2,
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    93
	     pred_sexp_trans1, pred_sexp_trans2, cut_apply];
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    94
val pred_sexp_ss = HOL_ss addsimps pred_sexp_simps;
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    95
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    96
val major::prems = goalw Sexp.thy [pred_sexp_def]
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    97
    "[| p : pred_sexp;  \
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    98
\       !!M N. [| p = <M, M$N>;  M: sexp;  N: sexp |] ==> R; \
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
    99
\       !!M N. [| p = <N, M$N>;  M: sexp;  N: sexp |] ==> R  \
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   100
\    |] ==> R";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   101
by (cut_facts_tac [major] 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   102
by (REPEAT (eresolve_tac ([asm_rl,emptyE,insertE,UN_E]@prems) 1));
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   103
val pred_sexpE = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   104
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   105
goal Sexp.thy "wf(pred_sexp)";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   106
by (rtac (pred_sexp_subset_Sigma RS wfI) 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   107
by (etac sexp.induct 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   108
by (fast_tac (HOL_cs addSEs [mp, pred_sexpE, Pair_inject, Scons_inject]) 3);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   109
by (fast_tac (HOL_cs addSEs [mp, pred_sexpE, Pair_inject, Numb_neq_Scons]) 2);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   110
by (fast_tac (HOL_cs addSEs [mp, pred_sexpE, Pair_inject, Leaf_neq_Scons]) 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   111
val wf_pred_sexp = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   112
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   113
(*** sexp_rec -- by wf recursion on pred_sexp ***)
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   114
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   115
(** conversion rules **)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   116
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   117
val sexp_rec_unfold = wf_pred_sexp RS (sexp_rec_def RS def_wfrec);
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   118
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   119
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   120
goal Sexp.thy "sexp_rec(Leaf(a), c, d, h) = c(a)";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   121
by (stac sexp_rec_unfold 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   122
by (rtac sexp_case_Leaf 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   123
val sexp_rec_Leaf = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   124
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   125
goal Sexp.thy "sexp_rec(Numb(k), c, d, h) = d(k)";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   126
by (stac sexp_rec_unfold 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   127
by (rtac sexp_case_Numb 1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   128
val sexp_rec_Numb = result();
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   129
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   130
goal Sexp.thy "!!M. [| M: sexp;  N: sexp |] ==> \
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   131
\    sexp_rec(M$N, c, d, h) = h(M, N, sexp_rec(M,c,d,h), sexp_rec(N,c,d,h))";
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   132
by (rtac (sexp_rec_unfold RS trans) 1);
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
   133
by (asm_simp_tac(HOL_ss addsimps
128
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   134
               [sexp_case_Scons,pred_sexpI1,pred_sexpI2,cut_apply])1);
89669c58e506 INSTALLATION OF INDUCTIVE DEFINITIONS
lcp
parents: 110
diff changeset
   135
val sexp_rec_Scons = result();