src/ZF/UNITY/GenPrefix.ML
author ehmety
Thu, 15 Nov 2001 16:46:38 +0100
changeset 12197 d9320fb0a570
child 12484 7ad150f5fc10
permissions -rw-r--r--
New files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12197
d9320fb0a570 New files
ehmety
parents:
diff changeset
     1
(*  Title:      ZF/UNITY/GenPrefix.ML
d9320fb0a570 New files
ehmety
parents:
diff changeset
     2
    ID:         $Id$
d9320fb0a570 New files
ehmety
parents:
diff changeset
     3
    Author:     Sidi O Ehmety, Cambridge University Computer Laboratory
d9320fb0a570 New files
ehmety
parents:
diff changeset
     4
    Copyright   2001  University of Cambridge
d9320fb0a570 New files
ehmety
parents:
diff changeset
     5
d9320fb0a570 New files
ehmety
parents:
diff changeset
     6
Charpentier's Generalized Prefix Relation
d9320fb0a570 New files
ehmety
parents:
diff changeset
     7
   <xs,ys>:gen_prefix(r)
d9320fb0a570 New files
ehmety
parents:
diff changeset
     8
     if ys = xs' @ zs where length(xs) = length(xs')
d9320fb0a570 New files
ehmety
parents:
diff changeset
     9
     and corresponding elements of xs, xs' are pairwise related by r
d9320fb0a570 New files
ehmety
parents:
diff changeset
    10
d9320fb0a570 New files
ehmety
parents:
diff changeset
    11
Based on Lex/Prefix
d9320fb0a570 New files
ehmety
parents:
diff changeset
    12
*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
    13
d9320fb0a570 New files
ehmety
parents:
diff changeset
    14
Goalw [refl_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
    15
 "[| refl(A, r); x:A |] ==> <x,x>:r";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    16
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    17
qed "reflD";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    18
d9320fb0a570 New files
ehmety
parents:
diff changeset
    19
(*** preliminary lemmas ***)
d9320fb0a570 New files
ehmety
parents:
diff changeset
    20
d9320fb0a570 New files
ehmety
parents:
diff changeset
    21
Goal "xs:list(A) ==> <[], xs>:gen_prefix(A, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    22
by (dtac (rotate_prems  1 gen_prefix.append) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    23
by (rtac gen_prefix.Nil 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    24
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
    25
qed "Nil_gen_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    26
Addsimps [Nil_gen_prefix];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    27
d9320fb0a570 New files
ehmety
parents:
diff changeset
    28
d9320fb0a570 New files
ehmety
parents:
diff changeset
    29
Goal "<xs,ys>:gen_prefix(A, r) ==> length(xs) le length(ys)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    30
by (etac gen_prefix.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    31
by (subgoal_tac "ys:list(A)" 3);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    32
by (auto_tac (claset() addDs [gen_prefix.dom_subset RS subsetD]
d9320fb0a570 New files
ehmety
parents:
diff changeset
    33
                       addIs [le_trans], 
d9320fb0a570 New files
ehmety
parents:
diff changeset
    34
              simpset() addsimps [length_app]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    35
qed "gen_prefix_length_le";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    36
d9320fb0a570 New files
ehmety
parents:
diff changeset
    37
d9320fb0a570 New files
ehmety
parents:
diff changeset
    38
Goal "[| <xs', ys'>:gen_prefix(A, r) |] \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    39
\  ==> (ALL x xs. x:A --> xs'= Cons(x,xs) --> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    40
\      (EX y ys. y:A & ys' = Cons(y,ys) &\
d9320fb0a570 New files
ehmety
parents:
diff changeset
    41
\      <x,y>:r & <xs, ys>:gen_prefix(A, r)))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    42
by (etac gen_prefix.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    43
by (force_tac (claset() addIs [gen_prefix.append],
d9320fb0a570 New files
ehmety
parents:
diff changeset
    44
               simpset()) 3);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    45
by (REPEAT(Asm_simp_tac 1));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    46
val lemma = result();
d9320fb0a570 New files
ehmety
parents:
diff changeset
    47
d9320fb0a570 New files
ehmety
parents:
diff changeset
    48
(*As usual converting it to an elimination rule is tiresome*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
    49
val major::prems = 
d9320fb0a570 New files
ehmety
parents:
diff changeset
    50
Goal "[| <Cons(x,xs), zs>:gen_prefix(A, r); \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    51
\   !!y ys. [|zs = Cons(y, ys); y:A; x:A; <x,y>:r; \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    52
\     <xs,ys>:gen_prefix(A, r) |] ==> P \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    53
\     |] ==> P";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    54
by (cut_facts_tac [major] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    55
by (forward_tac [gen_prefix.dom_subset RS subsetD] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    56
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    57
by (etac ConsE 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    58
by (cut_facts_tac [major RS lemma] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    59
by (Full_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    60
by (dtac mp 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    61
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    62
by (REPEAT (eresolve_tac [exE, conjE] 1));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    63
by (REPEAT (ares_tac prems 1));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    64
qed "Cons_gen_prefixE";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    65
AddSEs [Cons_gen_prefixE];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    66
d9320fb0a570 New files
ehmety
parents:
diff changeset
    67
Goal 
d9320fb0a570 New files
ehmety
parents:
diff changeset
    68
"(<Cons(x,xs),Cons(y,ys)>:gen_prefix(A, r)) \
d9320fb0a570 New files
ehmety
parents:
diff changeset
    69
\ <-> (x:A & y:A & <x,y>:r & <xs,ys>:gen_prefix(A, r))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    70
by (auto_tac (claset() addIs [gen_prefix.prepend], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    71
qed"Cons_gen_prefix_Cons";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    72
AddIffs [Cons_gen_prefix_Cons];
d9320fb0a570 New files
ehmety
parents:
diff changeset
    73
d9320fb0a570 New files
ehmety
parents:
diff changeset
    74
(** Monotonicity of gen_prefix **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
    75
d9320fb0a570 New files
ehmety
parents:
diff changeset
    76
Goal "r<=s ==> gen_prefix(A, r) <= gen_prefix(A, s)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    77
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    78
by (forward_tac [gen_prefix.dom_subset RS subsetD] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    79
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    80
by (etac rev_mp 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    81
by (etac gen_prefix.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    82
by (auto_tac (claset() addIs 
d9320fb0a570 New files
ehmety
parents:
diff changeset
    83
         [gen_prefix.append], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    84
qed "gen_prefix_mono2";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    85
d9320fb0a570 New files
ehmety
parents:
diff changeset
    86
Goal "A<=B ==>gen_prefix(A, r) <= gen_prefix(B, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
    87
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    88
by (forward_tac [gen_prefix.dom_subset RS subsetD] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    89
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    90
by (etac rev_mp 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    91
by (eres_inst_tac [("P", "y:list(A)")] rev_mp 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    92
by (eres_inst_tac [("P", "xa:list(A)")] rev_mp 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    93
by (etac gen_prefix.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    94
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    95
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
    96
by (REPEAT(etac ConsE 1));
d9320fb0a570 New files
ehmety
parents:
diff changeset
    97
by (auto_tac (claset() addDs [gen_prefix.dom_subset RS subsetD] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
    98
                       addIs [gen_prefix.append, list_mono RS subsetD],
d9320fb0a570 New files
ehmety
parents:
diff changeset
    99
             simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   100
qed "gen_prefix_mono1";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   101
d9320fb0a570 New files
ehmety
parents:
diff changeset
   102
Goal "[| A <= B; r <= s |] ==> gen_prefix(A, r) <= gen_prefix(B, s)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   103
by (rtac subset_trans 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   104
by (rtac gen_prefix_mono1 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   105
by (rtac gen_prefix_mono2 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   106
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   107
qed "gen_prefix_mono";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   108
d9320fb0a570 New files
ehmety
parents:
diff changeset
   109
(*** gen_prefix order ***)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   110
d9320fb0a570 New files
ehmety
parents:
diff changeset
   111
(* reflexivity *)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   112
Goalw [refl_def] "refl(A, r) ==> refl(list(A), gen_prefix(A, r))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   113
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   114
by (induct_tac "x" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   115
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   116
qed "refl_gen_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   117
Addsimps [refl_gen_prefix RS reflD];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   118
d9320fb0a570 New files
ehmety
parents:
diff changeset
   119
(* Transitivity *)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   120
(* A lemma for proving gen_prefix_trans_comp *)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   121
d9320fb0a570 New files
ehmety
parents:
diff changeset
   122
Goal "xs:list(A) ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   123
\  ALL zs. <xs @ ys, zs>:gen_prefix(A, r) --> <xs, zs>: gen_prefix(A, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   124
by (etac list.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   125
by (auto_tac (claset() addDs [gen_prefix.dom_subset RS subsetD], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   126
qed_spec_mp "append_gen_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   127
d9320fb0a570 New files
ehmety
parents:
diff changeset
   128
(* Lemma proving transitivity and more*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   129
d9320fb0a570 New files
ehmety
parents:
diff changeset
   130
Goal "<x, y>: gen_prefix(A, r) ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   131
\  (ALL z:list(A). <y,z>:gen_prefix(A, s)--><x, z>:gen_prefix(A, s O r))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   132
by (etac gen_prefix.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   133
by (auto_tac (claset() addEs [ConsE], simpset() addsimps [Nil_gen_prefix]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   134
by (subgoal_tac "ys:list(A)" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   135
by (blast_tac (claset() addDs [gen_prefix.dom_subset RS subsetD]) 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   136
by (dres_inst_tac [("xs", "ys"), ("r", "s")] append_gen_prefix 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   137
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   138
qed_spec_mp "gen_prefix_trans_comp";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   139
d9320fb0a570 New files
ehmety
parents:
diff changeset
   140
Goal "trans(r) ==> r O r <= r";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   141
by (auto_tac (claset() addDs [transD], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   142
qed "trans_comp_subset";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   143
d9320fb0a570 New files
ehmety
parents:
diff changeset
   144
Goal "trans(r) ==> trans(gen_prefix(A,r))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   145
by (simp_tac (simpset() addsimps [trans_def]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   146
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   147
by (rtac (impOfSubs (trans_comp_subset RS gen_prefix_mono2)) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   148
 by (assume_tac 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   149
by (rtac gen_prefix_trans_comp 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   150
by (auto_tac (claset() addDs [gen_prefix.dom_subset RS subsetD], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   151
qed_spec_mp "trans_gen_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   152
d9320fb0a570 New files
ehmety
parents:
diff changeset
   153
Goal
d9320fb0a570 New files
ehmety
parents:
diff changeset
   154
 "trans(r) ==> trans[list(A)](gen_prefix(A, r))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   155
by (dres_inst_tac [("A", "A")] trans_gen_prefix 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   156
by (rewrite_goal_tac [trans_def, trans_on_def] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   157
by (Blast_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   158
qed "trans_on_gen_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   159
d9320fb0a570 New files
ehmety
parents:
diff changeset
   160
Goalw [prefix_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   161
"[| <x,y>:prefix(A); <y, z>:gen_prefix(A, r); r<=A*A |] \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   162
\ ==>  <x, z>:gen_prefix(A, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   163
by (res_inst_tac [("P", "%r. <x,z>:gen_prefix(A, r)")]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   164
             (right_comp_id RS subst) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   165
by (REPEAT(blast_tac (claset() addDs [gen_prefix_trans_comp, 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   166
                  gen_prefix.dom_subset RS subsetD]) 1));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   167
qed_spec_mp "prefix_gen_prefix_trans";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   168
d9320fb0a570 New files
ehmety
parents:
diff changeset
   169
d9320fb0a570 New files
ehmety
parents:
diff changeset
   170
Goalw [prefix_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   171
"[| <x,y>:gen_prefix(A,r); <y, z>:prefix(A); r<=A*A |] \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   172
\ ==>  <x, z>:gen_prefix(A, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   173
by (res_inst_tac [("P", "%r. <x,z>:gen_prefix(A, r)")] (left_comp_id RS subst) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   174
by (REPEAT(blast_tac (claset() addDs [gen_prefix_trans_comp, 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   175
                                      gen_prefix.dom_subset RS subsetD]) 1));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   176
qed_spec_mp "gen_prefix_prefix_trans";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   177
d9320fb0a570 New files
ehmety
parents:
diff changeset
   178
(** Antisymmetry **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   179
d9320fb0a570 New files
ehmety
parents:
diff changeset
   180
Goal "n:nat ==> ALL b:nat. n #+ b le n --> b = 0";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   181
by (induct_tac "n" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   182
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   183
qed_spec_mp "nat_le_lemma";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   184
d9320fb0a570 New files
ehmety
parents:
diff changeset
   185
Goal "antisym(r) ==> antisym(gen_prefix(A, r))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   186
by (simp_tac (simpset() addsimps [antisym_def]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   187
by (rtac (impI RS allI RS allI) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   188
by (etac gen_prefix.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   189
by (full_simp_tac (simpset() addsimps [antisym_def]) 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   190
by (Blast_tac 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   191
by (Blast_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   192
(*append case is hardest*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   193
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   194
by (subgoal_tac "length(zs) = 0" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   195
by (subgoal_tac "ys:list(A)" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   196
by (blast_tac (claset() addDs [gen_prefix.dom_subset RS subsetD]) 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   197
by (dres_inst_tac [("psi", "<ys @ zs, xs>:gen_prefix(A,r)")] asm_rl 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   198
by (Asm_full_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   199
by (subgoal_tac "length(ys @ zs)  = length(ys) #+ length(zs) &ys:list(A)&xs:list(A)" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   200
by (blast_tac (claset() addIs [length_app] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   201
                        addDs [gen_prefix.dom_subset RS subsetD]) 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   202
by (REPEAT (dtac gen_prefix_length_le 1));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   203
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   204
by (Asm_full_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   205
by (dres_inst_tac [("j", "length(xs)")] le_trans 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   206
by (Blast_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   207
by (auto_tac (claset() addIs [nat_le_lemma], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   208
qed_spec_mp "antisym_gen_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   209
d9320fb0a570 New files
ehmety
parents:
diff changeset
   210
(*** recursion equations ***)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   211
d9320fb0a570 New files
ehmety
parents:
diff changeset
   212
Goal "xs:list(A) ==> <xs, []>:gen_prefix(A,r) <-> (xs = [])";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   213
by (induct_tac "xs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   214
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   215
qed "gen_prefix_Nil";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   216
Addsimps [gen_prefix_Nil];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   217
d9320fb0a570 New files
ehmety
parents:
diff changeset
   218
Goalw [refl_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   219
 "[| refl(A, r);  xs:list(A) |] ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   220
\   <xs@ys, xs@zs>: gen_prefix(A, r) <-> <ys,zs>:gen_prefix(A, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   221
by (induct_tac "xs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   222
by (ALLGOALS Asm_simp_tac);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   223
qed "same_gen_prefix_gen_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   224
Addsimps [same_gen_prefix_gen_prefix];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   225
d9320fb0a570 New files
ehmety
parents:
diff changeset
   226
Goal "[| xs:list(A); ys:list(A); y:A |] ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   227
\   <xs, Cons(y,ys)> : gen_prefix(A,r)  <-> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   228
\     (xs=[] | (EX z zs. xs=Cons(z,zs) & z:A & <z,y>:r & <zs,ys>:gen_prefix(A,r)))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   229
by (induct_tac "xs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   230
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   231
qed "gen_prefix_Cons";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   232
d9320fb0a570 New files
ehmety
parents:
diff changeset
   233
Goal "[| refl(A,r);  <xs,ys>:gen_prefix(A, r); zs:list(A) |] \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   234
\     ==>  <xs@zs, take(length(xs), ys) @ zs> : gen_prefix(A, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   235
by (etac gen_prefix.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   236
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   237
by (ALLGOALS(forward_tac [gen_prefix.dom_subset RS subsetD]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   238
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   239
by (ftac gen_prefix_length_le 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   240
by (subgoal_tac "take(length(xs), ys):list(A)" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   241
by (ALLGOALS (asm_simp_tac (simpset() addsimps 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   242
         [diff_is_0_iff RS iffD2, take_type ])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   243
qed "gen_prefix_take_append";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   244
d9320fb0a570 New files
ehmety
parents:
diff changeset
   245
Goal "[| refl(A, r);  <xs,ys>:gen_prefix(A,r);   \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   246
\        length(xs) = length(ys); zs:list(A) |] \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   247
\     ==>  <xs@zs, ys @ zs> : gen_prefix(A, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   248
by (dres_inst_tac [("zs", "zs")]  gen_prefix_take_append 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   249
by (REPEAT(assume_tac 1));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   250
by (subgoal_tac "take(length(xs), ys)=ys" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   251
by (auto_tac (claset() addSIs [take_all] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   252
                       addDs [gen_prefix.dom_subset RS subsetD], 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   253
              simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   254
qed "gen_prefix_append_both";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   255
d9320fb0a570 New files
ehmety
parents:
diff changeset
   256
(*NOT suitable for rewriting since [y] has the form y#ys*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   257
Goal "xs:list(A) ==> xs @ Cons(y, ys) = (xs @ [y]) @ ys";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   258
by (auto_tac (claset(), simpset() addsimps [app_assoc]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   259
qed "append_cons_conv";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   260
d9320fb0a570 New files
ehmety
parents:
diff changeset
   261
Goal "[| <xs,ys>:gen_prefix(A, r);  refl(A, r) |] \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   262
\     ==> length(xs) < length(ys) --> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   263
\         <xs @ [nth(length(xs), ys)], ys>:gen_prefix(A, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   264
by (etac gen_prefix.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   265
by (Blast_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   266
by (forward_tac [gen_prefix.dom_subset RS subsetD] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   267
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   268
by (ALLGOALS(asm_full_simp_tac (simpset() addsimps [length_type])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   269
(* Append case is hardest *)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   270
by (forward_tac [gen_prefix_length_le RS (le_iff RS iffD1) ] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   271
by (forward_tac [gen_prefix.dom_subset RS subsetD] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   272
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   273
by (subgoal_tac "length(xs):nat&length(ys):nat &length(zs):nat" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   274
by (blast_tac (claset() addIs [length_type]) 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   275
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   276
by (ALLGOALS (asm_full_simp_tac (simpset() 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   277
            addsimps [nth_append, length_type, length_app])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   278
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   279
by (rtac conjI 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   280
by (blast_tac (claset() addIs [gen_prefix.append]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   281
by (thin_tac "length(xs) < length(ys) -->?u" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   282
by (case_tac "zs=[]" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   283
by (auto_tac (claset(), simpset() addsimps [neq_Nil_iff]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   284
by (res_inst_tac [("P1", "%x. <?u(x), ?v>:?w")] (nat_diff_split RS iffD2) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   285
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   286
by (stac append_cons_conv 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   287
by (rtac   gen_prefix.append 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   288
by (auto_tac (claset() addEs [ConsE],
d9320fb0a570 New files
ehmety
parents:
diff changeset
   289
              simpset() addsimps [gen_prefix_append_both]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   290
val lemma = result() RS mp;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   291
d9320fb0a570 New files
ehmety
parents:
diff changeset
   292
Goal "[| <xs,ys>: gen_prefix(A, r);  length(xs) < length(ys);  refl(A, r) |] \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   293
\     ==> <xs @ [nth(length(xs), ys)], ys>:gen_prefix(A, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   294
by (blast_tac (claset() addIs [lemma]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   295
qed "append_one_gen_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   296
d9320fb0a570 New files
ehmety
parents:
diff changeset
   297
d9320fb0a570 New files
ehmety
parents:
diff changeset
   298
(** Proving the equivalence with Charpentier's definition **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   299
d9320fb0a570 New files
ehmety
parents:
diff changeset
   300
Goal "xs:list(A) ==>  \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   301
\ ALL ys:list(A). ALL i:nat. i < length(xs) \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   302
\         --> <xs, ys>: gen_prefix(A, r) --> <nth(i, xs), nth(i, ys)>:r";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   303
by (induct_tac "xs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   304
by (ALLGOALS(Clarify_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   305
by (ALLGOALS(Asm_full_simp_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   306
by (etac natE 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   307
by (ALLGOALS(Asm_full_simp_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   308
by (dres_inst_tac [("x", "ysa")] bspec 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   309
by (dres_inst_tac [("x", "x")] bspec 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   310
by (auto_tac (claset() addDs [gen_prefix.dom_subset RS subsetD], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   311
qed_spec_mp "gen_prefix_imp_nth";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   312
d9320fb0a570 New files
ehmety
parents:
diff changeset
   313
Goal "xs:list(A) ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   314
\ ALL ys:list(A). length(xs) le length(ys)  \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   315
\     --> (ALL i:nat. i < length(xs)--> <nth(i, xs), nth(i,ys)>:r)  \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   316
\     --> <xs, ys> : gen_prefix(A, r)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   317
by (induct_tac "xs" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   318
by (ALLGOALS (asm_simp_tac (simpset() addsimps [lt_succ_eq_0_disj]))); 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   319
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   320
by (case_tac "x=[]" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   321
by (ALLGOALS(asm_full_simp_tac (simpset() addsimps [neq_Nil_iff])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   322
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   323
by (dres_inst_tac [("x", "ys")] bspec 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   324
by (ALLGOALS(Clarify_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   325
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   326
qed_spec_mp "nth_imp_gen_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   327
d9320fb0a570 New files
ehmety
parents:
diff changeset
   328
Goal "(<xs,ys>: gen_prefix(A,r)) <-> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   329
\ (xs:list(A) & ys:list(A) & length(xs) le length(ys) & \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   330
\ (ALL i:nat. i < length(xs) --> <nth(i,xs), nth(i, ys)>: r))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   331
by (rtac iffI 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   332
by (forward_tac [gen_prefix.dom_subset RS subsetD] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   333
by (forward_tac [gen_prefix_length_le] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   334
by (ALLGOALS(Clarify_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   335
by (rtac nth_imp_gen_prefix 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   336
by (dtac (rotate_prems 4 gen_prefix_imp_nth) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   337
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   338
qed "gen_prefix_iff_nth";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   339
d9320fb0a570 New files
ehmety
parents:
diff changeset
   340
(** prefix is a partial order: **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   341
d9320fb0a570 New files
ehmety
parents:
diff changeset
   342
Goalw [prefix_def] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   343
   "refl(list(A), prefix(A))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   344
by (rtac refl_gen_prefix 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   345
by (auto_tac (claset(), simpset() addsimps [refl_def]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   346
qed "refl_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   347
Addsimps [refl_prefix RS reflD];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   348
d9320fb0a570 New files
ehmety
parents:
diff changeset
   349
Goalw [prefix_def] "trans(prefix(A))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   350
by (rtac trans_gen_prefix 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   351
by (auto_tac (claset(), simpset() addsimps [trans_def]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   352
qed "trans_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   353
d9320fb0a570 New files
ehmety
parents:
diff changeset
   354
bind_thm("prefix_trans", trans_prefix RS transD);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   355
d9320fb0a570 New files
ehmety
parents:
diff changeset
   356
Goalw [prefix_def] "trans[list(A)](prefix(A))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   357
by (rtac trans_on_gen_prefix 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   358
by (auto_tac (claset(), simpset() addsimps [trans_def]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   359
qed "trans_on_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   360
d9320fb0a570 New files
ehmety
parents:
diff changeset
   361
bind_thm("prefix_trans_on", trans_on_prefix RS trans_onD);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   362
d9320fb0a570 New files
ehmety
parents:
diff changeset
   363
(* Monotonicity of "set" operator WRT prefix *)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   364
d9320fb0a570 New files
ehmety
parents:
diff changeset
   365
Goalw [prefix_def] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   366
"<xs,ys>:prefix(A) ==> set_of_list(xs) <= set_of_list(ys)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   367
by (etac gen_prefix.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   368
by (subgoal_tac "xs:list(A)&ys:list(A)" 3);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   369
by (blast_tac (claset() addDs [gen_prefix.dom_subset RS subsetD]) 4);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   370
by (auto_tac (claset(), simpset() addsimps [set_of_list_append]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   371
qed "set_of_list_prefix_mono";  
d9320fb0a570 New files
ehmety
parents:
diff changeset
   372
d9320fb0a570 New files
ehmety
parents:
diff changeset
   373
(** recursion equations **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   374
d9320fb0a570 New files
ehmety
parents:
diff changeset
   375
Goalw [prefix_def] "xs:list(A) ==> <[],xs>:prefix(A)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   376
by (asm_simp_tac (simpset() addsimps [Nil_gen_prefix]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   377
qed "Nil_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   378
Addsimps[Nil_prefix];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   379
d9320fb0a570 New files
ehmety
parents:
diff changeset
   380
d9320fb0a570 New files
ehmety
parents:
diff changeset
   381
Goalw [prefix_def] "<xs, []>:prefix(A) <-> (xs = [])";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   382
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   383
by (forward_tac [gen_prefix.dom_subset RS subsetD] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   384
by (dres_inst_tac [("psi", "<xs, []>:gen_prefix(A, id(A))")] asm_rl 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   385
by (asm_full_simp_tac (simpset() addsimps [gen_prefix_Nil]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   386
qed "prefix_Nil";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   387
AddIffs [prefix_Nil];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   388
d9320fb0a570 New files
ehmety
parents:
diff changeset
   389
Goalw [prefix_def] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   390
"<Cons(x,xs), Cons(y,ys)>:prefix(A) <-> (x=y & <xs,ys>:prefix(A) & y:A)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   391
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   392
qed"Cons_prefix_Cons";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   393
AddIffs [Cons_prefix_Cons];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   394
d9320fb0a570 New files
ehmety
parents:
diff changeset
   395
Goalw [prefix_def] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   396
"xs:list(A)==> <xs@ys,xs@zs>:prefix(A) <-> (<ys,zs>:prefix(A))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   397
by (subgoal_tac "refl(A,id(A))" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   398
by (Asm_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   399
by (auto_tac (claset(), simpset() addsimps[refl_def]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   400
qed "same_prefix_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   401
Addsimps [same_prefix_prefix];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   402
d9320fb0a570 New files
ehmety
parents:
diff changeset
   403
Goal "xs:list(A) ==> <xs@ys,xs>:prefix(A) <-> (<ys,[]>:prefix(A))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   404
by (res_inst_tac [("P", "%x. <?u, x>:?v <-> ?w(x)")] (app_right_Nil RS subst) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   405
by (rtac same_prefix_prefix 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   406
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   407
qed "same_prefix_prefix_Nil";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   408
Addsimps [same_prefix_prefix_Nil];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   409
d9320fb0a570 New files
ehmety
parents:
diff changeset
   410
Goalw [prefix_def] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   411
"[| <xs,ys>:prefix(A); zs:list(A) |] ==> <xs,ys@zs>:prefix(A)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   412
by (etac gen_prefix.append 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   413
by (assume_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   414
qed "prefix_appendI";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   415
Addsimps [prefix_appendI];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   416
d9320fb0a570 New files
ehmety
parents:
diff changeset
   417
Goalw [prefix_def] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   418
"[| xs:list(A); ys:list(A); y:A |] ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   419
\ <xs,Cons(y,ys)>:prefix(A) <-> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   420
\ (xs=[] | (EX zs. xs=Cons(y,zs) & <zs,ys>:prefix(A)))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   421
by (auto_tac (claset(), simpset() addsimps [gen_prefix_Cons]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   422
qed "prefix_Cons";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   423
d9320fb0a570 New files
ehmety
parents:
diff changeset
   424
Goalw [prefix_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   425
  "[| <xs,ys>:prefix(A); length(xs) < length(ys) |] \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   426
\ ==> <xs @ [nth(length(xs),ys)], ys>:prefix(A)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   427
by (subgoal_tac "refl(A, id(A))" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   428
by (asm_simp_tac (simpset() addsimps [append_one_gen_prefix]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   429
by (auto_tac (claset(), simpset() addsimps [refl_def]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   430
qed "append_one_prefix";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   431
d9320fb0a570 New files
ehmety
parents:
diff changeset
   432
Goalw [prefix_def] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   433
"<xs,ys>:prefix(A) ==> length(xs) le length(ys)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   434
by (blast_tac (claset() addDs [gen_prefix_length_le]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   435
qed "prefix_length_le";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   436
d9320fb0a570 New files
ehmety
parents:
diff changeset
   437
Goalw [prefix_def] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   438
"<xs,ys>:prefix(A) ==> xs~=ys --> length(xs) < length(ys)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   439
by (etac gen_prefix.induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   440
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   441
by (ALLGOALS(subgoal_tac "ys:list(A)&xs:list(A)"));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   442
by (auto_tac (claset() addDs [gen_prefix.dom_subset RS subsetD], 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   443
             simpset() addsimps [length_app, length_type]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   444
by (subgoal_tac "length(zs)=0" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   445
by (dtac not_lt_imp_le 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   446
by (res_inst_tac [("j", "length(ys)")] lt_trans2 5);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   447
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   448
val lemma = result();
d9320fb0a570 New files
ehmety
parents:
diff changeset
   449
d9320fb0a570 New files
ehmety
parents:
diff changeset
   450
Goalw [prefix_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   451
"prefix(A)<=list(A)*list(A)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   452
by (blast_tac (claset() addSIs [gen_prefix.dom_subset]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   453
qed "prefix_type";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   454
d9320fb0a570 New files
ehmety
parents:
diff changeset
   455
Goalw [strict_prefix_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   456
"strict_prefix(A) <= list(A)*list(A)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   457
by (blast_tac (claset() addSIs [prefix_type RS subsetD]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   458
qed "strict_prefix_type";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   459
d9320fb0a570 New files
ehmety
parents:
diff changeset
   460
Goalw [strict_prefix_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   461
 "<xs,ys>:strict_prefix(A) ==> length(xs) < length(ys)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   462
by (resolve_tac [lemma RS mp] 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   463
by (auto_tac (claset() addDs [prefix_type RS subsetD], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   464
qed "strict_prefix_length_lt";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   465
d9320fb0a570 New files
ehmety
parents:
diff changeset
   466
(*Equivalence to the definition used in Lex/Prefix.thy*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   467
Goalw [prefix_def]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   468
"<xs,zs>:prefix(A) <-> (EX ys:list(A). zs = xs@ys) & xs:list(A)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   469
by (auto_tac (claset(),
d9320fb0a570 New files
ehmety
parents:
diff changeset
   470
       simpset() addsimps [gen_prefix_iff_nth, 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   471
                           nth_append, nth_type, app_type, length_app]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   472
by (subgoal_tac "length(xs):nat&length(zs):nat & \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   473
\                drop(length(xs), zs):list(A)" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   474
by (res_inst_tac [("x", "drop(length(xs), zs)")] bexI 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   475
by (ALLGOALS(Clarify_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   476
by (asm_simp_tac (simpset() addsimps [length_type, drop_type]) 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   477
by (rtac nth_equalityI 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   478
by (ALLGOALS (asm_simp_tac (simpset() addsimps 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   479
           [nth_append, app_type, drop_type, length_app, length_drop])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   480
by (rtac (nat_diff_split RS iffD2) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   481
by (ALLGOALS(Asm_full_simp_tac));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   482
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   483
by (dres_inst_tac [("i", "length(zs)")] leI 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   484
by (force_tac (claset(), simpset() addsimps [le_subset_iff]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   485
by Safe_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   486
by (Blast_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   487
by (subgoal_tac "length(xs) #+ (x #- length(xs)) = x" 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   488
by (rtac (nth_drop RS ssubst) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   489
by (ALLGOALS(asm_simp_tac (simpset() addsimps [leI])));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   490
by (rtac (nat_diff_split RS iffD2) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   491
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   492
qed "prefix_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   493
d9320fb0a570 New files
ehmety
parents:
diff changeset
   494
Goal 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   495
"[|xs:list(A); ys:list(A); y:A |] ==> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   496
\  <xs, ys@[y]>:prefix(A) <-> (xs = ys@[y] | <xs,ys>:prefix(A))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   497
by (simp_tac (simpset() addsimps [prefix_iff]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   498
by (rtac iffI 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   499
by (Clarify_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   500
by (eres_inst_tac [("xs", "ysa")] rev_list_elim 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   501
by (Asm_full_simp_tac 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   502
by (dres_inst_tac [("psi", "ya:list(A)")] asm_rl 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   503
by (rotate_tac ~1 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   504
by (asm_full_simp_tac (simpset() addsimps
d9320fb0a570 New files
ehmety
parents:
diff changeset
   505
           [app_type, app_assoc RS sym] delsimps [app_assoc]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   506
by (auto_tac (claset(), simpset() addsimps [app_assoc, app_type]));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   507
qed "prefix_snoc";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   508
Addsimps [prefix_snoc];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   509
d9320fb0a570 New files
ehmety
parents:
diff changeset
   510
d9320fb0a570 New files
ehmety
parents:
diff changeset
   511
Goal "zs:list(A) ==> ALL xs:list(A). ALL ys:list(A). \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   512
\  (<xs, ys@zs>:prefix(A)) <-> \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   513
\ (<xs,ys>:prefix(A) | (EX us. xs = ys@us & <us,zs>:prefix(A)))";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   514
by (etac list_append_induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   515
by (Clarify_tac 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   516
by (rtac iffI 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   517
by (asm_full_simp_tac (simpset()  delsimps [app_assoc]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   518
                                 addsimps [app_assoc RS sym]) 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   519
by (etac disjE 2 THEN etac disjE 3);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   520
by (rtac disjI2 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   521
by (res_inst_tac [("x", "y @ [x]")] exI 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   522
by (asm_full_simp_tac (simpset()  delsimps [app_assoc]
d9320fb0a570 New files
ehmety
parents:
diff changeset
   523
                                 addsimps [app_assoc RS sym]) 2);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   524
by (REPEAT(Force_tac 1));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   525
qed_spec_mp "prefix_append_iff";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   526
d9320fb0a570 New files
ehmety
parents:
diff changeset
   527
d9320fb0a570 New files
ehmety
parents:
diff changeset
   528
(*Although the prefix ordering is not linear, the prefixes of a list
d9320fb0a570 New files
ehmety
parents:
diff changeset
   529
  are linearly ordered.*)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   530
Goal "[| zs:list(A); xs:list(A); ys:list(A) |] \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   531
\  ==> <xs, zs>:prefix(A) --> <ys,zs>:prefix(A) \
d9320fb0a570 New files
ehmety
parents:
diff changeset
   532
\ --><xs,ys>:prefix(A) | <ys,xs>:prefix(A)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   533
by (etac list_append_induct 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   534
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   535
qed_spec_mp "common_prefix_linear";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   536
d9320fb0a570 New files
ehmety
parents:
diff changeset
   537
d9320fb0a570 New files
ehmety
parents:
diff changeset
   538
(*** pfixLe, pfixGe: properties inherited from the translations ***)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   539
d9320fb0a570 New files
ehmety
parents:
diff changeset
   540
d9320fb0a570 New files
ehmety
parents:
diff changeset
   541
d9320fb0a570 New files
ehmety
parents:
diff changeset
   542
(** pfixLe **)
d9320fb0a570 New files
ehmety
parents:
diff changeset
   543
d9320fb0a570 New files
ehmety
parents:
diff changeset
   544
Goalw [refl_def, Le_def] "refl(nat,Le)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   545
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   546
qed "refl_Le";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   547
AddIffs [refl_Le];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   548
d9320fb0a570 New files
ehmety
parents:
diff changeset
   549
Goalw [antisym_def, Le_def] "antisym(Le)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   550
by (auto_tac (claset() addIs [le_anti_sym], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   551
qed "antisym_Le";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   552
AddIffs [antisym_Le];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   553
d9320fb0a570 New files
ehmety
parents:
diff changeset
   554
Goalw [trans_def, Le_def] "trans(Le)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   555
by (auto_tac (claset() addIs [le_trans], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   556
qed "trans_Le";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   557
AddIffs [trans_Le];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   558
d9320fb0a570 New files
ehmety
parents:
diff changeset
   559
Goal "x:list(nat) ==> x pfixLe x";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   560
by (blast_tac (claset() addIs [refl_gen_prefix RS reflD]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   561
qed "pfixLe_refl";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   562
Addsimps[pfixLe_refl];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   563
d9320fb0a570 New files
ehmety
parents:
diff changeset
   564
Goal "[| x pfixLe y; y pfixLe z |] ==> x pfixLe z";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   565
by (blast_tac (claset() addIs [trans_gen_prefix RS transD]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   566
qed "pfixLe_trans";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   567
d9320fb0a570 New files
ehmety
parents:
diff changeset
   568
Goal "[| x pfixLe y; y pfixLe x |] ==> x = y";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   569
by (blast_tac (claset() addIs [antisym_gen_prefix RS antisymE]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   570
qed "pfixLe_antisym";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   571
d9320fb0a570 New files
ehmety
parents:
diff changeset
   572
d9320fb0a570 New files
ehmety
parents:
diff changeset
   573
Goalw [prefix_def, Le_def] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   574
"<xs,ys>:prefix(nat)==> xs pfixLe ys";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   575
by (rtac (gen_prefix_mono RS subsetD) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   576
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   577
qed "prefix_imp_pfixLe";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   578
d9320fb0a570 New files
ehmety
parents:
diff changeset
   579
Goalw [refl_def, Ge_def] "refl(nat, Ge)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   580
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   581
qed "refl_Ge";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   582
AddIffs [refl_Ge];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   583
d9320fb0a570 New files
ehmety
parents:
diff changeset
   584
Goalw [antisym_def, Ge_def] "antisym(Ge)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   585
by (auto_tac (claset() addIs [le_anti_sym], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   586
qed "antisym_Ge";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   587
AddIffs [antisym_Ge];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   588
d9320fb0a570 New files
ehmety
parents:
diff changeset
   589
Goalw [trans_def, Ge_def] "trans(Ge)";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   590
by (auto_tac (claset() addIs [le_trans], simpset()));
d9320fb0a570 New files
ehmety
parents:
diff changeset
   591
qed "trans_Ge";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   592
AddIffs [trans_Ge];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   593
d9320fb0a570 New files
ehmety
parents:
diff changeset
   594
Goal "x:list(nat) ==> x pfixGe x";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   595
by (blast_tac (claset() addIs [refl_gen_prefix RS reflD]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   596
qed "pfixGe_refl";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   597
Addsimps[pfixGe_refl];
d9320fb0a570 New files
ehmety
parents:
diff changeset
   598
d9320fb0a570 New files
ehmety
parents:
diff changeset
   599
Goal "[| x pfixGe y; y pfixGe z |] ==> x pfixGe z";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   600
by (blast_tac (claset() addIs [trans_gen_prefix RS transD]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   601
qed "pfixGe_trans";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   602
d9320fb0a570 New files
ehmety
parents:
diff changeset
   603
Goal "[| x pfixGe y; y pfixGe x |] ==> x = y";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   604
by (blast_tac (claset() addIs [antisym_gen_prefix RS antisymE]) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   605
qed "pfixGe_antisym";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   606
d9320fb0a570 New files
ehmety
parents:
diff changeset
   607
Goalw [prefix_def, Ge_def] 
d9320fb0a570 New files
ehmety
parents:
diff changeset
   608
  "<xs,ys>:prefix(nat) ==> xs pfixGe ys";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   609
by (rtac (gen_prefix_mono RS subsetD) 1);
d9320fb0a570 New files
ehmety
parents:
diff changeset
   610
by Auto_tac;
d9320fb0a570 New files
ehmety
parents:
diff changeset
   611
qed "prefix_imp_pfixGe";
d9320fb0a570 New files
ehmety
parents:
diff changeset
   612
d9320fb0a570 New files
ehmety
parents:
diff changeset
   613
d9320fb0a570 New files
ehmety
parents:
diff changeset
   614
d9320fb0a570 New files
ehmety
parents:
diff changeset
   615
d9320fb0a570 New files
ehmety
parents:
diff changeset
   616
d9320fb0a570 New files
ehmety
parents:
diff changeset
   617