我遇到了这个问题,只是想尝试展示真值表如何识别 Paul 已经发布的简化逻辑。
假设您有一个from [ to ]
要检查的时间间隔from { to }
。
这转化为以下真值表:
# [ < { [ < } ] < { ] < } Collision? Example
1 T T T T F [ ] { }
2 T T T F T [ } { ] *
3 T T F T T [ { ] }
4 T T F F T [ { } ]
5 T F T T T ] } [ { *
6 T F T F T } [ ] { *
7 T F F T Contradiction
8 T F F F T } [ { ] *
9 F T T T T ] { [ } *
10 F T T F Contradiction
11 F T F T T { [ ] }
12 F T F F T { [ } ]
13 F F T T T ] { } [ *
14 F F T F T } ] { [ *
15 F F F T T { ] } [ *
16 F F F F F { } [ ]
查看这个真值表,识别冲突的最简单表达式是:
NOT ( [ < { AND [ < } AND ] < { AND ] < } ) AND NOT ( [ >= { AND [ >= } AND ] >= { AND ] >= } )
然而我们知道,因为{ < }
和[ < ]
,这减少到
NOT ( [ < { AND ] < { ) AND NOT ( [ >= } AND ] >= } )
对应的SQL:
WHERE NOT ('from' < $FROM and 'to' < $FROM ) AND NOT ('from' > $TO and 'to' > $TO)
(类似于@TiuTalk 的建议)。
但是,我们已经假设{ < }
和[ < ]
。这很关键。查看*
真值表中标记的行。在这些行中,要么} < {
要么] < [
。我们知道那些不会发生。另外,有些行暗示了完全矛盾的事情} < { AND { < }
,比如我们知道是不可能的。消除所有这些行只得到 6 行:
# [ < { [ < } ] < { ] < } Collision? Example
1 T T T T F [ ] { }
3 T T F T T [ { ] }
4 T T F F T [ { } ]
11 F T F T T { [ ] }
12 F T F F T { [ } ]
16 F F F F F { } [ ]
在这里,我们可以看到只有中间的两个子句确定是否存在冲突。即,( [ < } ) AND NOT ( ] < { )
。这相当于( [ < } ) AND ( ] >= { )
(否定第二个比较器)相当于 SQL WHERE ('from' < $TO AND 'to' >= $FROM)
。这在语义上等价于保罗的条款(除非一直工作<=
到最后)。