src/HOL/Integ/presburger.ML
author wenzelm
Thu, 14 Jul 2005 19:28:18 +0200
changeset 16836 45a3dc4688bc
parent 15661 9ef583b08647
child 17465 93fc1211603f
permissions -rw-r--r--
improved oracle setup;
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
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     5
Tactic for solving arithmetical Goals in Presburger Arithmetic
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     6
*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
     7
14811
9144ec118703 abstraction over functions is no default any more.
chaieb
parents: 14801
diff changeset
     8
(* This version of presburger deals with occurences of functional symbols in the subgoal and abstract over them to try to prove the more general formula. It then resolves with the subgoal. To enable this feature call the procedure with the parameter abs
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
     9
*)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
    10
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    11
signature PRESBURGER = 
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    12
sig
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
    13
 val presburger_tac : bool -> bool -> int -> tactic
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
    14
 val presburger_method : bool -> bool -> int -> Proof.method
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    15
 val setup : (theory -> theory) list
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    16
 val trace : bool ref
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    17
end;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    18
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    19
structure Presburger: PRESBURGER =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    20
struct
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    21
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    22
val trace = ref false;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    23
fun trace_msg s = if !trace then tracing s else ();
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    24
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    25
(*-----------------------------------------------------------------*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    26
(*cooper_pp: provefunction for the one-exstance quantifier elimination*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    27
(* 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
    28
(*-----------------------------------------------------------------*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    29
14941
1edb674e0c33 Oracle corrected
chaieb
parents: 14920
diff changeset
    30
14801
2d27b5ebc447 - deleted unneeded function eta_long (now in Pure/pattern.ML
berghofe
parents: 14758
diff changeset
    31
val presburger_ss = simpset_of (theory "Presburger");
2d27b5ebc447 - deleted unneeded function eta_long (now in Pure/pattern.ML
berghofe
parents: 14758
diff changeset
    32
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
    33
fun cooper_pp sg (fm as e$Abs(xn,xT,p)) = 
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    34
  let val (xn1,p1) = variant_abs (xn,xT,p)
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
    35
  in (CooperProof.cooper_prv sg (Free (xn1, xT)) p1) end;
13876
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 mnnf_pp sg fm = CooperProof.proof_of_cnnf sg fm
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    38
  (CooperProof.proof_of_evalc sg);
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    39
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
    40
fun tmproof_of_int_qelim sg fm =
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
    41
  Qelim.tproof_of_mlift_qelim sg CooperDec.is_arith_rel
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    42
    (CooperProof.proof_of_linform sg) (mnnf_pp sg) (cooper_pp sg) fm;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    43
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
    44
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    45
(* Theorems to be used in this tactic*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    46
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    47
val zdvd_int = thm "zdvd_int";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    48
val zdiff_int_split = thm "zdiff_int_split";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    49
val all_nat = thm "all_nat";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    50
val ex_nat = thm "ex_nat";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    51
val number_of1 = thm "number_of1";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    52
val number_of2 = thm "number_of2";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    53
val split_zdiv = thm "split_zdiv";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    54
val split_zmod = thm "split_zmod";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    55
val mod_div_equality' = thm "mod_div_equality'";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    56
val split_div' = thm "split_div'";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    57
val Suc_plus1 = thm "Suc_plus1";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    58
val imp_le_cong = thm "imp_le_cong";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    59
val conj_le_cong = thm "conj_le_cong";
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    60
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    61
(* extract all the constants in a term*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    62
fun add_term_typed_consts (Const (c, T), cs) = (c,T) ins cs
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    63
  | add_term_typed_consts (t $ u, cs) =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    64
      add_term_typed_consts (t, add_term_typed_consts (u, cs))
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    65
  | add_term_typed_consts (Abs (_, _, t), cs) = add_term_typed_consts (t, cs)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    66
  | add_term_typed_consts (_, cs) = cs;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    67
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    68
fun term_typed_consts t = add_term_typed_consts(t,[]);
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    69
15661
9ef583b08647 reverted renaming of Some/None in comments and strings;
wenzelm
parents: 15620
diff changeset
    70
(* Some Types*)
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    71
val bT = HOLogic.boolT;
15620
8ccdc8bc66a2 replaced bool by a new datatype "bit" for binary numerals
paulson
parents: 15574
diff changeset
    72
val bitT = HOLogic.bitT;
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    73
val iT = HOLogic.intT;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    74
val binT = HOLogic.binT;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    75
val nT = HOLogic.natT;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    76
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    77
(* Allowed Consts in formulae for presburger tactic*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    78
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    79
val allowed_consts =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    80
  [("All", (iT --> bT) --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    81
   ("Ex", (iT --> bT) --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    82
   ("All", (nT --> bT) --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    83
   ("Ex", (nT --> bT) --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    84
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    85
   ("op &", bT --> bT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    86
   ("op |", bT --> bT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    87
   ("op -->", bT --> bT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    88
   ("op =", bT --> bT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    89
   ("Not", bT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    90
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    91
   ("op <=", iT --> iT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    92
   ("op =", iT --> iT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    93
   ("op <", iT --> iT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    94
   ("Divides.op dvd", iT --> iT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    95
   ("Divides.op div", iT --> iT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    96
   ("Divides.op mod", iT --> iT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    97
   ("op +", iT --> iT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    98
   ("op -", iT --> iT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
    99
   ("op *", iT --> iT --> iT), 
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   100
   ("HOL.abs", iT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   101
   ("uminus", iT --> iT),
14801
2d27b5ebc447 - deleted unneeded function eta_long (now in Pure/pattern.ML
berghofe
parents: 14758
diff changeset
   102
   ("HOL.max", iT --> iT --> iT),
2d27b5ebc447 - deleted unneeded function eta_long (now in Pure/pattern.ML
berghofe
parents: 14758
diff changeset
   103
   ("HOL.min", iT --> iT --> iT),
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   104
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   105
   ("op <=", nT --> nT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   106
   ("op =", nT --> nT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   107
   ("op <", nT --> nT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   108
   ("Divides.op dvd", nT --> nT --> bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   109
   ("Divides.op div", nT --> nT --> nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   110
   ("Divides.op mod", nT --> nT --> nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   111
   ("op +", nT --> nT --> nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   112
   ("op -", nT --> nT --> nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   113
   ("op *", nT --> nT --> nT), 
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   114
   ("Suc", nT --> nT),
14801
2d27b5ebc447 - deleted unneeded function eta_long (now in Pure/pattern.ML
berghofe
parents: 14758
diff changeset
   115
   ("HOL.max", nT --> nT --> nT),
2d27b5ebc447 - deleted unneeded function eta_long (now in Pure/pattern.ML
berghofe
parents: 14758
diff changeset
   116
   ("HOL.min", nT --> nT --> nT),
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   117
15620
8ccdc8bc66a2 replaced bool by a new datatype "bit" for binary numerals
paulson
parents: 15574
diff changeset
   118
   ("Numeral.bit.B0", bitT),
8ccdc8bc66a2 replaced bool by a new datatype "bit" for binary numerals
paulson
parents: 15574
diff changeset
   119
   ("Numeral.bit.B1", bitT),
8ccdc8bc66a2 replaced bool by a new datatype "bit" for binary numerals
paulson
parents: 15574
diff changeset
   120
   ("Numeral.Bit", binT --> bitT --> binT),
15013
34264f5e4691 new treatment of binary numerals
paulson
parents: 14981
diff changeset
   121
   ("Numeral.Pls", binT),
34264f5e4691 new treatment of binary numerals
paulson
parents: 14981
diff changeset
   122
   ("Numeral.Min", binT),
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   123
   ("Numeral.number_of", binT --> iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   124
   ("Numeral.number_of", binT --> nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   125
   ("0", nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   126
   ("0", iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   127
   ("1", nT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   128
   ("1", iT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   129
   ("False", bT),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   130
   ("True", bT)];
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
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   137
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   138
(*==================================*)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   139
(* Abstracting on subterms  ========*)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   140
(*==================================*)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   141
(* Returns occurences of terms that are function application of type int or nat*)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   142
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   143
fun getfuncs fm = case strip_comb fm of
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   144
    (Free (_, T), ts as _ :: _) =>
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   145
      if body_type T mem [iT, nT] 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   146
         andalso not (ts = []) andalso forall (null o loose_bnos) ts 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   147
      then [fm]
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   148
      else Library.foldl op union ([], map getfuncs ts)
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   149
  | (Var (_, T), ts as _ :: _) =>
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   150
      if body_type T mem [iT, nT] 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   151
         andalso not (ts = []) andalso forall (null o loose_bnos) ts then [fm]
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   152
      else Library.foldl op union ([], map getfuncs ts)
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   153
  | (Const (s, T), ts) =>
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   154
      if (s, T) mem allowed_consts orelse not (body_type T mem [iT, nT])
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   155
      then Library.foldl op union ([], map getfuncs ts)
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   156
      else [fm]
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   157
  | (Abs (s, T, t), _) => getfuncs t
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   158
  | _ => [];
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   159
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   160
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   161
fun abstract_pres sg fm = 
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
   162
  foldr (fn (t, u) =>
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   163
      let val T = fastype_of t
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   164
      in all T $ Abs ("x", T, abstract_over (t, u)) end)
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
   165
         fm (getfuncs fm);
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   166
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   167
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   168
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   169
(* hasfuncs_on_bounds dont care of the type of the functions applied!
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   170
 It returns true if there is a subterm coresponding to the application of
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   171
 a function on a bounded variable.
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   172
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   173
 Function applications are allowed only for well predefined functions a 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   174
 consts*)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   175
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   176
fun has_free_funcs fm  = case strip_comb fm of
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   177
    (Free (_, T), ts as _ :: _) => 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   178
      if (body_type T mem [iT,nT]) andalso (not (T mem [iT,nT]))
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   179
      then true
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   180
      else exists (fn x => x) (map has_free_funcs ts)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   181
  | (Var (_, T), ts as _ :: _) =>
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   182
      if (body_type T mem [iT,nT]) andalso not (T mem [iT,nT])
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   183
      then true
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   184
      else exists (fn x => x) (map has_free_funcs ts)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   185
  | (Const (s, T), ts) =>  exists (fn x => x) (map has_free_funcs ts)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   186
  | (Abs (s, T, t), _) => has_free_funcs t
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   187
  |_ => false;
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   188
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   189
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   190
(*returns true if the formula is relevant for presburger arithmetic tactic
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   191
The constants occuring in term t should be a subset of the allowed_consts
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   192
 There also should be no occurences of application of functions on bounded 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   193
 variables. Whenever this function will be used, it will be ensured that t 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   194
 will not contain subterms with function symbols that could have been 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   195
 abstracted over.*)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   196
 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   197
fun relevant ps t = (term_typed_consts t) subset allowed_consts andalso 
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   198
  map (fn i => snd (List.nth (ps, i))) (loose_bnos t) @
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   199
  map (snd o dest_Free) (term_frees t) @ map (snd o dest_Var) (term_vars t)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   200
  subset [iT, nT]
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   201
  andalso not (has_free_funcs t);
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   202
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   203
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   204
fun prepare_for_presburger sg q fm = 
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   205
  let
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   206
    val ps = Logic.strip_params fm
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   207
    val hs = map HOLogic.dest_Trueprop (Logic.strip_assums_hyp fm)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   208
    val c = HOLogic.dest_Trueprop (Logic.strip_assums_concl fm)
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   209
    val _ = if relevant (rev ps) c then () 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   210
               else  (trace_msg ("Conclusion is not a presburger term:\n" ^
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   211
             Sign.string_of_term sg c); raise CooperDec.COOPER)
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   212
    fun mk_all ((s, T), (P,n)) =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   213
      if 0 mem loose_bnos P then
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   214
        (HOLogic.all_const T $ Abs (s, T, P), n)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   215
      else (incr_boundvars ~1 P, n-1)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   216
    fun mk_all2 (v, t) = HOLogic.all_const (fastype_of v) $ lambda v t;
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   217
    val (rhs,irhs) = List.partition (relevant (rev ps)) hs
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   218
    val np = length ps
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
   219
    val (fm',np) =  foldr (fn ((x, T), (fm,n)) => mk_all ((x, T), (fm,n)))
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
   220
      (foldr HOLogic.mk_imp c rhs, np) ps
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   221
    val (vs, _) = List.partition (fn t => q orelse (type_of t) = nT)
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   222
      (term_frees fm' @ term_vars fm');
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
   223
    val fm2 = foldr mk_all2 fm' vs
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   224
  in (fm2, np + length vs, length rhs) end;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   225
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   226
(*Object quantifier to meta --*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   227
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
   228
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   229
(* object implication to meta---*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   230
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
   231
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   232
(* the presburger tactic*)
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   233
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   234
(* Parameters : q = flag for quantify ofer free variables ; 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   235
                a = flag for abstracting over function occurences
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   236
                i = subgoal  *)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   237
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   238
fun presburger_tac q a i = ObjectLogic.atomize_tac i THEN (fn st =>
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   239
  let
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   240
    val g = BasisLibrary.List.nth (prems_of st, i - 1)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   241
    val sg = sign_of_thm st
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   242
    (* The Abstraction step *)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   243
    val g' = if a then abstract_pres sg g else g
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   244
    (* Transform the term*)
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   245
    val (t,np,nh) = prepare_for_presburger sg q g'
15661
9ef583b08647 reverted renaming of Some/None in comments and strings;
wenzelm
parents: 15620
diff changeset
   246
    (* Some simpsets for dealing with mod div abs and nat*)
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   247
    val simpset0 = HOL_basic_ss
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   248
      addsimps [mod_div_equality', Suc_plus1]
13997
3d53dcd77877 - Added split_min and split_max to preprocessor
berghofe
parents: 13892
diff changeset
   249
      addsplits [split_zdiv, split_zmod, split_div', split_min, split_max]
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   250
    (* Simp rules for changing (n::int) to int n *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   251
    val simpset1 = HOL_basic_ss
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   252
      addsimps [nat_number_of_def, zdvd_int] @ map (fn r => r RS sym)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   253
        [int_int_eq, zle_int, zless_int, zadd_int, zmult_int]
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   254
      addsplits [zdiff_int_split]
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   255
    (*simp rules for elimination of int n*)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   256
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   257
    val simpset2 = HOL_basic_ss
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   258
      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
   259
      addcongs [conj_le_cong, imp_le_cong]
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   260
    (* simp rules for elimination of abs *)
14353
79f9fbef9106 Added lemmas to Ring_and_Field with slightly modified simplification rules
paulson
parents: 14130
diff changeset
   261
    val simpset3 = HOL_basic_ss addsplits [abs_split]
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   262
    val ct = cterm_of sg (HOLogic.mk_Trueprop t)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   263
    (* Theorem for the nat --> int transformation *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   264
    val pre_thm = Seq.hd (EVERY
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   265
      [simp_tac simpset0 1,
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   266
       TRY (simp_tac simpset1 1), TRY (simp_tac simpset2 1),
14801
2d27b5ebc447 - deleted unneeded function eta_long (now in Pure/pattern.ML
berghofe
parents: 14758
diff changeset
   267
       TRY (simp_tac simpset3 1), TRY (simp_tac presburger_ss 1)]
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   268
      (trivial ct))
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   269
    fun assm_tac i = REPEAT_DETERM_N nh (assume_tac i)
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   270
    (* The result of the quantifier elimination *)
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   271
    val (th, tac) = case (prop_of pre_thm) of
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   272
        Const ("==>", _) $ (Const ("Trueprop", _) $ t1) $ _ =>
14920
a7525235e20f An oracle is built in. The tactic will not generate any proofs any more, if the quick_and_dirty flag is set on.
chaieb
parents: 14882
diff changeset
   273
    let val pth = 
a7525235e20f An oracle is built in. The tactic will not generate any proofs any more, if the quick_and_dirty flag is set on.
chaieb
parents: 14882
diff changeset
   274
          (* If quick_and_dirty then run without proof generation as oracle*)
a7525235e20f An oracle is built in. The tactic will not generate any proofs any more, if the quick_and_dirty flag is set on.
chaieb
parents: 14882
diff changeset
   275
             if !quick_and_dirty 
16836
45a3dc4688bc improved oracle setup;
wenzelm
parents: 15661
diff changeset
   276
             then presburger_oracle sg (Pattern.eta_long [] t1)
14941
1edb674e0c33 Oracle corrected
chaieb
parents: 14920
diff changeset
   277
(*
1edb674e0c33 Oracle corrected
chaieb
parents: 14920
diff changeset
   278
assume (cterm_of sg 
14920
a7525235e20f An oracle is built in. The tactic will not generate any proofs any more, if the quick_and_dirty flag is set on.
chaieb
parents: 14882
diff changeset
   279
	       (HOLogic.mk_Trueprop(HOLogic.mk_eq(t1,CooperDec.integer_qelim (Pattern.eta_long [] t1)))))
14941
1edb674e0c33 Oracle corrected
chaieb
parents: 14920
diff changeset
   280
*)
14920
a7525235e20f An oracle is built in. The tactic will not generate any proofs any more, if the quick_and_dirty flag is set on.
chaieb
parents: 14882
diff changeset
   281
	     else tmproof_of_int_qelim sg (Pattern.eta_long [] t1)
a7525235e20f An oracle is built in. The tactic will not generate any proofs any more, if the quick_and_dirty flag is set on.
chaieb
parents: 14882
diff changeset
   282
    in 
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   283
          (trace_msg ("calling procedure with term:\n" ^
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   284
             Sign.string_of_term sg t1);
14920
a7525235e20f An oracle is built in. The tactic will not generate any proofs any more, if the quick_and_dirty flag is set on.
chaieb
parents: 14882
diff changeset
   285
           ((pth RS iffD2) RS pre_thm,
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   286
            assm_tac (i + 1) THEN (if q then I else TRY) (rtac TrueI i)))
14920
a7525235e20f An oracle is built in. The tactic will not generate any proofs any more, if the quick_and_dirty flag is set on.
chaieb
parents: 14882
diff changeset
   287
    end
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   288
      | _ => (pre_thm, assm_tac i)
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   289
  in (rtac (((mp_step nh) o (spec_step np)) th) i 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   290
      THEN tac) st
14130
398bc4a885d6 Fixed two bugs:
berghofe
parents: 13997
diff changeset
   291
  end handle Subscript => no_tac st | CooperDec.COOPER => no_tac st);
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   292
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   293
fun presburger_args meth =
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   294
 let val parse_flag = 
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   295
         Args.$$$ "no_quantify" >> K (apfst (K false))
14811
9144ec118703 abstraction over functions is no default any more.
chaieb
parents: 14801
diff changeset
   296
      || Args.$$$ "abs" >> K (apsnd (K true));
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   297
 in
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   298
   Method.simple_args 
14882
e0e2361b9a30 avoid Args.list (lost update?);
wenzelm
parents: 14877
diff changeset
   299
  (Scan.optional (Args.$$$ "(" |-- Scan.repeat1 parse_flag --| Args.$$$ ")") [] >>
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   300
    curry (Library.foldl op |>) (true, false))
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   301
    (fn (q,a) => fn _ => meth q a 1)
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   302
  end;
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   303
14758
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   304
fun presburger_method q a i = Method.METHOD (fn facts =>
af3b71a46a1c A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller.
chaieb
parents: 14353
diff changeset
   305
  Method.insert_tac facts 1 THEN presburger_tac q a i)
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   306
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   307
val setup =
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   308
  [Method.add_method ("presburger",
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   309
     presburger_args presburger_method,
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   310
     "decision procedure for Presburger arithmetic"),
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   311
   ArithTheoryData.map (fn {splits, inj_consts, discrete, presburger} =>
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   312
     {splits = splits, inj_consts = inj_consts, discrete = discrete,
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15240
diff changeset
   313
      presburger = SOME (presburger_tac true false)})];
13876
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   314
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   315
end;
68f4ed8311ac New decision procedure for Presburger arithmetic.
berghofe
parents:
diff changeset
   316
14920
a7525235e20f An oracle is built in. The tactic will not generate any proofs any more, if the quick_and_dirty flag is set on.
chaieb
parents: 14882
diff changeset
   317
val presburger_tac = Presburger.presburger_tac true false;