(* Title: HOL/Tools/SMT/smtlib_interface.ML Author: Sascha Boehme, TU Muenchen Author: Jasmin Blanchette, TU Muenchen
Interface to SMT solvers based on the SMT-LIB 2 format.
*)
signature SMTLIB_INTERFACE = sig val smtlibC: SMT_Util.class val hosmtlibC: SMT_Util.class val bvsmlibC: SMT_Util.class val realsmlibC: SMT_Util.class val add_logic: int * (string -> term list -> stringoption) -> Context.generic -> Context.generic val del_logic: int * (string -> term list -> stringoption) -> Context.generic -> Context.generic
val translate_config: SMT_Util.order -> Proof.context -> SMT_Translate.config val assert_name_of_role_and_index: SMT_Util.role -> int -> string val role_and_index_of_assert_name: string -> SMT_Util.role * int end;
val smtlibC = ["smtlib"] (* SMT-LIB 2 *) val hosmtlibC = smtlibC @ hoC (* possibly SMT-LIB 3 *) val bvsmlibC = smtlibC @ ["BV"] (* if BV are supported *) val realsmlibC = ["Real"]
(* builtins *)
local fun int_num _ i = SOME (string_of_int i)
fun is_linear [t] = SMT_Util.is_number t
| is_linear [t, u] = SMT_Util.is_number t orelse SMT_Util.is_number u
| is_linear _ = false
fun times _ _ ts = letval mk = Term.list_comb o pair \<^Const>\<open>times \<^Type>\<open>int\<close>\<close> inif is_linear ts then SOME ("*", 2, ts, mk) else NONE end in
fun fst_int_ord ((i1, _), (i2, _)) = int_ord (i1, i2)
structure Logics = Generic_Data
( type T = (int * (string -> term list -> stringoption)) list val empty = [] fun merge data = Ord_List.merge fst_int_ord data
)
fun add_logic pf = Logics.map (Ord_List.insert fst_int_ord pf) fun del_logic pf = Logics.map (Ord_List.remove fst_int_ord pf)
fun choose_logic ctxt prover ts = let fun choose [] = "AUFLIA"
| choose ((_, f) :: fs) = (case f prover ts of SOME s => s | NONE => choose fs) in
(case choose (Logics.get (Context.Proof ctxt)) of "" => ""(* for default Z3 logic, a subset of everything *)
| logic => "(set-logic " ^ logic ^ ")\n") end
(** serialization **)
fun var i = "?v" ^ string_of_int i
fun tree_of_sterm l (SMT_Translate.SVar (i, [])) = SMTLIB.Sym (var (l - i - 1))
| tree_of_sterm l (SMT_Translate.SVar (i, ts)) =
SMTLIB.S (SMTLIB.Sym (var (l - i - 1)) :: map (tree_of_sterm l) ts)
| tree_of_sterm _ (SMT_Translate.SConst (n, [])) = SMTLIB.Sym n
| tree_of_sterm l (SMT_Translate.SConst (n, ts)) =
SMTLIB.S (SMTLIB.Sym n :: map (tree_of_sterm l) ts)
| tree_of_sterm l (SMT_Translate.SQua (q, ss, pats, t)) = let val l' = l + length ss
fun quant_name SMT_Translate.SForall = "forall"
| quant_name SMT_Translate.SExists = "exists"
fun gen_trees_of_pat keyword ps =
[SMTLIB.Key keyword, SMTLIB.S (map (tree_of_sterm l') ps)] fun trees_of_pat (SMT_Translate.SPat ps) = gen_trees_of_pat "pattern" ps
| trees_of_pat (SMT_Translate.SNoPat ps) = gen_trees_of_pat "no-pattern" ps fun tree_of_pats [] t = t
| tree_of_pats pats t = SMTLIB.S (SMTLIB.Sym "!" :: t :: maps trees_of_pat pats)
val vs = map_index (fn (i, ty) =>
SMTLIB.S [SMTLIB.Sym (var (l + i)), SMTLIB.Sym ty]) ss
val body = t
|> tree_of_sterm l'
|> tree_of_pats pats in
SMTLIB.S [SMTLIB.Sym (quant_name q), SMTLIB.S vs, body] end
fun sctrarg (sel, typ) = "(" ^ sel ^ " " ^ typ ^ ")" fun sctr (name, args) = enclose "("")" (implode_space (name :: map sctrarg args)) fun sdatatype (name, ctrs) = enclose "("")" (implode_space (name :: map sctr ctrs))
fun string_of_fun (f, (ss, s)) = f ^ " (" ^ implode_space ss ^ ") " ^ s
fun named_sterm s t = SMTLIB.S [SMTLIB.Sym "!", t, SMTLIB.Key "named", SMTLIB.Sym s]
val conjecture_prefix = "conjecture"(* FUDGE *) val hypothesis_prefix = "hypothesis"(* FUDGE *) val axiom_prefix = "a"(* matching Alethe's convention *)
fun assert_name_of_role_and_index role i = assert_prefix_of_role role ^ string_of_int i
fun unprefix_axiom s = try (pair SMT_Util.Conjecture o unprefix conjecture_prefix) s
|> curry merge_options (try (pair SMT_Util.Hypothesis o unprefix hypothesis_prefix) s)
|> curry merge_options (try (pair SMT_Util.Axiom o unprefix axiom_prefix) s)
|> the
fun role_and_index_of_assert_name s =
apsnd (the_default ~1 o Int.fromString) (unprefix_axiom s)
type dtype_decls = (string * (string * (string * string) list) list) list
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.