化简常量表达式可能会遇到任意多个区间的交,并。
下面简单描述算法。
一 任意多个交
集合分为六种类型。
1 单点集 x=a
2 空集
3 全集
4 两个参数的区间 a<x<b
5 正无穷 x>a
6 负无穷 x<b
其中1,4可以多个。假设已经全为不交情形。
两个上述六种类型的并的交:
单点集,空集,全集都比较简单,可先不考虑。
只考虑多个4,及单个5,6情形。
1 如果两个都含有负无穷,取小的为a。保存x<a。否则空。继续。
2 如果两个都含有正无穷,取大的为b。保存x>b。否则空。继续。
3 记A为上述xa,B为上述xb。如果不存在则取所有区间的最小最大值。
4 对区间[xa,xb]遍历如下:从左到右
设a1,b1;a2,b2;.....;an,bn;
c1,d1;c2,d2;.....;cm,dm;
取a1,c1最大值不妨设为a1。记A0=a1,B0=b1. 此时对于另一边有三种情况:
d1>a1且d1<b1:保存(a1,d1) 取下一个区间继续。
d1<a1:取下一个区间继续。
d1>b1:保存(a1,b1)取下一个区间继续。
二 任意多个并:
1 前面留大的;
2 后面留小的;
3 同样处理;
4 区间遍历 (a1,b1)(a2,b2)设a1小,
a2>b1或b2<b1 舍去继续;
a2<b1且b2>b1 保存成一个(a1,b2)继续。