1use crate::formula::CvlrFormula;
4
5#[derive(Copy, Clone)]
10pub struct CvlrAnd<A, B>(A, B);
11
12impl<A, B> CvlrFormula for CvlrAnd<A, B>
13where
14 A: CvlrFormula,
15 B: CvlrFormula<Context = A::Context>,
16{
17 type Context = A::Context;
18 fn eval(&self, ctx: &Self::Context) -> bool {
19 self.0.eval(ctx) && self.1.eval(ctx)
20 }
21 fn assert(&self, ctx: &Self::Context) {
22 self.0.assert(ctx);
23 self.1.assert(ctx);
24 }
25 fn assume(&self, ctx: &Self::Context) {
26 self.0.assume(ctx);
27 self.1.assume(ctx);
28 }
29
30 fn eval_with_states(&self, ctx0: &Self::Context, ctx1: &Self::Context) -> bool {
31 self.0.eval_with_states(ctx0, ctx1) && self.1.eval_with_states(ctx0, ctx1)
32 }
33 fn assert_with_states(&self, ctx0: &Self::Context, ctx1: &Self::Context) {
34 self.0.assert_with_states(ctx0, ctx1);
35 self.1.assert_with_states(ctx0, ctx1);
36 }
37 fn assume_with_states(&self, ctx0: &Self::Context, ctx1: &Self::Context) {
38 self.0.assume_with_states(ctx0, ctx1);
39 self.1.assume_with_states(ctx0, ctx1);
40 }
41}
42
43pub fn cvlr_and<A, B>(a: A, b: B) -> CvlrAnd<A, B>
62where
63 A: CvlrFormula,
64 B: CvlrFormula<Context = A::Context>,
65{
66 CvlrAnd(a, b)
67}
68
69#[derive(Copy, Clone)]
75pub struct CvlrImplies<A, B>(A, B);
76
77impl<A, B> CvlrFormula for CvlrImplies<A, B>
78where
79 A: CvlrFormula,
80 B: CvlrFormula<Context = A::Context>,
81{
82 type Context = A::Context;
83 fn eval(&self, ctx: &Self::Context) -> bool {
84 if self.0.eval(ctx) {
85 self.1.eval(ctx)
86 } else {
87 true
88 }
89 }
90
91 fn assert(&self, ctx: &Self::Context) {
92 if self.0.eval(ctx) {
93 self.1.assert(ctx);
94 }
95 }
96 fn assume(&self, ctx: &Self::Context) {
97 if self.0.eval(ctx) {
98 self.1.assume(ctx);
99 }
100 }
101
102 fn eval_with_states(&self, ctx0: &Self::Context, ctx1: &Self::Context) -> bool {
103 if self.0.eval_with_states(ctx0, ctx1) {
104 self.1.eval_with_states(ctx0, ctx1)
105 } else {
106 true
107 }
108 }
109
110 fn assert_with_states(&self, ctx0: &Self::Context, ctx1: &Self::Context) {
111 if self.0.eval_with_states(ctx0, ctx1) {
112 self.1.assert_with_states(ctx0, ctx1)
113 }
114 }
115
116 fn assume_with_states(&self, ctx0: &Self::Context, ctx1: &Self::Context) {
117 if self.0.eval_with_states(ctx0, ctx1) {
118 self.1.assume_with_states(ctx0, ctx1)
119 }
120 }
121}
122
123pub fn cvlr_implies<A, B>(a: A, b: B) -> CvlrImplies<A, B>
143where
144 A: CvlrFormula,
145 B: CvlrFormula<Context = A::Context>,
146{
147 CvlrImplies(a, b)
148}