use sim_kernel::Symbol;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum SearchStrategy {
#[default]
Dfs,
Bfs,
Fair,
}
impl SearchStrategy {
pub fn from_symbol(symbol: &Symbol) -> Option<Self> {
match symbol.name.as_ref() {
"dfs" => Some(Self::Dfs),
"bfs" => Some(Self::Bfs),
"fair" => Some(Self::Fair),
_ => None,
}
}
pub fn as_symbol(self) -> Symbol {
Symbol::new(match self {
Self::Dfs => "dfs",
Self::Bfs => "bfs",
Self::Fair => "fair",
})
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum OccursCheck {
#[default]
Always,
TrustedAcyclic,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct LogicLimits {
pub max_depth: usize,
pub max_answers: Option<usize>,
pub max_goals: usize,
pub max_clause_scan: usize,
}
impl Default for LogicLimits {
fn default() -> Self {
Self {
max_depth: 128,
max_answers: Some(256),
max_goals: 1024,
max_clause_scan: 8192,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct LogicConfig {
pub limits: LogicLimits,
pub stream_buffer: usize,
pub strategy: SearchStrategy,
pub occurs_check: OccursCheck,
pub enable_indexing: bool,
pub enable_tabling: bool,
}
impl Default for LogicConfig {
fn default() -> Self {
Self {
limits: LogicLimits::default(),
stream_buffer: 64,
strategy: SearchStrategy::Dfs,
occurs_check: OccursCheck::Always,
enable_indexing: true,
enable_tabling: true,
}
}
}