src/Provers/linorder.ML
author kleing
Sun, 06 Apr 2003 21:16:50 +0200
changeset 13901 af38553e61ee
parent 13735 7de9342aca7a
child 13941 2ae108fcd068
permissions -rw-r--r--
use 2 processors on sunbroy1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
     1
(*
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
     2
  Title:	Transitivity reasoner for linear orders
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
     3
  Id:		$Id$
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
     4
  Author:	Clemens Ballarin, started 8 November 2002
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
     5
  Copyright:	TU Muenchen
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
     6
*)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
     7
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
     8
(***
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
     9
This is a very simple package for transitivity reasoning over linear orders.
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    10
Simple means exponential time (and space) in the number of premises.
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    11
Should be replaced by a graph-theoretic algorithm.
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    12
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    13
The package provides a tactic trans_tac that uses all premises of the form
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    14
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    15
  t = u, t < u, t <= u, ~(t < u) and ~(t <= u)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    16
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    17
to
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    18
1. either derive a contradiction,
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    19
   in which case the conclusion can be any term,
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    20
2. or prove the conclusion, which must be of the same form as the premises.
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    21
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    22
To get rid of ~= in the premises, it is advisable to use an elimination
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    23
rule of the form
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    24
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    25
  [| t ~= u; t < u ==> P; u < t ==> P |] ==> P.
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    26
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    27
The package is implemented as an ML functor and thus not limited to the
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    28
relation <= and friends.  It can be instantiated to any total order ---
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    29
for example, the divisibility relation "dvd".
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    30
***)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    31
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    32
(*** Credits ***
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    33
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    34
This package is closely based on a (no longer used) transitivity reasoner for
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    35
the natural numbers, which was written by Tobias Nipkow.
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    36
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    37
****************)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    38
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    39
signature LESS_ARITH =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    40
sig
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    41
  val less_reflE: thm  (* x < x ==> P *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    42
  val le_refl: thm  (* x <= x *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    43
  val less_imp_le: thm (* x <= y ==> x < y *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    44
  val not_lessI: thm (* y <= x  ==> ~(x < y) *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    45
  val not_leI: thm (* y < x  ==> ~(x <= y) *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    46
  val not_lessD: thm (* ~(x < y) ==> y <= x *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    47
  val not_leD: thm (* ~(x <= y) ==> y < x *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    48
  val eqI: thm (* [| x <= y; y <= x |] ==> x = y *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    49
  val eqD1: thm (* x = y ==> x <= y *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    50
  val eqD2: thm (* x = y ==> y <= x *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    51
  val less_trans: thm  (* [| x <= y; y <= z |] ==> x <= z *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    52
  val less_le_trans: thm  (* [| x <= y; y < z |] ==> x < z *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    53
  val le_less_trans: thm  (* [| x < y; y <= z |] ==> x < z *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    54
  val le_trans: thm  (* [| x < y; y < z |] ==> x < z *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    55
  val decomp: term -> (term * string * term) option
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    56
    (* decomp (`x Rel y') should yield (x, Rel, y)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    57
       where Rel is one of "<", "<=", "~<", "~<=", "=" and "~="
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    58
       other relation symbols are ignored *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    59
end;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    60
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    61
signature TRANS_TAC =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    62
sig
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    63
  val trans_tac: int -> tactic
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    64
end;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    65
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    66
functor Trans_Tac_Fun (Less: LESS_ARITH): TRANS_TAC =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    67
struct
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    68
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    69
(*** Proof objects ***)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    70
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    71
datatype proof
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    72
  = Asm of int
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    73
  | Thm of proof list * thm;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    74
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    75
(* Turn proof objects into theorems *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    76
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    77
fun prove asms =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    78
  let fun pr (Asm i) = nth_elem (i, asms)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    79
        | pr (Thm (prfs, thm)) = (map pr prfs) MRS thm
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    80
  in pr end;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    81
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    82
(*** Exceptions ***)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    83
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    84
exception Contr of proof;  (* Raised when contradiction is found *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    85
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    86
exception Cannot;  (* Raised when goal cannot be proved *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    87
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    88
(*** Internal representation of inequalities ***)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    89
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    90
datatype less
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    91
  = Less of term * term * proof
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    92
  | Le of term * term * proof;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    93
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    94
fun lower (Less (x, _, _)) = x
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    95
  | lower (Le (x, _, _)) = x;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    96
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    97
fun upper (Less (_, y, _)) = y
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    98
  | upper (Le (_, y, _)) = y;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
    99
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   100
infix subsumes;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   101
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   102
fun (Less (x, y, _)) subsumes (Le (x', y', _)) = (x = x' andalso y = y')
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   103
  | (Less (x, y, _)) subsumes (Less (x', y', _)) = (x = x' andalso y = y')
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   104
  | (Le (x, y, _)) subsumes (Le (x', y', _)) = (x = x' andalso y = y')
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   105
  | _ subsumes _ = false;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   106
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   107
fun trivial (Le (x, x', _)) = (x = x')
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   108
  | trivial _ = false;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   109
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   110
(*** Transitive closure ***)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   111
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   112
fun add new =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   113
  let fun adds([], news) = new::news
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   114
        | adds(old::olds, news) = if new subsumes old then adds(olds, news)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   115
                                  else adds(olds, old::news)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   116
  in adds end;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   117
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   118
fun ctest (less as Less (x, x', p)) = 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   119
    if x = x' then raise Contr (Thm ([p], Less.less_reflE))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   120
    else less
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   121
  | ctest less = less;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   122
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   123
fun mktrans (Less (x, _, p), Less (_, z, q)) =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   124
    Less (x, z, Thm([p, q], Less.less_trans))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   125
  | mktrans (Less (x, _, p), Le (_, z, q)) =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   126
    Less (x, z, Thm([p, q], Less.less_le_trans))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   127
  | mktrans (Le (x, _, p), Less (_, z, q)) =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   128
    Less (x, z, Thm([p, q], Less.le_less_trans))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   129
  | mktrans (Le (x, _, p), Le (_, z, q)) =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   130
    Le (x, z, Thm([p, q], Less.le_trans));
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   131
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   132
fun trans new olds =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   133
  let fun tr (news, old) =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   134
            if upper old = lower new then mktrans (old, new)::news
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   135
            else if upper new = lower old then mktrans (new, old)::news
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   136
            else news
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   137
  in foldl tr ([], olds) end;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   138
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   139
fun close1 olds new =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   140
    if trivial new orelse exists (fn old => old subsumes new) olds then olds
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   141
    else let val news = trans new olds
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   142
         in close (add new (olds, [])) news end
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   143
and close olds [] = olds
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   144
  | close olds (new::news) = close (close1 olds (ctest new)) news;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   145
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   146
(*** Solving and proving goals ***)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   147
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   148
(* Recognise and solve trivial goal *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   149
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   150
fun triv_sol (Le (x, x',  _)) = 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   151
    if x = x' then Some (Thm ([], Less.le_refl)) 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   152
    else None
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   153
  | triv_sol _ = None;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   154
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   155
(* Solve less starting from facts *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   156
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   157
fun solve facts less =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   158
  case triv_sol less of
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   159
    None => (case (Library.find_first (fn fact => fact subsumes less) facts, less) of
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   160
	(None, _) => raise Cannot
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   161
      | (Some (Less (_, _, p)), Less _) => p
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   162
      | (Some (Le (_, _, p)), Less _) =>
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   163
	   error "trans_tac/solve: internal error: le cannot subsume less"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   164
      | (Some (Less (_, _, p)), Le _) => Thm ([p], Less.less_imp_le)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   165
      | (Some (Le (_, _, p)), Le _) => p)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   166
  | Some prf => prf;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   167
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   168
(* Turn term t into Less or Le; n is position of t in list of assumptions *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   169
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   170
fun mkasm (t, n) =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   171
  case Less.decomp t of
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   172
    Some (x, rel, y) => (case rel of
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   173
      "<"   => [Less (x, y, Asm n)]
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   174
    | "~<"  => [Le (y, x, Thm ([Asm n], Less.not_lessD))]
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   175
    | "<="  => [Le (x, y, Asm n)]
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   176
    | "~<=" => [Less (y, x, Thm ([Asm n], Less.not_leD))]
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   177
    | "="   => [Le (x, y, Thm ([Asm n], Less.eqD1)),
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   178
                Le (x, y, Thm ([Asm n], Less.eqD1))]
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   179
    | "~="  => []
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   180
    | _     => error ("trans_tac/mkasm: unknown relation " ^ rel))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   181
  | None => [];
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   182
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   183
(* Turn goal t into a pair (goals, proof) where goals is a list of
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   184
   Le/Less-subgoals to solve, and proof the validation that proves the concl t
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   185
   Asm ~1 is dummy (denotes a goal)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   186
*)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   187
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   188
fun mkconcl t =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   189
  case Less.decomp t of
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   190
    Some (x, rel, y) => (case rel of
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   191
      "<"   => ([Less (x, y, Asm ~1)], Asm 0)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   192
    | "~<"  => ([Le (y, x, Asm ~1)], Thm ([Asm 0], Less.not_lessI))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   193
    | "<="  => ([Le (x, y, Asm ~1)], Asm 0)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   194
    | "~<=" => ([Less (y, x, Asm ~1)], Thm ([Asm 0], Less.not_leI))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   195
    | "="   => ([Le (x, y, Asm ~1), Le (y, x, Asm ~1)],
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   196
                 Thm ([Asm 0, Asm 1], Less.eqI))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   197
    | _  => raise Cannot)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   198
  | None => raise Cannot;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   199
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   200
val trans_tac = SUBGOAL (fn (A, n) =>
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   201
  let val Hs = Logic.strip_assums_hyp A
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   202
    val C = Logic.strip_assums_concl A
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   203
    val lesss = flat (ListPair.map mkasm (Hs, 0 upto (length Hs - 1)))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   204
    val clesss = close [] lesss
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   205
    val (subgoals, prf) = mkconcl C
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   206
    val prfs = map (solve clesss) subgoals
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   207
  in METAHYPS (fn asms =>
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   208
    let val thms = map (prove asms) prfs
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   209
    in rtac (prove thms prf) 1 end) n
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   210
  end
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   211
  handle Contr p => METAHYPS (fn asms => rtac (prove asms p) 1) n
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   212
       | Cannot => no_tac);
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   213
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents:
diff changeset
   214
end;