use serde::{Deserialize, Serialize};
use super::clause::Clause;
use super::literal::Literal;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum ProofResult {
Unsatisfiable {
steps: usize,
derivation: Vec<ResolutionStep>,
},
Satisfiable,
Saturated {
clauses_generated: usize,
},
ResourceLimitReached {
steps_attempted: usize,
},
}
impl ProofResult {
pub fn is_unsatisfiable(&self) -> bool {
matches!(self, ProofResult::Unsatisfiable { .. })
}
pub fn is_satisfiable(&self) -> bool {
matches!(self, ProofResult::Satisfiable)
}
pub fn steps(&self) -> usize {
match self {
ProofResult::Unsatisfiable { steps, .. } => *steps,
ProofResult::ResourceLimitReached { steps_attempted } => *steps_attempted,
ProofResult::Saturated { clauses_generated } => *clauses_generated,
ProofResult::Satisfiable => 0,
}
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ResolutionStep {
pub parent1: Clause,
pub parent2: Clause,
pub resolvent: Clause,
pub resolved_literal: Literal,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum ResolutionStrategy {
Saturation {
max_clauses: usize,
},
SetOfSupport {
max_steps: usize,
},
UnitResolution {
max_steps: usize,
},
Linear {
max_depth: usize,
},
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct ProverStats {
pub clauses_generated: usize,
pub resolution_steps: usize,
pub tautologies_removed: usize,
pub clauses_subsumed: usize,
pub empty_clause_found: bool,
}