mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-06 03:05:31 -05:00
43 lines
984 B
OCaml
43 lines
984 B
OCaml
open Sidekick_core
|
|
open Sidekick_smt_solver
|
|
|
|
open struct
|
|
module SI = Solver_internal
|
|
end
|
|
|
|
type ty = Term.t
|
|
|
|
module type ARG = sig
|
|
val ty_is_unin : ty -> bool
|
|
end
|
|
|
|
module Make (A : ARG) = struct
|
|
open A
|
|
|
|
type t = { gensym: Gensym.t }
|
|
|
|
let create (tst : Term.store) : t =
|
|
let gensym = Gensym.create tst in
|
|
{ gensym }
|
|
|
|
let pop_levels (self : t) n = if n > 0 then Gensym.reset self.gensym
|
|
|
|
let model_ask_ (self : t) (_solver : SI.t) (_m : Model_builder.t) (t : Term.t)
|
|
: _ option =
|
|
if ty_is_unin (Term.ty t) then (
|
|
let s = Gensym.fresh_term self.gensym ~pre:"@c" (Term.ty t) in
|
|
Some (s, [])
|
|
) else
|
|
None
|
|
|
|
let create_and_setup ~id:_ (solver : SI.t) : t =
|
|
let state = create (SI.tst solver) in
|
|
SI.on_model solver ~ask:(model_ask_ state);
|
|
state
|
|
|
|
let theory = Solver.mk_theory ~name:"ty-unin" ~create_and_setup ~pop_levels ()
|
|
end
|
|
|
|
let theory (arg : (module ARG)) : Theory.t =
|
|
let module M = Make ((val arg)) in
|
|
M.theory
|