use std::convert::{From, Into};
use super::Variable;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Hash)]
pub enum PropositionalFormula {
Variable(Variable),
Negation(Option<Box<PropositionalFormula>>),
Conjunction(
Option<Box<PropositionalFormula>>,
Option<Box<PropositionalFormula>>,
),
Disjunction(
Option<Box<PropositionalFormula>>,
Option<Box<PropositionalFormula>>,
),
Implication(
Option<Box<PropositionalFormula>>,
Option<Box<PropositionalFormula>>,
),
Biimplication(
Option<Box<PropositionalFormula>>,
Option<Box<PropositionalFormula>>,
),
}
impl PropositionalFormula {
#[inline]
pub fn variable(v: Variable) -> Self {
Self::Variable(v)
}
#[inline]
pub fn negated(formula: Box<PropositionalFormula>) -> Self {
Self::Negation(Some(formula))
}
#[inline]
pub fn conjunction(
left_sub_formula: Box<PropositionalFormula>,
right_sub_formula: Box<PropositionalFormula>,
) -> Self {
Self::Conjunction(Some(left_sub_formula), Some(right_sub_formula))
}
#[inline]
pub fn disjunction(
left_sub_formula: Box<PropositionalFormula>,
right_sub_formula: Box<PropositionalFormula>,
) -> Self {
Self::Disjunction(Some(left_sub_formula), Some(right_sub_formula))
}
#[inline]
pub fn implication(
left_sub_formula: Box<PropositionalFormula>,
right_sub_formula: Box<PropositionalFormula>,
) -> Self {
Self::Implication(Some(left_sub_formula), Some(right_sub_formula))
}
#[inline]
pub fn biimplication(
left_sub_formula: Box<PropositionalFormula>,
right_sub_formula: Box<PropositionalFormula>,
) -> Self {
Self::Biimplication(Some(left_sub_formula), Some(right_sub_formula))
}
pub fn is_literal(&self) -> bool {
match self {
Self::Variable(_) => true,
Self::Negation(Some(ref inner_formula)) if inner_formula.is_literal() => true,
_ => false,
}
}
}
impl<V> From<V> for PropositionalFormula
where
V: Into<Variable>,
{
fn from(v: V) -> Self {
Self::Variable(v.into())
}
}