#![no_std]
#![warn(missing_docs)]
extern crate alloc;
#[cfg(feature = "std")]
extern crate std;
pub mod sat;
mod analysis;
mod cnf;
mod eval;
mod report;
mod unsat;
mod v3;
use alloc::string::String;
use alloc::vec::Vec;
use elenchus_compiler::Compiled;
use crate::analysis::{orphan_facts, similar_atom_pairs};
use crate::eval::Eval;
use crate::unsat::retract_assumptions;
pub use elenchus_compiler::Diagnostics;
#[cfg(feature = "std")]
pub use elenchus_compiler::FileResolver;
pub use elenchus_compiler::{
CompileError, MemoryResolver, PlaceholderInfo, PlaceholderStatus, PortBinding, Resolver,
UnusedImport, compile, compile_source, compile_source_with, compile_with,
normalize_import_path, read_data_bindings, read_data_source,
};
pub use report::{
Conflict, CoreItem, Derived, OrphanFact, Report, SimilarAtoms, Status, TraceReason, TraceStep,
Warning,
};
pub use v3::V3;
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
pub fn solve(c: &Compiled) -> Report {
let mut e = Eval::new(c);
e.seed_facts();
e.saturate_rules();
e.check_premises();
let mut report = e.finish();
if report.status == Status::Conflict {
let retract = retract_assumptions(c);
if !retract.is_empty() {
report.unsat_core = Vec::new();
report.retract = retract;
}
}
report.hints = similar_atom_pairs(c);
report.orphans = orphan_facts(c);
report.unused_imports = c.unused_imports.clone();
report.placeholders = c.placeholders.clone();
report
}
pub fn verify_source(name: &str, src: &str) -> Result<Report, CompileError> {
verify_source_with(name, src, &[])
}
pub fn verify_source_with(
name: &str,
src: &str,
inputs: &[(String, PortBinding)],
) -> Result<Report, CompileError> {
Ok(solve(&compile_source_with(name, src, inputs)?))
}
pub fn verify<R: Resolver>(root: &str, resolver: &R) -> Result<Report, CompileError> {
verify_with(root, resolver, &[])
}
pub fn verify_with<R: Resolver>(
root: &str,
resolver: &R,
inputs: &[(String, PortBinding)],
) -> Result<Report, CompileError> {
Ok(solve(&compile_with(root, resolver, inputs)?))
}