use std::collections::{BTreeMap, BTreeSet};
use crate::ir::{Atom, ConstantSymbol, PredicateSymbol, Term};
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Stratification {
pub strata: Vec<Stratum>,
pub predicate_stratum: BTreeMap<PredicateSymbol, usize>,
}
impl Stratification {
#[must_use]
pub fn stratum_of(&self, predicate: &PredicateSymbol) -> Option<usize> {
self.predicate_stratum.get(predicate).copied()
}
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Stratum {
pub predicates: BTreeSet<PredicateSymbol>,
}
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub enum StratificationError {
UnstratifiableCycle {
predicates: Vec<PredicateSymbol>,
},
}
#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub(super) enum HeadGraphClass {
Narrow,
Inherit,
Literal(ConstantSymbol),
}
impl HeadGraphClass {
#[must_use]
pub(super) fn classify(head: &Atom) -> Self {
match head.terms.last() {
None => Self::Narrow,
Some(Term::Constant(c)) => Self::Literal(c.clone()),
Some(Term::Variable(_) | Term::TripleTerm(_) | Term::Skolem { .. }) => Self::Inherit,
}
}
}