src/HOL/Integ/presburger.ML
author paulson
Mon, 12 Jan 2004 16:51:45 +0100
changeset 14353 79f9fbef9106
parent 14130 398bc4a885d6
child 14758 af3b71a46a1c
permissions -rw-r--r--
Added lemmas to Ring_and_Field with slightly modified simplification rules Deleted some little-used integer theorems, replacing them by the generic ones in Ring_and_Field Consolidated integer powers
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     1
(*  Title:      HOL/Integ/presburger.ML
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     2
    ID:         $Id$
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     3
    Author:     Amine Chaieb and Stefan Berghofer, TU Muenchen
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     5
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     6
Tactic for solving arithmetical Goals in Presburger Arithmetic
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     7
*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     8
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     9
signature PRESBURGER = 
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    10
sig
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    11
 val presburger_tac : bool -> int -> tactic
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    12
 val presburger_method : bool -> int -> Proof.method
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    13
 val setup : (theory -> theory) list
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    14
 val trace : bool ref
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    15
end;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    16
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    17
structure Presburger: PRESBURGER =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    18
struct
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    19
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    20
val trace = ref false;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    21
fun trace_msg s = if !trace then tracing s else ();
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    22
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    23
(*-----------------------------------------------------------------*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    24
(*cooper_pp: provefunction for the one-exstance quantifier elimination*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    25
(* Here still only one problem : The proof for the arithmetical transformations done on the dvd atomic formulae*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    26
(*-----------------------------------------------------------------*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    27
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    28
val presburger_ss = simpset_of (theory "Presburger");
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    29
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    30
fun cooper_pp sg vrl (fm as e$Abs(xn,xT,p)) = 
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    31
  let val (xn1,p1) = variant_abs (xn,xT,p)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    32
  in (CooperProof.cooper_prv sg (Free (xn1, xT)) p1 vrl) end;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    33
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    34
fun mnnf_pp sg fm = CooperProof.proof_of_cnnf sg fm
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    35
  (CooperProof.proof_of_evalc sg);
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    36
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    37
fun mproof_of_int_qelim sg fm =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    38
  Qelim.proof_of_mlift_qelim sg CooperDec.is_arith_rel
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    39
    (CooperProof.proof_of_linform sg) (mnnf_pp sg) (cooper_pp sg) fm;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    40
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    41
(* Theorems to be used in this tactic*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    42
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    43
val zdvd_int = thm "zdvd_int";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    44
val zdiff_int_split = thm "zdiff_int_split";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    45
val all_nat = thm "all_nat";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    46
val ex_nat = thm "ex_nat";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    47
val number_of1 = thm "number_of1";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    48
val number_of2 = thm "number_of2";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    49
val split_zdiv = thm "split_zdiv";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    50
val split_zmod = thm "split_zmod";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    51
val mod_div_equality' = thm "mod_div_equality'";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    52
val split_div' = thm "split_div'";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    53
val Suc_plus1 = thm "Suc_plus1";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    54
val imp_le_cong = thm "imp_le_cong";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    55
val conj_le_cong = thm "conj_le_cong";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    56
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    57
(* extract all the constants in a term*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    58
fun add_term_typed_consts (Const (c, T), cs) = (c,T) ins cs
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    59
  | add_term_typed_consts (t $ u, cs) =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    60
      add_term_typed_consts (t, add_term_typed_consts (u, cs))
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    61
  | add_term_typed_consts (Abs (_, _, t), cs) = add_term_typed_consts (t, cs)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    62
  | add_term_typed_consts (_, cs) = cs;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    63
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    64
fun term_typed_consts t = add_term_typed_consts(t,[]);
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    65
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    66
(* Some Types*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    67
val bT = HOLogic.boolT;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    68
val iT = HOLogic.intT;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    69
val binT = HOLogic.binT;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    70
val nT = HOLogic.natT;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    71
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    72
(* Allowed Consts in formulae for presburger tactic*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    73
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    74
val allowed_consts =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    75
  [("All", (iT --> bT) --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    76
   ("Ex", (iT --> bT) --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    77
   ("All", (nT --> bT) --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    78
   ("Ex", (nT --> bT) --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    79
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    80
   ("op &", bT --> bT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    81
   ("op |", bT --> bT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    82
   ("op -->", bT --> bT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    83
   ("op =", bT --> bT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    84
   ("Not", bT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    85
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    86
   ("op <=", iT --> iT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    87
   ("op =", iT --> iT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    88
   ("op <", iT --> iT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    89
   ("Divides.op dvd", iT --> iT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    90
   ("Divides.op div", iT --> iT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    91
   ("Divides.op mod", iT --> iT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    92
   ("op +", iT --> iT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    93
   ("op -", iT --> iT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    94
   ("op *", iT --> iT --> iT), 
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    95
   ("HOL.abs", iT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    96
   ("uminus", iT --> iT),
13997
3d53dcd77877 - Added split_min and split_max to preprocessor
berghofe
parents: 13892
diff changeset
    97
   ("HOL.max", iT --> iT --> iT),
3d53dcd77877 - Added split_min and split_max to preprocessor
berghofe
parents: 13892
diff changeset
    98
   ("HOL.min", iT --> iT --> iT),
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    99
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   100
   ("op <=", nT --> nT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   101
   ("op =", nT --> nT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   102
   ("op <", nT --> nT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   103
   ("Divides.op dvd", nT --> nT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   104
   ("Divides.op div", nT --> nT --> nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   105
   ("Divides.op mod", nT --> nT --> nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   106
   ("op +", nT --> nT --> nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   107
   ("op -", nT --> nT --> nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   108
   ("op *", nT --> nT --> nT), 
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   109
   ("Suc", nT --> nT),
13997
3d53dcd77877 - Added split_min and split_max to preprocessor
berghofe
parents: 13892
diff changeset
   110
   ("HOL.max", nT --> nT --> nT),
3d53dcd77877 - Added split_min and split_max to preprocessor
berghofe
parents: 13892
diff changeset
   111
   ("HOL.min", nT --> nT --> nT),
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   112
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   113
   ("Numeral.bin.Bit", binT --> bT --> binT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   114
   ("Numeral.bin.Pls", binT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   115
   ("Numeral.bin.Min", binT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   116
   ("Numeral.number_of", binT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   117
   ("Numeral.number_of", binT --> nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   118
   ("0", nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   119
   ("0", iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   120
   ("1", nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   121
   ("1", iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   122
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   123
   ("False", bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   124
   ("True", bT)];
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   125
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   126
(*returns true if the formula is relevant for presburger arithmetic tactic*)
14130
398bc4a885d6 Fixed two bugs:
berghofe
parents: 13997
diff changeset
   127
fun relevant ps t = (term_typed_consts t) subset allowed_consts andalso
398bc4a885d6 Fixed two bugs:
berghofe
parents: 13997
diff changeset
   128
  map (fn i => snd (nth_elem (i, ps))) (loose_bnos t) @
398bc4a885d6 Fixed two bugs:
berghofe
parents: 13997
diff changeset
   129
  map (snd o dest_Free) (term_frees t) @ map (snd o dest_Var) (term_vars t)
398bc4a885d6 Fixed two bugs:
berghofe
parents: 13997
diff changeset
   130
  subset [iT, nT];
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   131
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   132
(* Preparation of the formula to be sent to the Integer quantifier *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   133
(* elimination procedure                                           *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   134
(* Transforms meta implications and meta quantifiers to object     *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   135
(* implications and object quantifiers                             *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   136
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   137
fun prepare_for_presburger q fm = 
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   138
  let
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   139
    val ps = Logic.strip_params fm
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   140
    val hs = map HOLogic.dest_Trueprop (Logic.strip_assums_hyp fm)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   141
    val c = HOLogic.dest_Trueprop (Logic.strip_assums_concl fm)
14130
398bc4a885d6 Fixed two bugs:
berghofe
parents: 13997
diff changeset
   142
    val _ = if relevant (rev ps) c then () else raise CooperDec.COOPER
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   143
    fun mk_all ((s, T), (P,n)) =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   144
      if 0 mem loose_bnos P then
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   145
        (HOLogic.all_const T $ Abs (s, T, P), n)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   146
      else (incr_boundvars ~1 P, n-1)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   147
    fun mk_all2 (v, t) = HOLogic.all_const (fastype_of v) $ lambda v t;
14130
398bc4a885d6 Fixed two bugs:
berghofe
parents: 13997
diff changeset
   148
    val (rhs,irhs) = partition (relevant (rev ps)) hs
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   149
    val np = length ps
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   150
    val (fm',np) =  foldr (fn ((x, T), (fm,n)) => mk_all ((x, T), (fm,n)))
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   151
      (ps,(foldr HOLogic.mk_imp (rhs, c), np))
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   152
    val (vs, _) = partition (fn t => q orelse (type_of t) = nT)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   153
      (term_frees fm' @ term_vars fm');
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   154
    val fm2 = foldr mk_all2 (vs, fm')
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   155
  in (fm2, np + length vs, length rhs) end;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   156
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   157
(*Object quantifier to meta --*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   158
fun spec_step n th = if (n=0) then th else (spec_step (n-1) th) RS spec ;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   159
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   160
(* object implication to meta---*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   161
fun mp_step n th = if (n=0) then th else (mp_step (n-1) th) RS mp;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   162
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   163
(* the presburger tactic*)
14130
398bc4a885d6 Fixed two bugs:
berghofe
parents: 13997
diff changeset
   164
fun presburger_tac q i = ObjectLogic.atomize_tac i THEN (fn st =>
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   165
  let
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   166
    val g = BasisLibrary.List.nth (prems_of st, i - 1);
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   167
    val sg = sign_of_thm st;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   168
    (* Transform the term*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   169
    val (t,np,nh) = prepare_for_presburger q g
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   170
    (* Some simpsets for dealing with mod div abs and nat*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   171
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   172
    val simpset0 = HOL_basic_ss
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   173
      addsimps [mod_div_equality', Suc_plus1]
13997
3d53dcd77877 - Added split_min and split_max to preprocessor
berghofe
parents: 13892
diff changeset
   174
      addsplits [split_zdiv, split_zmod, split_div', split_min, split_max]
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   175
    (* Simp rules for changing (n::int) to int n *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   176
    val simpset1 = HOL_basic_ss
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   177
      addsimps [nat_number_of_def, zdvd_int] @ map (fn r => r RS sym)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   178
        [int_int_eq, zle_int, zless_int, zadd_int, zmult_int]
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   179
      addsplits [zdiff_int_split]
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   180
    (*simp rules for elimination of int n*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   181
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   182
    val simpset2 = HOL_basic_ss
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   183
      addsimps [nat_0_le, all_nat, ex_nat, number_of1, number_of2, int_0, int_1]
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   184
      addcongs [conj_le_cong, imp_le_cong]
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   185
    (* simp rules for elimination of abs *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   186
14353
79f9fbef9106 Added lemmas to Ring_and_Field with slightly modified simplification rules
paulson
parents: 14130
diff changeset
   187
    val simpset3 = HOL_basic_ss addsplits [abs_split]
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   188
	      
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   189
    val ct = cterm_of sg (HOLogic.mk_Trueprop t)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   190
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   191
    (* Theorem for the nat --> int transformation *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   192
    val pre_thm = Seq.hd (EVERY
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   193
      [simp_tac simpset0 i,
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   194
       TRY (simp_tac simpset1 i), TRY (simp_tac simpset2 i),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   195
       TRY (simp_tac simpset3 i), TRY (simp_tac presburger_ss i)]
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   196
      (trivial ct))
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   197
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   198
    fun assm_tac i = REPEAT_DETERM_N nh (assume_tac i);
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   199
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   200
    (* The result of the quantifier elimination *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   201
    val (th, tac) = case (prop_of pre_thm) of
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   202
        Const ("==>", _) $ (Const ("Trueprop", _) $ t1) $ _ =>
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   203
          (trace_msg ("calling procedure with term:\n" ^
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   204
             Sign.string_of_term sg t1);
13997
3d53dcd77877 - Added split_min and split_max to preprocessor
berghofe
parents: 13892
diff changeset
   205
           ((mproof_of_int_qelim sg (Pattern.eta_long [] t1) RS iffD2) RS pre_thm,
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   206
            assm_tac (i + 1) THEN (if q then I else TRY) (rtac TrueI i)))
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   207
      | _ => (pre_thm, assm_tac i)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   208
  in (rtac (((mp_step nh) o (spec_step np)) th) i THEN tac) st
14130
398bc4a885d6 Fixed two bugs:
berghofe
parents: 13997
diff changeset
   209
  end handle Subscript => no_tac st | CooperDec.COOPER => no_tac st);
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   210
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   211
fun presburger_args meth =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   212
  Method.simple_args (Scan.optional (Args.$$$ "no_quantify" >> K false) true)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   213
    (fn q => fn _ => meth q 1);
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   214
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   215
fun presburger_method q i = Method.METHOD (fn facts =>
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   216
  Method.insert_tac facts 1 THEN presburger_tac q i)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   217
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   218
val setup =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   219
  [Method.add_method ("presburger",
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   220
     presburger_args presburger_method,
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   221
     "decision procedure for Presburger arithmetic"),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   222
   ArithTheoryData.map (fn {splits, inj_consts, discrete, presburger} =>
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   223
     {splits = splits, inj_consts = inj_consts, discrete = discrete,
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   224
      presburger = Some (presburger_tac true)})];
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   225
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   226
end;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   227
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   228
val presburger_tac = Presburger.presburger_tac true;