use alloc::string::String;
use alloc::vec::Vec;
use elenchus_compiler::{AtomId, Compiled, Origin, PlaceholderInfo, UnusedImport, Value};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Status {
Consistent,
Underdetermined,
Warning,
Conflict,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Conflict {
pub origin: Origin,
pub atoms: Vec<String>,
pub trace: Vec<TraceStep>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TraceStep {
pub atom: String,
pub value: Value,
pub reason: TraceReason,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TraceReason {
Asserted(Origin),
Derived {
origin: Origin,
from: Vec<String>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Warning {
pub origin: Origin,
pub blocked_by: Vec<String>,
pub hint: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Derived {
pub atom: String,
pub value: Value,
pub origin: Origin,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Report {
pub status: Status,
pub conflicts: Vec<Conflict>,
pub warnings: Vec<Warning>,
pub derived: Vec<Derived>,
pub underdetermined: Option<String>,
pub unsat_core: Vec<CoreItem>,
pub retract: Vec<CoreItem>,
pub hints: Vec<SimilarAtoms>,
pub orphans: Vec<OrphanFact>,
pub unused_imports: Vec<UnusedImport>,
pub placeholders: Vec<PlaceholderInfo>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SimilarAtoms {
pub a: String,
pub b: String,
pub reason: &'static str,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OrphanFact {
pub atom: String,
pub value: Value,
pub origin: Origin,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CoreItem {
pub origin: Origin,
pub label: String,
}
pub(crate) fn label(c: &Compiled, a: AtomId) -> String {
let k = &c.atoms[a as usize];
match (&k.predicate, &k.object) {
(Some(p), Some(o)) => alloc::format!("{}.{} {} {}", k.domain, k.subject, p, o),
(Some(p), None) => alloc::format!("{}.{} {}", k.domain, k.subject, p),
(None, _) => alloc::format!("{}.{}", k.domain, k.subject),
}
}
mod human;
mod json;