use crate::ConceptPool;
use crate::Vocabulary;
use crate::ir::{ClassId, ConceptId, IndividualId, Role, RoleId};
#[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub enum SubRolePath {
Role(Role),
Chain(Vec<Role>),
}
#[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub enum Axiom {
SubClassOf {
sub: ConceptId,
sup: ConceptId,
},
EquivalentClasses(Vec<ConceptId>),
DisjointClasses(Vec<ConceptId>),
DisjointUnion {
class: ClassId,
members: Vec<ConceptId>,
},
SubObjectPropertyOf {
sub: SubRolePath,
sup: Role,
},
EquivalentObjectProperties(Vec<Role>),
DisjointObjectProperties(Vec<Role>),
InverseObjectProperties(Role, Role),
ObjectPropertyDomain {
role: Role,
domain: ConceptId,
},
ObjectPropertyRange {
role: Role,
range: ConceptId,
},
TransitiveRole(Role),
SymmetricRole(Role),
AsymmetricRole(Role),
ReflexiveRole(Role),
IrreflexiveRole(Role),
FunctionalRole(Role),
InverseFunctionalRole(Role),
ClassAssertion {
class: ConceptId,
individual: IndividualId,
},
ObjectPropertyAssertion {
role: Role,
subject: IndividualId,
object: IndividualId,
},
NegativeObjectPropertyAssertion {
role: Role,
subject: IndividualId,
object: IndividualId,
},
SameIndividual(Vec<IndividualId>),
DifferentIndividuals(Vec<IndividualId>),
DeclareClass(ClassId),
DeclareObjectProperty(RoleId),
DeclareNamedIndividual(IndividualId),
}
#[derive(Default, Clone, Debug)]
pub struct InternalOntology {
pub vocabulary: Vocabulary,
pub concepts: ConceptPool,
pub axioms: Vec<Axiom>,
}
impl InternalOntology {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn num_axioms(&self) -> usize {
self.axioms.len()
}
}