src/HOL/Modelcheck/MuckeSyn.thy
author bulwahn
Mon, 11 May 2009 09:18:42 +0200
changeset 31106 9a1178204dc0
parent 28290 4cc2b6046258
child 32010 cb1a1c94b4cd
permissions -rw-r--r--
Added pred_code command
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
     1
(*  Title:      HOL/Modelcheck/MuckeSyn.thy
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
     2
    ID:         $Id$
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
     3
    Author:     Tobias Hamberger
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
     4
    Copyright   1999  TU Muenchen
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
     5
*)
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
     6
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
     7
theory MuckeSyn
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
     8
imports MuCalculus
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
     9
uses "mucke_oracle.ML"
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    10
begin
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    11
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    12
(* extended with some operators and case treatment (which requires postprocessing with
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    13
transform_case (from MuCalculus) (TH) *)
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    14
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    15
nonterminals
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    16
  mutype
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    17
  decl decls
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    18
  cases_syn case_syn
10125
wenzelm
parents: 9368
diff changeset
    19
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    20
syntax (Mucke output)
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    21
  True          :: bool                                 ("true")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    22
  False         :: bool                                 ("false")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    23
  Not           :: "bool => bool"                       ("! _" [40] 40)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    24
  If            :: "[bool, 'a, 'a] => 'a"       ("('(if'((_)')/ '((_)')/ else/ '((_)'))')" 10)
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    25
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    26
  "op &"        :: "[bool, bool] => bool"               (infixr "&" 35)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    27
  "op |"        :: "[bool, bool] => bool"               (infixr "|" 30)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    28
  "op -->"      :: "[bool, bool] => bool"               (infixr "->" 25)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    29
  "op ="        :: "['a, 'a] => bool"                   ("(_ =/ _)" [51, 51] 50)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    30
  "_not_equal"  :: "['a, 'a] => bool"                   ("(_ !=/ _)" [51, 51] 50)
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    31
21524
7843e2fd14a9 updated (binder) syntax/notation;
wenzelm
parents: 17272
diff changeset
    32
  All_binder    :: "[idts, bool] => bool"               ("'((3forall _./ _)')" [0, 10] 10)
7843e2fd14a9 updated (binder) syntax/notation;
wenzelm
parents: 17272
diff changeset
    33
  Ex_binder     :: "[idts, bool] => bool"               ("'((3exists _./ _)')" [0, 10] 10)
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    34
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    35
  "_lambda"     :: "[idts, 'a] => 'b"                   ("(3L _./ _)" 10)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    36
  "_applC"      :: "[('b => 'a), cargs] => aprop"       ("(1_/ '(_'))" [1000,1000] 999)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    37
  "_cargs"      :: "['a, cargs] => cargs"               ("_,/ _" [1000,1000] 1000)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    38
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    39
  "_idts"       :: "[idt, idts] => idts"                ("_,/ _" [1, 0] 0)
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    40
9368
415587dff134 adapted tuple syntax;
wenzelm
parents: 9060
diff changeset
    41
  "_tuple"      :: "'a => tuple_args => 'a * 'b"        ("(1_,/ _)")
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    42
(* "@pttrn"     :: "[pttrn, pttrns] => pttrn"           ("_,/ _" [1, 0] 0)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    43
  "_pattern"    :: "[pttrn, patterns] => pttrn"         ("_,/ _" [1, 0] 0) *)
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    44
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    45
  "_decl"       :: "[mutype,pttrn] => decl"             ("_ _")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    46
  "_decls"      :: "[decl,decls] => decls"              ("_,/ _")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    47
  ""            :: "decl => decls"                      ("_")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    48
  "_mu"         :: "[decl,decls,'a pred] => 'a pred"    ("mu _ '(_') _ ;")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    49
  "_mudec"      :: "[decl,decls] => 'a pred"            ("mu _ '(_') ;")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    50
  "_nu"         :: "[decl,decls,'a pred] => 'a pred"    ("nu _ '(_') _ ;")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    51
  "_nudec"      :: "[decl,decls] => 'a pred"            ("nu _ '(_') ;")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    52
  "_fun"        :: "[decl,decls,'a pred] => 'a pred"    ("_ '(_') _ ;")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    53
  "_dec"        :: "[decl,decls] => 'a pred"            ("_ '(_') ;")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    54
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    55
  "_Ex"         :: "[decl,idts,'a pred] => 'a pred"     ("'((3exists _ _./ _)')")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    56
  "_All"        :: "[decl,idts,'a pred] => 'a pred"     ("'((3forall _ _./ _)')")
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    57
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    58
  "Mu "         :: "[idts, 'a pred] => 'a pred"         ("(3mu _./ _)" 1000)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    59
  "Nu "         :: "[idts, 'a pred] => 'a pred"         ("(3nu _./ _)" 1000)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    60
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    61
  "_case_syntax":: "['a, cases_syn] => 'b"              ("(case*_* / _ / esac*)" 10)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    62
  "_case1"      :: "['a, 'b] => case_syn"               ("(2*= _ :/ _;)" 10)
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    63
  ""            :: "case_syn => cases_syn"              ("_")
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    64
  "_case2"      :: "[case_syn, cases_syn] => cases_syn" ("_/ _")
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    65
17272
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    66
(*Terms containing a case statement must be post-processed with the
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    67
  ML function transform_case. There, all asterikses before the "="
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    68
  will be replaced by the expression between the two asterisks
c63e5220ed77 converted to Isar theory format;
wenzelm
parents: 14854
diff changeset
    69
  following "case" and the asterisk after esac will be deleted *)
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    70
28290
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 28263
diff changeset
    71
oracle mc_mucke_oracle = mk_mc_mucke_oracle
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
    72
22819
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    73
ML {*
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    74
(* search_mu t searches for Mu terms in term t. In the case of nested Mu's,
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    75
   it yields innermost one. If no Mu term is present, search_mu yields NONE
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    76
*)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    77
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    78
(* extended for treatment of nu (TH) *)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    79
fun search_mu ((Const("MuCalculus.mu",tp)) $ t2) = 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    80
	(case (search_mu t2) of
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    81
	      SOME t => SOME t 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    82
	    | NONE => SOME ((Const("MuCalculus.mu",tp)) $ t2))
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    83
  | search_mu ((Const("MuCalculus.nu",tp)) $ t2) =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    84
        (case (search_mu t2) of
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    85
              SOME t => SOME t
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    86
            | NONE => SOME ((Const("MuCalculus.nu",tp)) $ t2))
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    87
  | search_mu (t1 $ t2) = 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    88
	(case (search_mu t1) of
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    89
	      SOME t => SOME t 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    90
	    | NONE     => search_mu t2)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    91
  | search_mu (Abs(_,_,t)) = search_mu t
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    92
  | search_mu _ = NONE;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    93
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    94
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    95
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    96
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    97
(* seraching a variable in a term. Used in move_mus to extract the
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    98
   term-rep of var b in hthm *)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
    99
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   100
fun search_var s t =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   101
case t of
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   102
     t1 $ t2 => (case (search_var s t1) of
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   103
		             SOME tt => SOME tt |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   104
			     NONE => search_var s t2) |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   105
     Abs(_,_,t) => search_var s t |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   106
     Var((s1,_),_) => if s = s1 then SOME t else NONE |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   107
     _ => NONE;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   108
	
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   109
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   110
(* function move_mus:
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   111
   Mucke can't deal with nested Mu terms. move_mus i searches for 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   112
   Mu terms in the subgoal i and replaces Mu terms in the conclusion
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   113
   by constants and definitions in the premises recursively.
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   114
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   115
   move_thm is the theorem the performs the replacement. To create NEW
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   116
   names for the Mu terms, the indizes of move_thm are incremented by
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   117
   max_idx of the subgoal.
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   118
*)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   119
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   120
local
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   121
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   122
  val move_thm = prove_goal (the_context ()) "[| a = b ==> P a; a = b |] ==> P b"
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   123
	(fn prems => [cut_facts_tac prems 1, dtac sym 1, hyp_subst_tac 1,
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   124
		     REPEAT (resolve_tac prems 1)]);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   125
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   126
  val sig_move_thm = Thm.theory_of_thm move_thm;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   127
  val bCterm = cterm_of sig_move_thm (valOf (search_var "b" (concl_of move_thm)));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   128
  val aCterm = cterm_of sig_move_thm (valOf (search_var "a" (hd(prems_of move_thm)))); 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   129
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   130
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   131
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   132
fun move_mus i state =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   133
let val sign = Thm.theory_of_thm state;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   134
    val (subgoal::_) = Library.drop(i-1,prems_of state);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   135
    val concl = Logic.strip_imp_concl subgoal; (* recursive mu's in prems? *)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   136
    val redex = search_mu concl;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   137
    val idx = let val t = #maxidx (rep_thm state) in 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   138
	      if t < 0 then 1 else t+1 end;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   139
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   140
case redex of
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   141
     NONE => all_tac state |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   142
     SOME redexterm => 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   143
	let val Credex = cterm_of sign redexterm;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   144
	    val aiCterm = 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   145
		cterm_of sig_move_thm (Logic.incr_indexes ([],idx) (term_of aCterm));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   146
	    val inst_move_thm = cterm_instantiate 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   147
				[(bCterm,Credex),(aCterm,aiCterm)] move_thm;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   148
	in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   149
            ((rtac inst_move_thm i) THEN (dtac eq_reflection i) 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   150
		THEN (move_mus i)) state
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   151
	end
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   152
end;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   153
end;
6466
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
   154
2eba94dc5951 added modelchecker mucke besides modelchecker eindhoven;
mueller
parents:
diff changeset
   155
28290
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 28263
diff changeset
   156
val call_mucke_tac = CSUBGOAL (fn (cgoal, i) =>
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 28263
diff changeset
   157
let val OraAss = mc_mucke_oracle cgoal
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 28263
diff changeset
   158
in cut_facts_tac [OraAss] i end);
22819
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   159
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   160
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   161
(* transforming fun-defs into lambda-defs *)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   162
26957
e3f04fdd994d eliminated theory CPure;
wenzelm
parents: 26939
diff changeset
   163
val [eq] = goal Pure.thy "(!! x. f x == g x) ==> f == g";
22819
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   164
 by (rtac (extensional eq) 1);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   165
qed "ext_rl";
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   166
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   167
infix cc;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   168
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   169
fun NONE cc xl = xl
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   170
  | (SOME x) cc xl = x::xl;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   171
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   172
fun getargs ((x $ y) $ (Var ((z,_),_))) = getargs (x $ y) ^ " " ^z
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   173
  | getargs (x $ (Var ((y,_),_))) = y;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   174
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   175
fun getfun ((x $ y) $ z) = getfun (x $ y)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   176
  | getfun (x $ _) = x;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   177
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   178
local
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   179
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   180
fun delete_bold [] = []
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   181
| delete_bold (x::xs) = if (is_prefix (op =) ("\^["::"["::"0"::"m"::[]) (x::xs))
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   182
        then (let val (_::_::_::s) = xs in delete_bold s end)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   183
        else (if (is_prefix (op =) ("\^["::"["::"1"::"m"::[]) (x::xs))
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   184
                then  (let val (_::_::_::s) = xs in delete_bold s end)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   185
                else (x::delete_bold xs));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   186
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   187
fun delete_bold_string s = implode(delete_bold (explode s));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   188
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   189
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   190
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   191
(* extension with removing bold font (TH) *)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   192
fun mk_lam_def (_::_) _ _ = NONE  
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   193
  | mk_lam_def [] ((Const("==",_) $ (Const _)) $ RHS) t = SOME t
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   194
  | mk_lam_def [] ((Const("==",_) $ LHS) $ RHS) t = 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   195
    let val thy = theory_of_thm t;
26939
1035c89b4c02 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26342
diff changeset
   196
	val fnam = Syntax.string_of_term_global thy (getfun LHS);
1035c89b4c02 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26342
diff changeset
   197
	val rhs = Syntax.string_of_term_global thy (freeze_thaw RHS)
22819
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   198
	val gl = delete_bold_string (fnam ^" == % " ^ (getargs LHS) ^" . " ^ rhs);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   199
    in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   200
	SOME (prove_goal thy gl (fn prems =>
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   201
  		[(REPEAT (rtac ext_rl 1)), (rtac t 1) ]))
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   202
    end
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   203
| mk_lam_def [] _ t= NONE; 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   204
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   205
fun mk_lam_defs ([]:thm list) = ([]: thm list) 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   206
  | mk_lam_defs (t::l) = 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   207
      (mk_lam_def (prems_of t) (concl_of t) t) cc (mk_lam_defs l);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   208
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   209
end;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   210
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   211
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   212
(* first simplification, then model checking *)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   213
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   214
val pair_eta_expand = Thm.symmetric (mk_meta_eq (thm "split_eta"));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   215
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   216
val pair_eta_expand_proc =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   217
  Simplifier.simproc (the_context ()) "pair_eta_expand" ["f::'a*'b=>'c"]
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   218
  (fn _ => fn _ => fn t => case t of Abs _ => SOME pair_eta_expand | _ => NONE);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   219
26342
0f65fa163304 more antiquotations;
wenzelm
parents: 22819
diff changeset
   220
val Mucke_ss = @{simpset} addsimprocs [pair_eta_expand_proc] addsimps [Let_def];
22819
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   221
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   222
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   223
(* the interface *)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   224
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   225
fun mc_mucke_tac defs i state =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   226
  (case Library.drop (i - 1, Thm.prems_of state) of
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   227
    [] => no_tac state
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   228
  | subgoal :: _ =>
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   229
      EVERY [
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   230
        REPEAT (etac thin_rl i),
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   231
        cut_facts_tac (mk_lam_defs defs) i,
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   232
        full_simp_tac (Mucke_ss delsimps [not_iff,split_part]) i,
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   233
        move_mus i, call_mucke_tac i,atac i,
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   234
        REPEAT (rtac refl i)] state);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   235
*}
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   236
a7b425bb668c removed legacy ML files;
wenzelm
parents: 21524
diff changeset
   237
end