Working
This commit is contained in:
112
src/ast.rs
Normal file
112
src/ast.rs
Normal file
@ -0,0 +1,112 @@
|
||||
use std::fmt::Display;
|
||||
|
||||
pub type Variable = String;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Module
|
||||
{
|
||||
pub clauses: Vec<Clause>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Clause
|
||||
{
|
||||
pub head: Predicate,
|
||||
pub body: Option<Body>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum Body
|
||||
{
|
||||
Term(Predicate),
|
||||
And(Vec<Body>),
|
||||
Or(Vec<Body>),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum Predicate
|
||||
{
|
||||
Variable(Variable), // Upercase variable like X
|
||||
Fixed(String, Vec<Predicate>),
|
||||
}
|
||||
|
||||
impl Display for Body
|
||||
{
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result
|
||||
{
|
||||
match self
|
||||
{
|
||||
Body::Term(predicate) => write!(f, "{}", predicate),
|
||||
Body::And(items) | Body::Or(items) =>
|
||||
{
|
||||
let len = items.len();
|
||||
for (i, item) in items.iter().enumerate()
|
||||
{
|
||||
write!(f, "{}", item)?;
|
||||
if i != len - 1
|
||||
{
|
||||
write!(f, ",")?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for Predicate
|
||||
{
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result
|
||||
{
|
||||
match self
|
||||
{
|
||||
Predicate::Variable(variable) => write!(f, "{}", variable),
|
||||
Predicate::Fixed(name, predicates) =>
|
||||
{
|
||||
write!(f, "{}", name)?;
|
||||
if !predicates.is_empty()
|
||||
{
|
||||
write!(f, "(")?;
|
||||
let len = predicates.len();
|
||||
for (i, predicate) in predicates.iter().enumerate()
|
||||
{
|
||||
write!(f, "{}", predicate)?;
|
||||
if i != len - 1
|
||||
{
|
||||
write!(f, ", ")?;
|
||||
}
|
||||
}
|
||||
write!(f, ")")
|
||||
}
|
||||
else
|
||||
{
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for Clause
|
||||
{
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result
|
||||
{
|
||||
write!(f, "{}", self.head)?;
|
||||
self.body
|
||||
.as_ref()
|
||||
.map_or_else(|| Ok(()), |body| write!(f, ":- {}", body))?;
|
||||
write!(f, ".")
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for Module
|
||||
{
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result
|
||||
{
|
||||
for clause in self.clauses.iter()
|
||||
{
|
||||
writeln!(f, "{}", clause)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user