| author | wenzelm | 
| Mon, 19 Oct 2009 23:02:23 +0200 | |
| changeset 33003 | 1c93cfa807bc | 
| parent 32618 | 42865636d006 | 
| permissions | -rw-r--r-- | 
| 32618 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 1 | (* Title: HOL/SMT/SMT_Definitions.thy | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 2 | Author: Sascha Boehme, TU Muenchen | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 3 | *) | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 4 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 5 | header {* SMT-specific definitions *}
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 6 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 7 | theory SMT_Definitions | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 8 | imports Real Word "~~/src/HOL/Decision_Procs/Dense_Linear_Order" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 9 | begin | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 10 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 11 | section {* Triggers for quantifier instantiation *}
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 12 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 13 | text {*
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 14 | Some SMT solvers support triggers for quantifier instantiation. Each trigger | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 15 | consists of one ore more patterns. A pattern may either be a list of positive | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 16 | subterms (the first being tagged by "pat" and the consecutive subterms tagged | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 17 | by "andpat"), or a list of negative subterms (the first being tagged by "nopat" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 18 | and the consecutive subterms tagged by "andpat"). | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 19 | *} | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 20 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 21 | datatype pattern = Pattern | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 22 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 23 | definition pat :: "'a \<Rightarrow> pattern" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 24 | where "pat _ = Pattern" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 25 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 26 | definition nopat :: "bool \<Rightarrow> pattern" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 27 | where "nopat _ = Pattern" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 28 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 29 | definition andpat :: "pattern \<Rightarrow> 'a \<Rightarrow> pattern" (infixl "andpat" 60) | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 30 | where "_ andpat _ = Pattern" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 31 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 32 | definition trigger :: "pattern list \<Rightarrow> bool \<Rightarrow> bool" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 33 | where "trigger _ P = P" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 34 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 35 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 36 | section {* Arithmetic *}
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 37 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 38 | text {*
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 39 | The sign of @{term "op mod :: int \<Rightarrow> int \<Rightarrow> int"} follows the sign of the
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 40 | divisor. In contrast to that, the sign of the following operation is that of | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 41 | the dividend. | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 42 | *} | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 43 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 44 | definition rem :: "int \<Rightarrow> int \<Rightarrow> int" (infixl "rem" 70) | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 45 | where "a rem b = | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 46 | (if (a \<ge> 0 \<and> b < 0) \<or> (a < 0 \<and> b \<ge> 0) then - (a mod b) else a mod b)" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 47 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 48 | text {* A decision procedure for linear real arithmetic: *}
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 49 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 50 | setup {*
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 51 | Arith_Data.add_tactic "Ferrante-Rackoff" (K FerranteRackoff.dlo_tac) | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 52 | *} | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 53 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 54 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 55 | section {* Bitvectors *}
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 56 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 57 | text {*
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 58 | The following definitions provide additional functions not found in HOL-Word. | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 59 | *} | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 60 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 61 | definition sdiv :: "'a::len word \<Rightarrow> 'a word \<Rightarrow> 'a word" (infix "sdiv" 70) | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 62 | where "w1 sdiv w2 = word_of_int (sint w1 div sint w2)" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 63 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 64 | definition smod :: "'a::len word \<Rightarrow> 'a word \<Rightarrow> 'a word" (infix "smod" 70) | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 65 | (* sign follows divisor *) | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 66 | where "w1 smod w2 = word_of_int (sint w1 mod sint w2)" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 67 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 68 | definition srem :: "'a::len word \<Rightarrow> 'a word \<Rightarrow> 'a word" (infix "srem" 70) | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 69 | (* sign follows dividend *) | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 70 | where "w1 srem w2 = word_of_int (sint w1 rem sint w2)" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 71 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 72 | definition bv_shl :: "'a::len0 word \<Rightarrow> 'a word \<Rightarrow> 'a word" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 73 | where "bv_shl w1 w2 = (w1 << unat w2)" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 74 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 75 | definition bv_lshr :: "'a::len0 word \<Rightarrow> 'a word \<Rightarrow> 'a word" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 76 | where "bv_lshr w1 w2 = (w1 >> unat w2)" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 77 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 78 | definition bv_ashr :: "'a::len word \<Rightarrow> 'a word \<Rightarrow> 'a word" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 79 | where "bv_ashr w1 w2 = (w1 >>> unat w2)" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 80 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 81 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 82 | section {* Higher-order encoding *}
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 83 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 84 | definition "apply" where "apply f x = f x" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 85 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 86 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 87 | section {* First-order logic *}
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 88 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 89 | text {*
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 90 | Some SMT solver formats require a strict separation between formulas and terms. | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 91 | The following marker symbols are used internally to separate those categories: | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 92 | *} | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 93 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 94 | definition formula :: "bool \<Rightarrow> bool" where "formula x = x" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 95 | definition "term" where "term x = x" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 96 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 97 | text {*
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 98 | Predicate symbols also occurring as function symbols are turned into function | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 99 | symbols by translating atomic formulas into terms: | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 100 | *} | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 101 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 102 | abbreviation holds :: "bool \<Rightarrow> bool" where "holds \<equiv> (\<lambda>P. term P = term True)" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 103 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 104 | text {*
 | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 105 | The following constant represents equivalence, to be treated differently than | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 106 | the (polymorphic) equality predicate: | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 107 | *} | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 108 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 109 | definition iff :: "bool \<Rightarrow> bool \<Rightarrow> bool" (infix "iff" 50) where | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 110 | "(x iff y) = (x = y)" | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 111 | |
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 112 | end | 
| 
42865636d006
added new method "smt": an oracle-based connection to external SMT solvers
 boehmes parents: diff
changeset | 113 |