This commit is contained in:
Simon Cruanes 2021-06-11 18:59:26 -04:00
parent 4fd8afb129
commit dcbc4d4a59
4 changed files with 51 additions and 13 deletions

View file

@ -1,7 +1,15 @@
(** {1 Implementation of a Solver using Msat} *) (** {1 Implementation of a Solver using Msat} *)
module Log = Msat.Log (** {{: https://github.com/Gbury/mSAT/} Msat} is a modular SAT solver in
pure OCaml.
This builds a {!Sidekick_core.SOLVER} on top of it. *)
module Log = Msat.Log
(** A logging module *)
(** Argument to pass to the functor {!Make} in order to create a
new Msat-based SMT solver. *)
module type ARG = sig module type ARG = sig
open Sidekick_core open Sidekick_core
module T : TERM module T : TERM
@ -16,6 +24,7 @@ end
module type S = Sidekick_core.SOLVER module type S = Sidekick_core.SOLVER
(** Main functor to get a solver. *)
module Make(A : ARG) module Make(A : ARG)
: S : S
with module T = A.T with module T = A.T

View file

@ -1,5 +1,9 @@
(** {2 Signatures for booleans} *) (** Theory of boolean formulas.
This handles formulas containing "and", "or", "=>", "if-then-else", etc.
*)
(** Boolean-oriented view of terms *)
type ('a, 'args) bool_view = type ('a, 'args) bool_view =
| B_bool of bool | B_bool of bool
| B_not of 'a | B_not of 'a
@ -14,16 +18,17 @@ type ('a, 'args) bool_view =
| B_opaque_bool of 'a (* do not enter *) | B_opaque_bool of 'a (* do not enter *)
| B_atom of 'a | B_atom of 'a
(** Argument to the theory *)
module type ARG = sig module type ARG = sig
module S : Sidekick_core.SOLVER module S : Sidekick_core.SOLVER
type term = S.T.Term.t type term = S.T.Term.t
val view_as_bool : term -> (term, term Iter.t) bool_view val view_as_bool : term -> (term, term Iter.t) bool_view
(** Project the term into the boolean view *) (** Project the term into the boolean view. *)
val mk_bool : S.T.Term.state -> (term, term IArray.t) bool_view -> term val mk_bool : S.T.Term.state -> (term, term IArray.t) bool_view -> term
(** Make a term from the given boolean view *) (** Make a term from the given boolean view. *)
val check_congruence_classes : bool val check_congruence_classes : bool
(** Configuration: add final-check handler to verify if new boolean formulas (** Configuration: add final-check handler to verify if new boolean formulas
@ -31,16 +36,23 @@ module type ARG = sig
Only enable if some theories are susceptible to Only enable if some theories are susceptible to
create boolean formulas during the proof search. *) create boolean formulas during the proof search. *)
(** Fresh symbol generator.
The theory needs to be able to create new terms with fresh names,
to be used as placeholders for complex formulas during Tseitin
encoding. *)
module Gensym : sig module Gensym : sig
type t type t
val create : S.T.Term.state -> t val create : S.T.Term.state -> t
(** New (stateful) generator instance. *)
val fresh_term : t -> pre:string -> S.T.Ty.t -> term val fresh_term : t -> pre:string -> S.T.Ty.t -> term
(** Make a fresh term of the given type *) (** Make a fresh term of the given type *)
end end
end end
(** Signature *)
module type S = sig module type S = sig
module A : ARG module A : ARG
@ -52,9 +64,16 @@ module type S = sig
(** Simplify given term *) (** Simplify given term *)
val cnf : state -> A.S.Solver_internal.preprocess_hook val cnf : state -> A.S.Solver_internal.preprocess_hook
(** add clauses for the booleans within the term. *) (** preprocesses formulas by giving them names and
adding clauses to equate the name with the boolean formula. *)
val theory : A.S.theory val theory : A.S.theory
(** A theory that can be added to the solver {!A.S}.
This theory does most of its work during preprocessing,
turning boolean formulas into SAT clauses via
the {{: https://en.wikipedia.org/wiki/Tseytin_transformation}
Tseitin encoding} . *)
end end
module Make(A : ARG) : S with module A = A = struct module Make(A : ARG) : S with module A = A = struct

View file

@ -1,12 +1,6 @@
(** {1 Theory for datatypes} *) (** Theory for datatypes. *)
(** {2 Views} *)
(** Datatype-oriented view of terms.
['c] is the representation of constructors
['t] is the representation of terms
*)
type ('c,'t) data_view = type ('c,'t) data_view =
| T_cstor of 'c * 't IArray.t | T_cstor of 'c * 't IArray.t
| T_select of 'c * int * 't | T_select of 'c * int * 't

View file

@ -1,3 +1,4 @@
(** Theory for datatypes. *)
(** Datatype-oriented view of terms. (** Datatype-oriented view of terms.
['c] is the representation of constructors ['c] is the representation of constructors
@ -20,14 +21,25 @@ type ('c, 'ty) data_ty_view =
} }
| Ty_other | Ty_other
(** Argument to the functor *)
module type ARG = sig module type ARG = sig
module S : Sidekick_core.SOLVER module S : Sidekick_core.SOLVER
(** Constructor symbols.
A constructor is an injective symbol, part of a datatype (or "sum type").
For example, in [type option a = Some a | None],
the constructors are [Some] and [None]. *)
module Cstor : sig module Cstor : sig
type t type t
(** Constructor *)
val ty_args : t -> S.T.Ty.t Iter.t val ty_args : t -> S.T.Ty.t Iter.t
(** Type arguments, for a polymorphic constructor *)
val pp : t Fmt.printer val pp : t Fmt.printer
val equal : t -> t -> bool val equal : t -> t -> bool
(** Comparison *)
end end
val as_datatype : S.T.Ty.t -> (Cstor.t Iter.t, S.T.Ty.t) data_ty_view val as_datatype : S.T.Ty.t -> (Cstor.t Iter.t, S.T.Ty.t) data_ty_view
@ -49,15 +61,19 @@ module type ARG = sig
(** Make a term equality *) (** Make a term equality *)
val ty_is_finite : S.T.Ty.t -> bool val ty_is_finite : S.T.Ty.t -> bool
(** Is the given type known to be finite? *) (** Is the given type known to be finite? For example a finite datatype
(an "enum" in C parlance), or [Bool], or [Array Bool Bool]. *)
val ty_set_is_finite : S.T.Ty.t -> bool -> unit val ty_set_is_finite : S.T.Ty.t -> bool -> unit
(** Modify the "finite" field (see {!ty_is_finite}) *) (** Modify the "finite" field (see {!ty_is_finite}) *)
(* TODO: should we store this ourself? would be simpler… *)
end end
module type S = sig module type S = sig
module A : ARG module A : ARG
val theory : A.S.theory val theory : A.S.theory
(** A theory that can be added to {!A.S} to perform datatype reasoning. *)
end end
module Make(A : ARG) : S with module A = A module Make(A : ARG) : S with module A = A