use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct Literal {
pub value: i32,
pub negated: bool,
}
impl Literal {
#[allow(dead_code)]
pub fn new() -> Literal {
return Literal {
value: 0,
negated: false,
}
}
#[allow(dead_code)]
pub fn from_value(value: i32) -> Literal {
return Literal {
value: value,
negated: false,
}
}
}
#[derive(Debug, Clone)]
pub struct Clause {
pub literals: Vec<Literal>,
}
impl Clause {
pub fn new() -> Clause {
Clause {
literals: Vec::new(),
}
}
}
#[derive(Debug, Clone)]
pub struct Formula {
pub clauses: Vec<Clause>,
pub literals: Vec<i32>,
pub num_clauses: i32,
pub num_vars: i32,
}
impl Formula {
#[allow(dead_code)]
pub fn new() -> Formula {
Formula {
clauses: Vec::new(),
literals: Vec::new(),
num_clauses: 0,
num_vars: 0,
}
}
#[allow(dead_code)]
pub fn evaluate(&mut self, interpretation: &HashMap<i32, bool>) -> bool {
let mut value: bool = true;
for clause in &mut self.clauses {
let mut clause_value: bool = false;
for literal in &mut clause.literals {
let mut literal_value: bool = false;
if interpretation.contains_key(&literal.value) {
literal_value = interpretation[&literal.value];
}
if literal.negated {
literal_value = !literal_value;
}
if literal_value {
clause_value = true;
break;
}
}
value = value && clause_value;
}
value
}
}