use serde::{Deserialize, Serialize};
use crate::axiom::AxiomId;
use crate::entity::EntityId;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "kind")]
pub enum TraceConclusion {
Axiom {
id: AxiomId,
},
SubClassOf {
sub: EntityId,
sup: EntityId,
},
Existential {
class: EntityId,
property: EntityId,
filler: EntityId,
},
SubObjectPropertyOf {
sub: EntityId,
sup: EntityId,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "kind")]
pub enum TracePremise {
Axiom {
id: AxiomId,
},
SubClassOf {
sub: EntityId,
sup: EntityId,
},
Existential {
class: EntityId,
property: EntityId,
filler: EntityId,
},
SubObjectPropertyOf {
sub: EntityId,
sup: EntityId,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TraceStep {
pub rule: String,
pub premises: Vec<TracePremise>,
pub conclusion: TraceConclusion,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct InferenceTrace {
pub steps: Vec<TraceStep>,
}
impl InferenceTrace {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn push(&mut self, step: TraceStep) {
self.steps.push(step);
}
}