Rewrite formula and term formatting
The rules for determining required parentheses as opposed to parentheses that can be omitted are more complicated than just showing parentheses whenever a child expression has lower precedence than its parent. This necessitated a rewrite. This new implementation determines whether an expression requires to be parenthesized with individual rules for each type of expression, which may or may not depend on the type of the parent expression and the position of a child within its parent expression. For example, implication is defined to be right-associative, which means that the parentheses in the formula (F -> G) -> H cannot be ommitted. When determining whether the subformula (F -> G) needs to be parenthesized, the new algorithm notices that the subformula is contained as the antecedent of another implication and concludes that parentheses are required. Furthermore, this adds extensive unit tests for both formula and term formatting. The general idea is to test all types of expressions individually and, in addition to that, all combinations of parent and child expression types. Unit testing made it clear that the formatting of empty and 1-ary conjunctions, disjunctions, and biconditionals needs to be well-defined even though these types of formulas may be unconventional. The same applies to existentially and universally quantified formulas where the list of parameters is empty. Now, empty conjunctions and biconditionals are rendered like true Booleans, empty disjunctions like false Booleans, and 1-ary conjunctions, disjunctions, biconditionals, as well as quantified expressions with empty parameter lists as their singleton argument. The latter formulas can be considered neutral intermediates. That is, they should not affect whether their singleton arguments are parenthesized or not. To account for that, all unit tests covering combinations of formulas are tested with any of those five neutral intermediates additionally.
This commit is contained in:
parent
8e32b58c99
commit
d67e530fec
@ -445,8 +445,6 @@ impl Formula
|
|||||||
{
|
{
|
||||||
pub fn and(arguments: Formulas) -> Self
|
pub fn and(arguments: Formulas) -> Self
|
||||||
{
|
{
|
||||||
assert!(!arguments.is_empty());
|
|
||||||
|
|
||||||
Self::And(arguments)
|
Self::And(arguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,8 +460,6 @@ impl Formula
|
|||||||
|
|
||||||
pub fn exists(parameters: std::rc::Rc<VariableDeclarations>, argument: Box<Formula>) -> Self
|
pub fn exists(parameters: std::rc::Rc<VariableDeclarations>, argument: Box<Formula>) -> Self
|
||||||
{
|
{
|
||||||
assert!(!parameters.is_empty());
|
|
||||||
|
|
||||||
Self::Exists(QuantifiedFormula::new(parameters, argument))
|
Self::Exists(QuantifiedFormula::new(parameters, argument))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -479,8 +475,6 @@ impl Formula
|
|||||||
|
|
||||||
pub fn for_all(parameters: std::rc::Rc<VariableDeclarations>, argument: Box<Formula>) -> Self
|
pub fn for_all(parameters: std::rc::Rc<VariableDeclarations>, argument: Box<Formula>) -> Self
|
||||||
{
|
{
|
||||||
assert!(!parameters.is_empty());
|
|
||||||
|
|
||||||
Self::ForAll(QuantifiedFormula::new(parameters, argument))
|
Self::ForAll(QuantifiedFormula::new(parameters, argument))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -527,8 +521,6 @@ impl Formula
|
|||||||
|
|
||||||
pub fn or(arguments: Formulas) -> Self
|
pub fn or(arguments: Formulas) -> Self
|
||||||
{
|
{
|
||||||
assert!(!arguments.is_empty());
|
|
||||||
|
|
||||||
Self::Or(arguments)
|
Self::Or(arguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,2 @@
|
|||||||
mod formulas;
|
mod formulas;
|
||||||
mod terms;
|
mod terms;
|
||||||
|
|
||||||
trait Precedence
|
|
||||||
{
|
|
||||||
fn precedence(&self) -> i32;
|
|
||||||
}
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
1063
src/format/terms.rs
1063
src/format/terms.rs
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user