module Skolem:sig
..end
typetype_ =
TypedSTerm.t
typeterm =
TypedSTerm.t
typeform =
TypedSTerm.t
type
ctx
val create : ?prefix:string ->
?prop_prefix:string ->
?on_new:(ID.t -> type_ -> unit) -> unit -> ctx
prefix
: used to name skolem functions/constantsprop_prefix
: used to name sub-formulas during CNFval fresh_sym : ctx:ctx -> ty:type_ -> ID.t
val fresh_sym_with : ctx:ctx -> ty:type_ -> string -> ID.t
val pop_new_symbols : ctx:ctx -> (ID.t * type_) list
val skolem_form : ctx:ctx ->
(type_, term) Var.Subst.t ->
type_ -> form -> term
skolem_form ~ctx subst ty f
returns a term t
made of a new symbol
applied to the free variables of f
that do not occur in subst
.
This term should replace some free variable in f
that has type ty
.
For instance, skolem_form ~ctx ΓΈ Y p(a, b, Y, X)
will yield
something like sk42(X)
.
typepolarity =
[ `Both | `Neg | `Pos ]
val pp_polarity : polarity CCFormat.printer
type
definition = {
|
form : |
|
proxy : |
|
polarity : |
val define : ctx:ctx -> polarity:polarity -> form -> form
rename_form ~ctx f
returns a new predicate for f
,
with the free variables of f
as arguments.f
.val pop_new_definitions : ctx:ctx -> definition list
new_definitions
. The list can be obtained only once,
after which those definitions are not "new" anymore.
Will call remove_def
so there is no risk of re-using a definition
with a new polarity.
exception Attr_skolem
val is_skolem : ID.t -> bool
is_skolem id
returns true
iff id
is a Skolem symbol