use alloc::vec::Vec;
use nom_locate::LocatedSpan;
pub type Span<'a> = LocatedSpan<&'a str>;
#[derive(Debug, Clone, PartialEq)]
pub struct Located<'a, T> {
pub data: T,
pub span: Span<'a>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Atom<'a> {
pub domain: Option<&'a str>,
pub subject: &'a str,
pub predicate: &'a str,
pub object: Option<&'a str>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Literal<'a> {
pub negated: bool,
pub atom: Atom<'a>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ListOp {
Exclusive,
Forbids,
OneOf,
AtLeast,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Conn {
And,
Or,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Body<'a> {
List {
op: ListOp,
atoms: Vec<Located<'a, Atom<'a>>>,
},
Impl {
antecedent: Vec<Located<'a, Literal<'a>>>,
ante_conn: Conn,
consequent: Vec<Located<'a, Literal<'a>>>,
cons_conn: Conn,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum Statement<'a> {
Domain(Located<'a, &'a str>),
Import {
path: Located<'a, &'a str>,
alias: Option<Located<'a, &'a str>>,
},
Fact(Located<'a, Atom<'a>>),
Negation(Located<'a, Atom<'a>>),
Assume(Located<'a, Literal<'a>>),
Premise {
name: Located<'a, &'a str>,
body: Body<'a>,
},
Rule {
name: Located<'a, &'a str>,
body: Body<'a>,
},
Check {
subject: Option<Located<'a, &'a str>>,
bidirectional: bool,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct Program<'a> {
pub statements: Vec<Statement<'a>>,
}