c#中的条件表达式代数
本文关键字:表达式 条件 | 更新日期: 2023-09-27 18:05:46
我正在研究一个使用布尔条件表达式的匹配系统的一小部分。
这些条件表达式只能包含一个变量和一个操作符(有一个包含Between的边缘情况)。
我感兴趣的是:
- 等于"="
- 大于">"
- 大于或等于">="
- 小于"<"
- 小于或等于"<="
- 包括Between ">= AND <="
我需要比较两个条件表达式并求值:
1)可能的值是否有重叠?
"X> 1000"与"X> 999"重叠吗?是的。
2)如果有重叠,返回重叠部分:
"X> 1000"与"X> 999"的重叠是"X> 1000"
3)一个条件表达式是否受另一个条件表达式的约束?
"X & lt;999"受到"X <1000年";"X & lt;"1001"不受"X <1000"
到目前为止,我所做的是建立一个所有可能的组合的真值表,并返回结果,但我想知道是否有一个更简单的方法来计算这些?
有什么理论/参考资料/c#库吗?
我还没有听说过,但是如果您将约束表示为间隔,则可以轻松地不使用它们:
x> 1000变成(1000,double.Infinity)
X == 1000变成[1000,1000]
等。
这样你只需要一个类
class Constraint
{
double Lower; bool isLowerStrict;
double Upper; bool isUpperStrict;
bool isIn(double d)
{
return (isLowerStrict ? Lower < d : Lower <= d) &&
(isUpperStrict ? Upper > d : Upper >= d);
}
Constraint intersect(Constraint other)
{
Constraint result = new Constraint();
if (Lower > other.Lower)
{
result.Lower = Lower;
result.isLowerStrict = isLowerStrict;
}
else if (Lower < other.Lower)
{
result.Lower = other.Lower;
result.isLowerStrict = other.isLowerStrict;
}
else
{
result.Lower = Lower;
result.IsLowerStrict = isLowerStrict || other.isLowerStrict;
}
// the same for upper
return result;
}
public bool isEmpty()
{
if (Lower > Upper) return true;
if (Lower == Upper && (isLowerStrict || isUpperStrict)) return true;
return false;
}
public bool Equals(Constraint other)
{
if (isEmpty()) return other.isEmpty();
return (Lower == other.Lower) && (Upper = other.Upper) &&
(isLowerStrict == other.IsLowerStrict) &&
(isUpperStrict == other.isUpperStrict);
}
// construction:
static Constraint GreaterThan(double d)
{
return new Constraint()
{
Lower = d,
isLowerStrict = true,
Upper = double.PositiveInfinity,
isUpperStrict = false
};
}
static Constraint IsEqualTo(double d)
{
return new Constraint()
{
Lower = d,
isLowerStrict = false,
Upper = d,
isUpperStrict = false
};
}
// etc.
}
使用这段代码,您可以回答以下问题:
1)重叠:a.Intersect(b).isEmpty()
2)相交:a.Intersect(b)
a.Intersect(b).Equals(a)
编辑:
正如@CodeInChaos建议的那样,你应该考虑用十进制替换双精度。注意,decimal没有无穷大的值,所以应该使用decimal。MaxValue和decimal。MinValue。
我已经快速编写了一些示例代码。希望它有意义:
enum SygnType
{
More, Less, Equal
}
public class Representation
{
public SignType sign;
public int value;
}
public class Range
{
public bool infinityNegative;
public bool infinityPositive;
public int minValue;
public int maxValue;
public Range(List<Representation> values)
{
infinityNegative=true;
infinityPositive=true;
foreach(var value in values)
{
if (value.sign==SignType.More)
{
infinityNegative=false;
if (value>minValue)
minValue=value;
}
else if (value.sign==SignType.Less)
{
infinityPositive=false;
if (value<maxValue)
maxValue=value;
}
else if (value.sign==SignType.Equal)
{
infinityPositive=infinityNegative=false;
minValue=maxValue=value;
break;
}
}
}
public bool Overlaps(Range checkRange)
{
if (checkRange.infinityPositive)
return CompareUpperLevelValue(checkRange); //this method should compare upper value overlapping
else if (checkRange.infinityNegative)
return CompareLowerLevelValue(checkRange); //this method should compare lower value overlapping
else
return CompareInterval(checkRange); //this method should compare interval
}
public bool CompareUpperLevelValue(Range checkRange)
{
if (checkRange.maxValue<maxValue)
return true;
else
return false
}
public bool CompareLowerLevelValue(Range checkRange)
{
if (checkRange.minValue>minValue)
return true;
else
return false
}
public bool CompareInterval(Range checkRange)
{
if ((checkRange.minValue>minValue)&&(checkRange.maxValue<maxValue))
return true;
else
return false;
}
}