diff --git a/CreuSAT/src/logic/logic.rs b/CreuSAT/src/logic/logic.rs index 8cc03af9..0bd9d0d9 100644 --- a/CreuSAT/src/logic/logic.rs +++ b/CreuSAT/src/logic/logic.rs @@ -1,4 +1,3 @@ -extern crate creusot_contracts; use creusot_contracts::std::*; use creusot_contracts::*; @@ -6,6 +5,42 @@ use crate::{assignments::*, clause::*, formula::*, lit::*, trail::*}; use crate::logic::{logic_assignments::*, logic_clause::*, logic_formula::*, logic_trail::*}; +#[cfg(feature = "contracts")] +mod inner { + struct Model(Mapping); + + impl Model { + #[predicate] + fn satisfies_clause(self, cl: Seq) -> bool { + pearlite! { + forall 0 <= i && i < cl.len() ==> self.get(@cl[i].idx) == cl[i].polarity + } + } + + #[predicate] + fn satisfies(self, fml: Seq>) -> bool { + pearlite! { + forall 0 <= i && i < fml.len() ==> self.satisfies_clause(fml[c]) + } + } + } + + impl Formula { + #[predicate] + fn unsat(self) -> bool { + pearlite! { forall m.satisfies(@self) ==> false } + } + + #[predicate] + fn sat(self) -> bool { + pearlite! { exists m.satisfies(@self) } + } + } +} + +#[cfg(feature = "contracts")] +pub use inner::*; + #[logic] fn pos() -> AssignedState { 1u8