src/CCL/Fix.thy
author wenzelm
Tue, 05 Nov 2019 14:16:16 +0100
changeset 71046 b8aeeedf7e68
parent 61337 4645502c3c64
permissions -rw-r--r--
support for Linux user management;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
     1
(*  Title:      CCL/Fix.thy
1474
3f7d67927fe2 expanded tabs
clasohm
parents: 0
diff changeset
     2
    Author:     Martin Coen
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Copyright   1993  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 58977
diff changeset
     6
section \<open>Tentative attempt at including fixed point induction; justified by Smith\<close>
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
     7
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
     8
theory Fix
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
     9
imports Type
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    10
begin
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    12
definition idgen :: "i \<Rightarrow> i"
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    13
  where "idgen(f) == lam t. case(t,true,false, \<lambda>x y.<f`x, f`y>, \<lambda>u. lam x. f ` u(x))"
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    15
axiomatization INCL :: "[i\<Rightarrow>o]\<Rightarrow>o" where
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    16
  INCL_def: "INCL(\<lambda>x. P(x)) == (ALL f.(ALL n:Nat. P(f^n`bot)) \<longrightarrow> P(fix(f)))" and
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    17
  po_INCL: "INCL(\<lambda>x. a(x) [= b(x))" and
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    18
  INCL_subst: "INCL(P) \<Longrightarrow> INCL(\<lambda>x. P((g::i\<Rightarrow>i)(x)))"
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3837
diff changeset
    19
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    20
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 58977
diff changeset
    21
subsection \<open>Fixed Point Induction\<close>
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    22
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    23
lemma fix_ind:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    24
  assumes base: "P(bot)"
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    25
    and step: "\<And>x. P(x) \<Longrightarrow> P(f(x))"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    26
    and incl: "INCL(P)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    27
  shows "P(fix(f))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    28
  apply (rule incl [unfolded INCL_def, rule_format])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    29
  apply (rule Nat_ind [THEN ballI], assumption)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    30
   apply simp_all
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    31
   apply (rule base)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    32
  apply (erule step)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    33
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    34
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    35
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 58977
diff changeset
    36
subsection \<open>Inclusive Predicates\<close>
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    37
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    38
lemma inclXH: "INCL(P) \<longleftrightarrow> (ALL f. (ALL n:Nat. P(f ^ n ` bot)) \<longrightarrow> P(fix(f)))"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    39
  by (simp add: INCL_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    40
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    41
lemma inclI: "\<lbrakk>\<And>f. ALL n:Nat. P(f^n`bot) \<Longrightarrow> P(fix(f))\<rbrakk> \<Longrightarrow> INCL(\<lambda>x. P(x))"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    42
  unfolding inclXH by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    43
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    44
lemma inclD: "\<lbrakk>INCL(P); \<And>n. n:Nat \<Longrightarrow> P(f^n`bot)\<rbrakk> \<Longrightarrow> P(fix(f))"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    45
  unfolding inclXH by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    46
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    47
lemma inclE: "\<lbrakk>INCL(P); (ALL n:Nat. P(f^n`bot)) \<longrightarrow> P(fix(f)) \<Longrightarrow> R\<rbrakk> \<Longrightarrow> R"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    48
  by (blast dest: inclD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    49
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    50
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 58977
diff changeset
    51
subsection \<open>Lemmas for Inclusive Predicates\<close>
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    52
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    53
lemma npo_INCL: "INCL(\<lambda>x. \<not> a(x) [= t)"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    54
  apply (rule inclI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    55
  apply (drule bspec)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    56
   apply (rule zeroT)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    57
  apply (erule contrapos)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    58
  apply (rule po_trans)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    59
   prefer 2
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    60
   apply assumption
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    61
  apply (subst napplyBzero)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    62
  apply (rule po_cong, rule po_bot)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    63
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    64
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    65
lemma conj_INCL: "\<lbrakk>INCL(P); INCL(Q)\<rbrakk> \<Longrightarrow> INCL(\<lambda>x. P(x) \<and> Q(x))"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    66
  by (blast intro!: inclI dest!: inclD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    67
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    68
lemma all_INCL: "(\<And>a. INCL(P(a))) \<Longrightarrow> INCL(\<lambda>x. ALL a. P(a,x))"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    69
  by (blast intro!: inclI dest!: inclD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    70
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    71
lemma ball_INCL: "(\<And>a. a:A \<Longrightarrow> INCL(P(a))) \<Longrightarrow> INCL(\<lambda>x. ALL a:A. P(a,x))"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    72
  by (blast intro!: inclI dest!: inclD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    73
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
    74
lemma eq_INCL: "INCL(\<lambda>x. a(x) = (b(x)::'a::prog))"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    75
  apply (simp add: eq_iff)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    76
  apply (rule conj_INCL po_INCL)+
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    77
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    78
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    79
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 58977
diff changeset
    80
subsection \<open>Derivation of Reachability Condition\<close>
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    81
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    82
(* Fixed points of idgen *)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    83
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    84
lemma fix_idgenfp: "idgen(fix(idgen)) = fix(idgen)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    85
  apply (rule fixB [symmetric])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    86
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    87
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    88
lemma id_idgenfp: "idgen(lam x. x) = lam x. x"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    89
  apply (simp add: idgen_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    90
  apply (rule term_case [THEN allI])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    91
      apply simp_all
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    92
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    93
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    94
(* All fixed points are lam-expressions *)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    95
61337
4645502c3c64 fewer aliases for toplevel theorem statements;
wenzelm
parents: 60770
diff changeset
    96
schematic_goal idgenfp_lam: "idgen(d) = d \<Longrightarrow> d = lam x. ?f(x)"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    97
  apply (unfold idgen_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    98
  apply (erule ssubst)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    99
  apply (rule refl)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   100
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   101
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   102
(* Lemmas for rewriting fixed points of idgen *)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   103
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   104
lemma l_lemma: "\<lbrakk>a = b; a ` t = u\<rbrakk> \<Longrightarrow> b ` t = u"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   105
  by (simp add: idgen_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   106
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   107
lemma idgen_lemmas:
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   108
  "idgen(d) = d \<Longrightarrow> d ` bot = bot"
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   109
  "idgen(d) = d \<Longrightarrow> d ` true = true"
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   110
  "idgen(d) = d \<Longrightarrow> d ` false = false"
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   111
  "idgen(d) = d \<Longrightarrow> d ` <a,b> = <d ` a,d ` b>"
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   112
  "idgen(d) = d \<Longrightarrow> d ` (lam x. f(x)) = lam x. d ` f(x)"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   113
  by (erule l_lemma, simp add: idgen_def)+
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   114
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   115
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   116
(* Proof of Reachability law - show that fix and lam x.x both give LEAST fixed points
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   117
  of idgen and hence are they same *)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   118
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   119
lemma po_eta:
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   120
  "\<lbrakk>ALL x. t ` x [= u ` x; EX f. t=lam x. f(x); EX f. u=lam x. f(x)\<rbrakk> \<Longrightarrow> t [= u"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   121
  apply (drule cond_eta)+
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   122
  apply (erule ssubst)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   123
  apply (erule ssubst)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   124
  apply (rule po_lam [THEN iffD2])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   125
  apply simp
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   126
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   127
61337
4645502c3c64 fewer aliases for toplevel theorem statements;
wenzelm
parents: 60770
diff changeset
   128
schematic_goal po_eta_lemma: "idgen(d) = d \<Longrightarrow> d = lam x. ?f(x)"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   129
  apply (unfold idgen_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   130
  apply (erule sym)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   131
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   132
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   133
lemma lemma1:
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   134
  "idgen(d) = d \<Longrightarrow>
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   135
    {p. EX a b. p=<a,b> \<and> (EX t. a=fix(idgen) ` t \<and> b = d ` t)} <=
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   136
      POgen({p. EX a b. p=<a,b> \<and> (EX t. a=fix(idgen) ` t  \<and> b = d ` t)})"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   137
  apply clarify
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   138
  apply (rule_tac t = t in term_case)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   139
      apply (simp_all add: POgenXH idgen_lemmas idgen_lemmas [OF fix_idgenfp])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   140
   apply blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   141
  apply fast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   142
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   143
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   144
lemma fix_least_idgen: "idgen(d) = d \<Longrightarrow> fix(idgen) [= d"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   145
  apply (rule allI [THEN po_eta])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   146
    apply (rule lemma1 [THEN [2] po_coinduct])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   147
     apply (blast intro: po_eta_lemma fix_idgenfp)+
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   148
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   149
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   150
lemma lemma2:
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   151
  "idgen(d) = d \<Longrightarrow>
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   152
    {p. EX a b. p=<a,b> \<and> b = d ` a} <= POgen({p. EX a b. p=<a,b> \<and> b = d ` a})"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   153
  apply clarify
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   154
  apply (rule_tac t = a in term_case)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   155
      apply (simp_all add: POgenXH idgen_lemmas)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   156
  apply fast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   157
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   158
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   159
lemma id_least_idgen: "idgen(d) = d \<Longrightarrow> lam x. x [= d"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   160
  apply (rule allI [THEN po_eta])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   161
    apply (rule lemma2 [THEN [2] po_coinduct])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   162
     apply simp
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   163
    apply (fast intro: po_eta_lemma fix_idgenfp)+
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   164
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   165
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   166
lemma reachability: "fix(idgen) = lam x. x"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   167
  apply (fast intro: eq_iff [THEN iffD2]
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   168
    id_idgenfp [THEN fix_least_idgen] fix_idgenfp [THEN id_least_idgen])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   169
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   170
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   171
(********)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   172
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   173
lemma id_apply: "f = lam x. x \<Longrightarrow> f`t = t"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   174
  apply (erule ssubst)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   175
  apply (rule applyB)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   176
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   177
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   178
lemma term_ind:
23467
d1b97708d5eb tuned proofs -- avoid implicit prems;
wenzelm
parents: 20140
diff changeset
   179
  assumes 1: "P(bot)" and 2: "P(true)" and 3: "P(false)"
58977
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   180
    and 4: "\<And>x y. \<lbrakk>P(x); P(y)\<rbrakk> \<Longrightarrow> P(<x,y>)"
9576b510f6a2 more symbols;
wenzelm
parents: 58889
diff changeset
   181
    and 5: "\<And>u.(\<And>x. P(u(x))) \<Longrightarrow> P(lam x. u(x))"
23467
d1b97708d5eb tuned proofs -- avoid implicit prems;
wenzelm
parents: 20140
diff changeset
   182
    and 6: "INCL(P)"
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   183
  shows "P(t)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   184
  apply (rule reachability [THEN id_apply, THEN subst])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   185
  apply (rule_tac x = t in spec)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   186
  apply (rule fix_ind)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   187
    apply (unfold idgen_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   188
    apply (rule allI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   189
    apply (subst applyBbot)
23467
d1b97708d5eb tuned proofs -- avoid implicit prems;
wenzelm
parents: 20140
diff changeset
   190
    apply (rule 1)
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   191
   apply (rule allI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   192
   apply (rule applyB [THEN ssubst])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   193
    apply (rule_tac t = "xa" in term_case)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   194
       apply simp_all
23467
d1b97708d5eb tuned proofs -- avoid implicit prems;
wenzelm
parents: 20140
diff changeset
   195
       apply (fast intro: assms INCL_subst all_INCL)+
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   196
  done
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   197
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   198
end