|
5 | 5 | // Website: https://am.angouri.org. |
6 | 6 | // |
7 | 7 |
|
| 8 | +using System; |
8 | 9 | using static AngouriMath.Entity; |
9 | 10 | using static AngouriMath.Entity.Boolean; |
| 11 | +using static Antlr4.Runtime.Atn.SemanticContext; |
10 | 12 |
|
11 | 13 | namespace AngouriMath.Functions |
12 | 14 | { |
@@ -55,12 +57,20 @@ private static bool OppositeSigns(ComparisonSign left, ComparisonSign right) |
55 | 57 | Notf(Lessf(var any1, var any2)) => any1 >= any2, |
56 | 58 | Notf(GreaterOrEqualf(var any1, var any2)) => any1 < any2, |
57 | 59 | Notf(LessOrEqualf(var any1, var any2)) => any1 > any2, |
| 60 | + // If we have a bunch of comparison operators combined with AND/OR and NOT outside, we can push the NOT inside and flip all the operators. |
| 61 | + // For complexity to not increase, maximum one AND/OR component can be something other than a comparison operator to propagate NOT into. |
| 62 | + // e.g. not (a > b and b = c) becomes (a <= b or not b = c) |
| 63 | + // Note that Notf(Equalsf) has the same complexity as Equalsf in ComplexityCriteria, so it can be treated as a comparison operator here. |
| 64 | + Notf(Andf a) when Andf.LinearChildren(a).Count(n => n is not (ComparisonSign or Notf or Orf)) <= 1 => |
| 65 | + Andf.LinearChildren(a).Select(e => InequalityEqualityRules(e switch { Notf(var n) => n, var n => new Notf(n) })).Aggregate((a, b) => a | b), |
| 66 | + Notf(Orf a) when Orf.LinearChildren(a).Count(n => n is not (ComparisonSign or Notf or Andf)) <= 1 => |
| 67 | + Orf.LinearChildren(a).Select(e => InequalityEqualityRules(e switch { Notf(var n) => n, var n => new Notf(n) })).Aggregate((a, b) => a & b), |
58 | 68 |
|
59 | 69 | Impliesf(Andf(Greaterf(var any1, var any2), Greaterf(var any2a, var any3)), Greaterf(var any1a, var any3a)) |
60 | | - when any1 == any1a && any2 == any2a && any3 == any3a => True, |
| 70 | + when any1 == any1a && any2 == any2a && any3 == any3a => True.Provided(any1.DomainCondition).Provided(any2.DomainCondition).Provided(any3.DomainCondition), |
61 | 71 |
|
62 | 72 | Impliesf(Andf(Lessf(var any1, var any2), Lessf(var any2a, var any3)), Lessf(var any1a, var any3a)) |
63 | | - when any1 == any1a && any2 == any2a && any3 == any3a => True, |
| 73 | + when any1 == any1a && any2 == any2a && any3 == any3a => True.Provided(any1.DomainCondition).Provided(any2.DomainCondition).Provided(any3.DomainCondition), |
64 | 74 |
|
65 | 75 | Equalsf(var zero, var anyButZero) when IsZero(zero) && !IsZero(anyButZero) => anyButZero.Equalizes(zero), |
66 | 76 | Greaterf(var zero, var anyButZero) when IsZero(zero) && !IsZero(anyButZero) => anyButZero < zero, |
@@ -129,10 +139,10 @@ private static bool OppositeSigns(ComparisonSign left, ComparisonSign right) |
129 | 139 | // a! = 0 |
130 | 140 | Equalsf(Factorialf({ DomainCondition: var condition }), var zeroEnt) when IsZero(zeroEnt) => False.Provided(condition), |
131 | 141 |
|
132 | | - Greaterf(var any1, var any1a) when any1 == any1a => false, |
133 | | - Lessf(var any1, var any1a) when any1 == any1a => false, |
134 | | - GreaterOrEqualf(var any1, var any1a) when any1 == any1a => true, |
135 | | - LessOrEqualf(var any1, var any1a) when any1 == any1a => true, |
| 142 | + Greaterf(var any1, var any1a) when any1 == any1a => False.Provided(any1.DomainCondition), |
| 143 | + Lessf(var any1, var any1a) when any1 == any1a => False.Provided(any1.DomainCondition), |
| 144 | + GreaterOrEqualf(var any1, var any1a) when any1 == any1a => True.Provided(any1.DomainCondition), |
| 145 | + LessOrEqualf(var any1, var any1a) when any1 == any1a => True.Provided(any1.DomainCondition), |
136 | 146 |
|
137 | 147 | _ => x |
138 | 148 | }; |
|
0 commit comments