mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-06 03:05:31 -05:00
cleanup: remove labels, use a sum type for negated formulas
This commit is contained in:
parent
403347ddaf
commit
6e6503e793
8 changed files with 33 additions and 38 deletions
|
|
@ -4,6 +4,8 @@ Copyright 2014 Guillaume Bury
|
||||||
Copyright 2014 Simon Cruanes
|
Copyright 2014 Simon Cruanes
|
||||||
*)
|
*)
|
||||||
|
|
||||||
|
module FI = Formula_intf
|
||||||
|
|
||||||
module Fsat = struct
|
module Fsat = struct
|
||||||
|
|
||||||
exception Bad_atom
|
exception Bad_atom
|
||||||
|
|
@ -25,7 +27,7 @@ module Fsat = struct
|
||||||
let dummy = 0
|
let dummy = 0
|
||||||
|
|
||||||
let neg a = - a
|
let neg a = - a
|
||||||
let norm a = abs a, a < 0
|
let norm a = abs a, if a < 0 then FI.Negated else FI.Same_sign
|
||||||
let abs = abs
|
let abs = abs
|
||||||
let sign i = i > 0
|
let sign i = i > 0
|
||||||
let apply_sign b i = if b then i else neg i
|
let apply_sign b i = if b then i else neg i
|
||||||
|
|
@ -35,10 +37,6 @@ module Fsat = struct
|
||||||
let equal (a:int) b = a=b
|
let equal (a:int) b = a=b
|
||||||
let compare (a:int) b = Pervasives.compare a b
|
let compare (a:int) b = Pervasives.compare a b
|
||||||
|
|
||||||
let _str = Hstring.make ""
|
|
||||||
let label a = _str
|
|
||||||
let add_label _ _ = ()
|
|
||||||
|
|
||||||
let make i = _make (2 * i)
|
let make i = _make (2 * i)
|
||||||
|
|
||||||
let fresh, iter =
|
let fresh, iter =
|
||||||
|
|
|
||||||
12
smt/expr.ml
12
smt/expr.ml
|
|
@ -4,6 +4,8 @@ Copyright 2014 Guillaume Bury
|
||||||
Copyright 2014 Simon Cruanes
|
Copyright 2014 Simon Cruanes
|
||||||
*)
|
*)
|
||||||
|
|
||||||
|
module FI = Formula_intf
|
||||||
|
|
||||||
exception Invalid_var
|
exception Invalid_var
|
||||||
|
|
||||||
type var = string
|
type var = string
|
||||||
|
|
@ -38,19 +40,15 @@ let neg = function
|
||||||
| Distinct (a, b) -> Equal (a, b)
|
| Distinct (a, b) -> Equal (a, b)
|
||||||
|
|
||||||
let norm = function
|
let norm = function
|
||||||
| Prop i -> Prop (abs i), i < 0
|
| Prop i -> Prop (abs i), if i < 0 then FI.Negated else FI.Same_sign
|
||||||
| Equal (a, b) -> Equal (a, b), false
|
| Equal (a, b) -> Equal (a, b), FI.Same_sign
|
||||||
| Distinct (a, b) -> Equal (a, b), true
|
| Distinct (a, b) -> Equal (a, b), FI.Negated
|
||||||
|
|
||||||
(* Only used after normalisation, so usual functions should work *)
|
(* Only used after normalisation, so usual functions should work *)
|
||||||
let hash = Hashtbl.hash
|
let hash = Hashtbl.hash
|
||||||
let equal = (=)
|
let equal = (=)
|
||||||
let compare = Pervasives.compare
|
let compare = Pervasives.compare
|
||||||
|
|
||||||
let s = Hstring.make ""
|
|
||||||
let label _ = s
|
|
||||||
let add_label _ _ = ()
|
|
||||||
|
|
||||||
let print fmt = function
|
let print fmt = function
|
||||||
| Prop i -> Format.fprintf fmt "%s%s%d" (if i < 0 then "¬ " else "") (if i mod 2 = 0 then "v" else "f") ((abs i) / 2)
|
| Prop i -> Format.fprintf fmt "%s%s%d" (if i < 0 then "¬ " else "") (if i mod 2 = 0 then "v" else "f") ((abs i) / 2)
|
||||||
| Equal (a, b) -> Format.fprintf fmt "%s = %s" a b
|
| Equal (a, b) -> Format.fprintf fmt "%s = %s" a b
|
||||||
|
|
|
||||||
14
smt/expr.mli
14
smt/expr.mli
|
|
@ -13,6 +13,8 @@ type formula = private
|
||||||
type t = formula
|
type t = formula
|
||||||
type proof = unit
|
type proof = unit
|
||||||
|
|
||||||
|
include Formula_intf.S with type t := formula and type proof := proof
|
||||||
|
|
||||||
val dummy : t
|
val dummy : t
|
||||||
|
|
||||||
val fresh : unit -> t
|
val fresh : unit -> t
|
||||||
|
|
@ -21,18 +23,6 @@ val mk_prop : int -> t
|
||||||
val mk_eq : var -> var -> t
|
val mk_eq : var -> var -> t
|
||||||
val mk_neq : var -> var -> t
|
val mk_neq : var -> var -> t
|
||||||
|
|
||||||
val neg : t -> t
|
|
||||||
val norm : t -> t * bool
|
|
||||||
|
|
||||||
val hash : t -> int
|
|
||||||
val equal : t -> t -> bool
|
|
||||||
val compare : t -> t -> int
|
|
||||||
|
|
||||||
val label : t -> Hstring.t
|
|
||||||
val add_label : Hstring.t -> t -> unit
|
|
||||||
|
|
||||||
val print : Format.formatter -> t -> unit
|
|
||||||
|
|
||||||
module Term : sig
|
module Term : sig
|
||||||
type t = var
|
type t = var
|
||||||
val hash : t -> int
|
val hash : t -> int
|
||||||
|
|
|
||||||
|
|
@ -37,9 +37,11 @@ module type S = sig
|
||||||
val neg : Formula.t -> Formula.t
|
val neg : Formula.t -> Formula.t
|
||||||
(** Formula negation *)
|
(** Formula negation *)
|
||||||
|
|
||||||
val norm : Formula.t -> Formula.t * bool
|
val norm : Formula.t -> Formula.t * Formula_intf.negated
|
||||||
(** Returns a 'normalized' form of the formula, possibly negated (in which case return true).
|
(** Returns a 'normalized' form of the formula, possibly negated
|
||||||
[norm] must be so that [a] and [neg a] normalises to the same formula. *)
|
(in which case return [Negated]).
|
||||||
|
[norm] must be so that [a] and [neg a] normalise to the same formula,
|
||||||
|
but one returns [Negated] and the other [Same_sign]. *)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,10 @@ Copyright 2014 Guillaume Bury
|
||||||
Copyright 2014 Simon Cruanes
|
Copyright 2014 Simon Cruanes
|
||||||
*)
|
*)
|
||||||
|
|
||||||
|
type negated =
|
||||||
|
| Negated (* changed sign *)
|
||||||
|
| Same_sign (* kept sign *)
|
||||||
|
|
||||||
module type S = sig
|
module type S = sig
|
||||||
(** Signature of formulas that parametrises the SAT/SMT Solver Module. *)
|
(** Signature of formulas that parametrises the SAT/SMT Solver Module. *)
|
||||||
|
|
||||||
|
|
@ -22,19 +26,17 @@ module type S = sig
|
||||||
val neg : t -> t
|
val neg : t -> t
|
||||||
(** Formula negation *)
|
(** Formula negation *)
|
||||||
|
|
||||||
val norm : t -> t * bool
|
val norm : t -> t * negated
|
||||||
(** Returns a 'normalized' form of the formula, possibly negated (in which case return true).
|
(** Returns a 'normalized' form of the formula, possibly negated
|
||||||
[norm] must be so that [a] and [neg a] normalises to the same formula. *)
|
(in which case return [Negated]).
|
||||||
|
[norm] must be so that [a] and [neg a] normalise to the same formula,
|
||||||
|
but one returns [Same_sign] and one returns [Negated] *)
|
||||||
|
|
||||||
val hash : t -> int
|
val hash : t -> int
|
||||||
val equal : t -> t -> bool
|
val equal : t -> t -> bool
|
||||||
val compare : t -> t -> int
|
val compare : t -> t -> int
|
||||||
(** Usual hash and comparison functions. Given to Map and Hash functors. *)
|
(** Usual hash and comparison functions. Given to Map and Hash functors. *)
|
||||||
|
|
||||||
val label : t -> Hstring.t
|
|
||||||
val add_label : Hstring.t -> t -> unit
|
|
||||||
(** Optional. Not yet used in Solver. *)
|
|
||||||
|
|
||||||
val print : Format.formatter -> t -> unit
|
val print : Format.formatter -> t -> unit
|
||||||
(** Printing function used for debugging. *)
|
(** Printing function used for debugging. *)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1095,7 +1095,10 @@ module Make
|
||||||
then raise UndecidedLit
|
then raise UndecidedLit
|
||||||
else assert (var.v_level >= 0);
|
else assert (var.v_level >= 0);
|
||||||
let truth = var.pa.is_true in
|
let truth = var.pa.is_true in
|
||||||
let value = if negated then not truth else truth in
|
let value = match negated with
|
||||||
|
| Formula_intf.Negated -> not truth
|
||||||
|
| Formula_intf.Same_sign -> truth
|
||||||
|
in
|
||||||
value, var.v_level
|
value, var.v_level
|
||||||
|
|
||||||
let eval lit = fst (eval_level lit)
|
let eval lit = fst (eval_level lit)
|
||||||
|
|
|
||||||
|
|
@ -139,7 +139,7 @@ module McMake (E : Expr_intf.S)(Dummy : sig end) = struct
|
||||||
Vec.push vars (Either.mk_left res);
|
Vec.push vars (Either.mk_left res);
|
||||||
res
|
res
|
||||||
|
|
||||||
let make_boolean_var =
|
let make_boolean_var : formula -> var * Formula_intf.negated =
|
||||||
fun lit ->
|
fun lit ->
|
||||||
let lit, negated = E.norm lit in
|
let lit, negated = E.norm lit in
|
||||||
try MF.find f_map lit, negated
|
try MF.find f_map lit, negated
|
||||||
|
|
@ -177,7 +177,9 @@ module McMake (E : Expr_intf.S)(Dummy : sig end) = struct
|
||||||
|
|
||||||
let add_atom lit =
|
let add_atom lit =
|
||||||
let var, negated = make_boolean_var lit in
|
let var, negated = make_boolean_var lit in
|
||||||
if negated then var.na else var.pa
|
match negated with
|
||||||
|
| Formula_intf.Negated -> var.na
|
||||||
|
| Formula_intf.Same_sign -> var.pa
|
||||||
|
|
||||||
let make_clause ?tag name ali sz_ali is_learnt premise lvl =
|
let make_clause ?tag name ali sz_ali is_learnt premise lvl =
|
||||||
let atoms = Vec.from_list ali sz_ali dummy_atom in
|
let atoms = Vec.from_list ali sz_ali dummy_atom in
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ module type S = sig
|
||||||
(** Returns the variable associated with the term *)
|
(** Returns the variable associated with the term *)
|
||||||
val add_atom : formula -> atom
|
val add_atom : formula -> atom
|
||||||
(** Returns the atom associated with the given formula *)
|
(** Returns the atom associated with the given formula *)
|
||||||
val make_boolean_var : formula -> var * bool
|
val make_boolean_var : formula -> var * Formula_intf.negated
|
||||||
(** Returns the variable linked with the given formula, and wether the atom associated with the formula
|
(** Returns the variable linked with the given formula, and wether the atom associated with the formula
|
||||||
is [var.pa] or [var.na] *)
|
is [var.pa] or [var.na] *)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue