src/HOLCF/adm.ML
author paulson
Fri, 18 Feb 2000 15:35:29 +0100
changeset 8255 38f96394c099
parent 7652 2db14b7298c6
child 8411 d30df828a974
permissions -rw-r--r--
new distributive laws
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
     1
(*  Title:      HOLCF/adm.ML
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
     2
    ID:         $Id$
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
     3
    Author:     Stefan Berghofer, TU Muenchen
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
     4
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
     5
Admissibility tactic.
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
     6
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
     7
Checks whether adm_subst theorem is applicable to the current proof
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
     8
state:
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
     9
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    10
  [| cont t; adm P |] ==> adm (%x. P (t x))
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    11
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    12
"t" is instantiated with a term of chain-finite type, so that
4721
c8a8482a8124 renamed is_chain to chain, is_tord to tord, replaced chain_finite by chfin
oheimb
parents: 4039
diff changeset
    13
adm_chfin can be applied:
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    14
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    15
  adm (P::'a::{chfin,pcpo} => bool)
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    16
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    17
*)
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    18
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    19
signature ADM =
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    20
sig
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    21
  val adm_tac: (int -> tactic) -> int -> tactic
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    22
end;
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    23
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    24
structure Adm: ADM =
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    25
struct
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    26
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    27
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    28
(*** find_subterms t 0 []
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    29
     returns lists of terms with the following properties:
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    30
       1. all terms in the list are disjoint subterms of t
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    31
       2. all terms contain the variable which is bound at level 0
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    32
       3. all occurences of the variable which is bound at level 0
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    33
          are "covered" by a term in the list
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    34
     a list of integers is associated with every term which describes
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    35
     the "path" leading to the subterm (required for instantiation of
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    36
     the adm_subst theorem (see functions mk_term, inst_adm_subst_thm))
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    37
***)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    38
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    39
fun find_subterms (Bound i) lev path =
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    40
      if i = lev then [[(Bound 0, path)]]
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    41
      else []
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    42
  | find_subterms (t as (Abs (_, _, t2))) lev path =
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    43
      if filter (fn x => x<=lev)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    44
           (add_loose_bnos (t, 0, [])) = [lev] then
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    45
        [(incr_bv (~lev, 0, t), path)]::
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    46
        (find_subterms t2 (lev+1) (0::path))
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    47
      else find_subterms t2 (lev+1) (0::path)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    48
  | find_subterms (t as (t1 $ t2)) lev path =
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    49
      let val ts1 = find_subterms t1 lev (0::path);
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    50
          val ts2 = find_subterms t2 lev (1::path);
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    51
          fun combine [] y = []
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    52
            | combine (x::xs) ys =
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    53
                (map (fn z => x @ z) ys) @ (combine xs ys)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    54
      in
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    55
        (if filter (fn x => x<=lev)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    56
              (add_loose_bnos (t, 0, [])) = [lev] then
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    57
           [[(incr_bv (~lev, 0, t), path)]]
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    58
         else []) @
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    59
        (if ts1 = [] then ts2
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    60
         else if ts2 = [] then ts1
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    61
         else combine ts1 ts2)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    62
      end
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    63
  | find_subterms _ _ _ = [];
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    64
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    65
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    66
(*** make term for instantiation of predicate "P" in adm_subst theorem ***)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    67
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    68
fun make_term t path paths lev =
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    69
  if path mem paths then Bound lev
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    70
  else case t of
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    71
      (Abs (s, T, t1)) => Abs (s, T, make_term t1 (0::path) paths (lev+1))
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    72
    | (t1 $ t2) => (make_term t1 (0::path) paths lev) $
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    73
                   (make_term t2 (1::path) paths lev)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    74
    | t1 => t1;
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    75
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    76
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    77
(*** check whether all terms in list are equal ***)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    78
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    79
fun eq_terms [] = true
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    80
  | eq_terms (ts as (t, _) :: _) = forall (fn (t2, _) => t2 aconv t) ts;
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    81
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    82
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    83
(*figure out internal names*)
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    84
val chfin_pcpoS = Sign.intern_sort (sign_of HOLCF.thy) ["chfin", "pcpo"];
4005
8858c472691a internalized some names
oheimb
parents: 3655
diff changeset
    85
val cont_name = Sign.intern_const (sign_of HOLCF.thy) "cont";
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
    86
val adm_name = Sign.intern_const (sign_of HOLCF.thy) "adm";
4005
8858c472691a internalized some names
oheimb
parents: 3655
diff changeset
    87
8858c472691a internalized some names
oheimb
parents: 3655
diff changeset
    88
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    89
(*** check whether type of terms in list is chain finite ***)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    90
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    91
fun is_chfin sign T params ((t, _)::_) =
7652
2db14b7298c6 Sign.of_sort;
wenzelm
parents: 4721
diff changeset
    92
  let val parTs = map snd (rev params)
2db14b7298c6 Sign.of_sort;
wenzelm
parents: 4721
diff changeset
    93
  in Sign.of_sort sign (fastype_of1 (T::parTs, t), chfin_pcpoS) end;
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    94
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    95
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    96
(*** try to prove that terms in list are continuous
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    97
     if successful, add continuity theorem to list l ***)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    98
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
    99
fun prove_cont tac sign s T prems params (l, ts as ((t, _)::_)) =
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   100
  let val parTs = map snd (rev params);
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   101
       val contT = (T --> (fastype_of1 (T::parTs, t))) --> HOLogic.boolT;
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   102
       fun mk_all [] t = t
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   103
         | mk_all ((a,T)::Ts) t = (all T) $ (Abs (a, T, mk_all Ts t));
4005
8858c472691a internalized some names
oheimb
parents: 3655
diff changeset
   104
       val t = HOLogic.mk_Trueprop((Const (cont_name, contT)) $ (Abs(s, T, t)));
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   105
       val t' = mk_all params (Logic.list_implies (prems, t));
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   106
       val thm = prove_goalw_cterm [] (cterm_of sign t')
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   107
                  (fn ps => [cut_facts_tac ps 1, tac 1])
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   108
  in (ts, thm)::l end
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   109
  handle _ => l;
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   110
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   111
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   112
(*** instantiation of adm_subst theorem (a bit tricky)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   113
     NOTE: maybe unnecessary (if "cont_thm RS adm_subst" works properly) ***)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   114
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   115
fun inst_adm_subst_thm state i params s T subt t paths =
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   116
  let val {sign, maxidx, ...} = rep_thm state;
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   117
      val j = maxidx+1;
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   118
      val {tsig, ...} = Sign.rep_sg sign;
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   119
      val parTs = map snd (rev params);
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   120
      val rule = lift_rule (state, i) adm_subst;
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   121
      val types = the o (fst (types_sorts rule));
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   122
      val tT = types ("t", j);
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   123
      val PT = types ("P", j);
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   124
      fun mk_abs [] t = t
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   125
        | mk_abs ((a,T)::Ts) t = Abs (a, T, mk_abs Ts t);
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   126
      val tt = cterm_of sign (mk_abs (params @ [(s, T)]) subt);
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   127
      val Pt = cterm_of sign (mk_abs (params @ [(s, fastype_of1 (T::parTs, subt))])
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   128
                     (make_term t [] paths 0));
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   129
      val tye = Type.typ_match tsig ([], (tT, #T (rep_cterm tt)));
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   130
      val tye' = Type.typ_match tsig (tye, (PT, #T (rep_cterm Pt)));
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   131
      val ctye = map (fn (x, y) => (x, ctyp_of sign y)) tye';
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   132
      val tv = cterm_of sign (Var (("t", j), typ_subst_TVars tye' tT));
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   133
      val Pv = cterm_of sign (Var (("P", j), typ_subst_TVars tye' PT));
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   134
      val rule' = instantiate (ctye, [(tv, tt), (Pv, Pt)]) rule
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   135
  in rule' end;
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   136
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   137
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   138
(*** extract subgoal i from proof state ***)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   139
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   140
fun nth_subgoal i thm = nth_elem (i-1, prems_of thm);
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   141
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   142
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   143
(*** the admissibility tactic
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   144
     NOTE:
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   145
       (compose_tac (false, rule, 2) i) THEN
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   146
       (rtac cont_thm i) THEN ...
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   147
     could probably be replaced by
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   148
       (rtac (cont_thm RS adm_subst) 1) THEN ...
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   149
***)
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   150
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   151
fun try_dest_adm (Const _ $ (Const (name, _) $ Abs abs)) =
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   152
      if name = adm_name then Some abs else None
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   153
  | try_dest_adm _ = None;
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   154
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   155
fun adm_tac tac i state =
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   156
  state |>
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   157
  let val goali = nth_subgoal i state in
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   158
    (case try_dest_adm (Logic.strip_assums_concl goali) of
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   159
      None => no_tac
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   160
    | Some (s, T, t) =>
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   161
        let
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   162
          val sign = sign_of_thm state;
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   163
          val prems = Logic.strip_assums_hyp goali;
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   164
          val params = Logic.strip_params goali;
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   165
          val ts = find_subterms t 0 [];
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   166
          val ts' = filter eq_terms ts;
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   167
          val ts'' = filter (is_chfin sign T params) ts';
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   168
          val thms = foldl (prove_cont tac sign s T prems params) ([], ts'');
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   169
        in
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   170
          (case thms of
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   171
            ((ts as ((t', _)::_), cont_thm)::_) =>
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   172
              let
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   173
                val paths = map snd ts;
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   174
                val rule = inst_adm_subst_thm state i params s T t' t paths;
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   175
              in
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   176
                compose_tac (false, rule, 2) i THEN
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   177
                rtac cont_thm i THEN
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   178
                REPEAT (assume_tac i) THEN
4721
c8a8482a8124 renamed is_chain to chain, is_tord to tord, replaced chain_finite by chfin
oheimb
parents: 4039
diff changeset
   179
                rtac adm_chfin i
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   180
              end 
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   181
          | [] => no_tac)
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   182
        end)
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   183
    end;
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   184
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   185
3655
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   186
end;
0531f2c64c91 new extended adm tactic introduced;
mueller
parents:
diff changeset
   187
4039
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   188
0db9f1098fd6 fixed try_dest_adm;
wenzelm
parents: 4005
diff changeset
   189
open Adm;