私はこの質問に出くわし、真理値表が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 { } [ ]
ここでは、真ん中の2つの句だけが衝突があるかどうかを判断していることがわかります。つまり、( [ < } ) AND NOT ( ] < { )
。これは( [ < } ) AND ( ] >= { )
、SQLと同等の(2番目のコンパレータを否定する)と同等WHERE ('from' < $TO AND 'to' >= $FROM)
です。これは意味的にはPaulの節と同等です(<=
最後まで作業することを除いて)。