src/HOL/Nominal/nominal_permeq.ML
author berghofe
Mon, 17 Oct 2005 12:30:57 +0200
changeset 17870 c35381811d5c
child 18012 23e6cfda8c4b
permissions -rw-r--r--
Initial revision.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17870
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
     1
(* $Id$ *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
     2
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
     3
(* METHOD FOR ANALYSING EQUATION INVOLVING PERMUTATION *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
     4
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
     5
local
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
     6
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
     7
(* applies the expand_fun_eq rule to the first goal and strips off all universal quantifiers *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
     8
val Expand_Fun_Eq_tac =    
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
     9
    ("extensionality on functions",
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    10
    EVERY [simp_tac (HOL_basic_ss addsimps [expand_fun_eq]) 1, REPEAT_DETERM (rtac allI 1)]);
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    11
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    12
(* applies the perm_compose rule - this rule would loop in the simplifier *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    13
fun Apply_Perm_Compose_tac ctxt = 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    14
    let 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    15
	val perm_compose = PureThy.get_thm (ProofContext.theory_of ctxt) (Name ("perm_compose"));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    16
    in ("analysing permutation compositions",rtac (perm_compose RS trans)  1)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    17
    end;
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    18
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    19
(* unfolds the definition of permutations applied to functions *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    20
fun Unfold_Perm_Fun_Def_tac ctxt = 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    21
    let 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    22
	val perm_fun_def = PureThy.get_thm (ProofContext.theory_of ctxt) (Name ("nominal.perm_fun_def"))
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    23
    in ("unfolding of perms on functions", simp_tac (HOL_basic_ss addsimps [perm_fun_def]) 1)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    24
    end
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    25
    
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    26
(* applies the perm_eq_lam and perm_eq_app simplifications *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    27
fun Apply_SimProc_tac ctxt = 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    28
    let
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    29
        val thy = ProofContext.theory_of ctxt;
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    30
	val perm_app_eq = PureThy.get_thm thy (Name ("perm_app_eq"));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    31
        val perm_lam_eq = PureThy.get_thm thy (Name ("perm_eq_lam"));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    32
    in
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    33
	("simplification of permutation on applications and lambdas", 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    34
	 asm_full_simp_tac (HOL_basic_ss addsimps [perm_app_eq,perm_lam_eq]) 1)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    35
    end;
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    36
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    37
(* applying Stefan's smart congruence tac *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    38
val Apply_Cong_tac = ("application of congruence",
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    39
                     (fn st => DatatypeAux.cong_tac  1 st handle Subscript => no_tac st));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    40
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    41
(* initial simplification step in the tactic *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    42
fun Initial_Simp_tac thms ctxt =
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    43
    let
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    44
	val thy = ProofContext.theory_of ctxt;
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    45
	val perm_swap  = PureThy.get_thm thy (Name ("perm_swap"));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    46
        val perm_fresh = PureThy.get_thm thy (Name ("perm_fresh_fresh"));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    47
        val perm_bij   = PureThy.get_thm thy (Name ("perm_bij"));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    48
        val simps = (local_simpset_of ctxt) addsimps (thms @ [perm_swap,perm_fresh,perm_bij])
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    49
    in
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    50
      ("general simplification step", FIRST [rtac conjI 1, asm_full_simp_tac simps 1])
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    51
    end;
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    52
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    53
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    54
(* debugging *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    55
fun DEBUG_tac (msg,tac) = 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    56
    EVERY [print_tac ("before application of "^msg), CHANGED tac, print_tac ("after "^msg)]; 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    57
fun NO_DEBUG_tac (_,tac) = CHANGED tac; 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    58
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    59
(* Main Tactic *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    60
(* "repeating"-depth is set to 40 - this seems sufficient *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    61
fun perm_simp_tac tactical thms ctxt = 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    62
    REPEAT_DETERM_N 40 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    63
      (FIRST[tactical (Initial_Simp_tac thms ctxt),
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    64
             tactical (Apply_Perm_Compose_tac ctxt),
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    65
             tactical (Apply_SimProc_tac ctxt),
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    66
             tactical Apply_Cong_tac, 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    67
             tactical (Unfold_Perm_Fun_Def_tac ctxt),
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    68
             tactical Expand_Fun_Eq_tac]);
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    69
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    70
(* tactic that unfolds first the support definition *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    71
(* and then applies perm_simp                       *)
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    72
fun supports_tac tactical thms ctxt =
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    73
  let
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    74
    val thy = ProofContext.theory_of ctxt;
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    75
    val supports_def = PureThy.get_thm thy (Name ("nominal.op supports_def"));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    76
    val fresh_def    = PureThy.get_thm thy (Name ("nominal.fresh_def"));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    77
    val fresh_prod   = PureThy.get_thm thy (Name ("nominal.fresh_prod"));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    78
    val simps        = [supports_def,symmetric fresh_def,fresh_prod];
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    79
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    80
  in
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    81
      EVERY [tactical ("unfolding of supports",simp_tac (HOL_basic_ss addsimps simps) 1),
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    82
             tactical ("stripping of foralls " ,REPEAT_DETERM (rtac allI 1)),
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    83
             tactical ("geting rid of the imp",rtac impI 1),
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    84
             tactical ("eliminating conjuncts",REPEAT_DETERM (etac  conjE 1)),
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    85
             tactical ("applying perm_simp   ",perm_simp_tac tactical thms ctxt)]
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    86
  end;
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    87
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    88
in             
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    89
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    90
val perm_eq_meth = 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    91
    Method.thms_ctxt_args 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    92
	(fn thms => fn ctxt => Method.SIMPLE_METHOD (DETERM (perm_simp_tac NO_DEBUG_tac thms ctxt)));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    93
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    94
val perm_eq_meth_debug = 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    95
    Method.thms_ctxt_args 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    96
	(fn thms => fn ctxt => Method.SIMPLE_METHOD (DETERM (perm_simp_tac DEBUG_tac thms ctxt)));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    97
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    98
val supports_meth = 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
    99
    Method.thms_ctxt_args 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
   100
	(fn thms => fn ctxt => Method.SIMPLE_METHOD (DETERM (supports_tac NO_DEBUG_tac thms ctxt)));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
   101
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
   102
val supports_meth_debug = 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
   103
    Method.thms_ctxt_args 
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
   104
	(fn thms => fn ctxt => Method.SIMPLE_METHOD (DETERM (supports_tac DEBUG_tac thms ctxt)));
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
   105
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
   106
end
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
   107
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
   108
c35381811d5c Initial revision.
berghofe
parents:
diff changeset
   109