1
0
Fork 0
mirror of synced 2025-09-24 04:40:05 +00:00

[add] fixed flattening for OR

This commit is contained in:
Brian Guo 2018-10-24 20:52:24 -04:00
parent 182449812f
commit f1966e918d
2 changed files with 24 additions and 9 deletions

View file

@ -370,17 +370,32 @@ impl Flattener {
statements_flattened,
rhs
);
let name_x_and_y = self.use_sym();
assert!(x.is_linear() && y.is_linear());
let name_x = self.use_sym();
let name_y = self.use_sym();
let name_x_or_y = self.use_sym();
statements_flattened.push(FlatStatement::Definition(
name_x_and_y,
name_x,
x
));
statements_flattened.push(FlatStatement::Definition(
name_y,
y
));
statements_flattened.push(FlatStatement::Definition(
name_x_or_y,
FlatExpression::Sub(
box FlatExpression::Add(box x, box y),
box FlatExpression::Mult(box x, box y)
))
);
FlatExpression::Identifier(name_x_and_y)
box FlatExpression::Add(
box FlatExpression::Identifier(name_x),
box FlatExpression::Identifier(name_y)
),
box FlatExpression::Mult(
box FlatExpression::Identifier(name_x),
box FlatExpression::Identifier(name_y)
)
)
));
FlatExpression::Identifier(name_x_or_y)
},
BooleanExpression::And(box lhs, box rhs) => {
let x = self.flatten_boolean_expression(

View file

@ -297,7 +297,7 @@ pub enum BooleanExpression<T: Field> {
Eq(Box<FieldElementExpression<T>>, Box<FieldElementExpression<T>>),
Ge(Box<FieldElementExpression<T>>, Box<FieldElementExpression<T>>),
Gt(Box<FieldElementExpression<T>>, Box<FieldElementExpression<T>>),
Or(Box<FieldElementExpression<T>>, Box<FieldElementExpression<T>>),
Or(Box<BooleanExpression<T>>, Box<BooleanExpression<T>>),
And(Box<BooleanExpression<T>>, Box<BooleanExpression<T>>),
}