Handle comparisons with nonarithmetic terms

This commit is contained in:
Patrick Lühne 2019-11-02 02:26:56 +01:00
parent 7d47910cfa
commit 00169b2144
Signed by: patrick
GPG Key ID: 05F3611E97A70ABF
1 changed files with 73 additions and 6 deletions

View File

@ -4,6 +4,27 @@ pub trait DisplayTPTP<'a, DisplayType>
fn display_tptp(&'a self) -> DisplayType;
}
fn is_arithmetic_term(term: &foliage::Term) -> bool
{
match term
{
foliage::Term::Infimum => false,
foliage::Term::Supremum => false,
foliage::Term::Integer(_) => true,
foliage::Term::Symbolic(_) => false,
foliage::Term::String(_) => false,
foliage::Term::Variable(ref declaration) => match declaration.domain
{
foliage::Domain::Program => false,
foliage::Domain::Integer => true,
},
foliage::Term::Add(ref left, ref right) => is_arithmetic_term(left) && is_arithmetic_term(right),
foliage::Term::Subtract(ref left, ref right) => is_arithmetic_term(left) && is_arithmetic_term(right),
foliage::Term::Multiply(ref left, ref right) => is_arithmetic_term(left) && is_arithmetic_term(right),
foliage::Term::Negative(ref argument) => is_arithmetic_term(argument),
}
}
struct VariableDeclarationDisplay<'a>(&'a foliage::VariableDeclaration);
struct TermDisplay<'a>(&'a foliage::Term);
struct FormulaDisplay<'a>(&'a foliage::Formula);
@ -106,6 +127,52 @@ impl<'a> std::fmt::Debug for FormulaDisplay<'a>
{
fn fmt(&self, format: &mut std::fmt::Formatter) -> std::fmt::Result
{
#[derive(Eq, PartialEq)]
enum Notation
{
Prefix,
Infix,
}
let mut display_comparison = |notation, operator_identifier: &str, left, right| -> Result<(), std::fmt::Error>
{
if notation == Notation::Prefix
{
write!(format, "{}(", operator_identifier)?;
}
if is_arithmetic_term(left) && !is_arithmetic_term(right)
{
write!(format, "f__integer__({})", left.display_tptp())?;
}
else
{
write!(format, "{}", left.display_tptp())?;
}
match notation
{
Notation::Prefix => write!(format, ", ")?,
Notation::Infix => write!(format, " {} ", operator_identifier)?,
}
if is_arithmetic_term(right) && !is_arithmetic_term(left)
{
write!(format, "f__integer__({})", right.display_tptp())?;
}
else
{
write!(format, "{}", right.display_tptp())?;
}
if notation == Notation::Prefix
{
write!(format, ")")?;
}
Ok(())
};
match self.0
{
foliage::Formula::Exists(ref exists) =>
@ -167,12 +234,12 @@ impl<'a> std::fmt::Debug for FormulaDisplay<'a>
},
foliage::Formula::Implies(ref left, ref right) => write!(format, "({:?} => {:?})", left.display_tptp(), right.display_tptp()),
foliage::Formula::Biconditional(ref left, ref right) => write!(format, "({:?} <=> {:?})", left.display_tptp(), right.display_tptp()),
foliage::Formula::Less(ref left, ref right) => write!(format, "$less({:?}, {:?})", left.display_tptp(), right.display_tptp()),
foliage::Formula::LessOrEqual(ref left, ref right) => write!(format, "$lesseq({:?}, {:?})", left.display_tptp(), right.display_tptp()),
foliage::Formula::Greater(ref left, ref right) => write!(format, "$greater({:?}, {:?})", left.display_tptp(), right.display_tptp()),
foliage::Formula::GreaterOrEqual(ref left, ref right) => write!(format, "$greatereq({:?}, {:?})", left.display_tptp(), right.display_tptp()),
foliage::Formula::Equal(ref left, ref right) => write!(format, "({:?} = {:?})", left.display_tptp(), right.display_tptp()),
foliage::Formula::NotEqual(ref left, ref right) => write!(format, "({:?} ~= {:?})", left.display_tptp(), right.display_tptp()),
foliage::Formula::Less(ref left, ref right) => display_comparison(Notation::Prefix, "$less", left, right),
foliage::Formula::LessOrEqual(ref left, ref right) => display_comparison(Notation::Prefix, "$lesseq", left, right),
foliage::Formula::Greater(ref left, ref right) => display_comparison(Notation::Prefix, "$greater", left, right),
foliage::Formula::GreaterOrEqual(ref left, ref right) => display_comparison(Notation::Prefix, "$greatereq", left, right),
foliage::Formula::Equal(ref left, ref right) => display_comparison(Notation::Infix, "=", left, right),
foliage::Formula::NotEqual(ref left, ref right) => display_comparison(Notation::Infix, "~=", left, right),
foliage::Formula::Boolean(value) =>
match value
{