重叠(X, Y):= if (X1 <= Y1) then (Y1 <= X2) else (X1 <= Y2)。
证明:
考虑X在Y之前或与Y左对齐的情况,即X1 <= Y1。那么Y要么在X内部开始,要么在X的末尾开始,即Y1 <= X2;或者Y远离x,第一个条件是重叠;第二个,不是。
在互补的情况下,Y在X之前,同样的逻辑适用于交换的实体。
So,
重叠(X, Y):= if (X1 <= Y) then (Y1 <= X2) else重叠(Y, X)。
但这似乎并不完全正确。在递归调用中,第一个测试是多余的,因为我们已经从第一个调用的第一个测试中知道了实体的相对位置。因此,我们实际上只需要测试第二个条件,即交换后(X1 <= Y2)。所以,
重叠(X, Y):= if (X1 <= Y1) then (Y1 <= X2) else (X1 <= Y2)。
QED.
Ada的实现:
type Range_T is array (1 .. 2) of Integer;
function Overlap (X, Y: Range_T) return Boolean is
(if X(1) <= Y(1) then Y(1) <= X(2) else X(1) <= Y(2));
测试程序:
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
type Range_T is array (1 .. 2) of Integer;
function Overlap (X, Y: Range_T) return Boolean is
(if X(1) <= Y(1) then Y(1) <= X(2) else X(1) <= Y(2));
function Img (X: Range_T) return String is
(" [" & X(1)'Img & X(2)'Img & " ] ");
procedure Test (X, Y: Range_T; Expect: Boolean) is
B: Boolean := Overlap (X, Y);
begin
Put_Line
(Img (X) & " and " & Img (Y) &
(if B then " overlap .......... "
else " do not overlap ... ") &
(if B = Expect then "PASS" else "FAIL"));
end;
begin
Test ( (1, 2), (2, 3), True); -- chained
Test ( (2, 3), (1, 2), True);
Test ( (4, 9), (5, 7), True); -- inside
Test ( (5, 7), (4, 9), True);
Test ( (1, 5), (3, 7), True); -- proper overlap
Test ( (3, 7), (1, 5), True);
Test ( (1, 2), (3, 4), False); -- back to back
Test ( (3, 4), (1, 2), False);
Test ( (1, 2), (5, 7), False); -- disjoint
Test ( (5, 7), (1, 2), False);
end;
以上程序输出:
[ 1 2 ] and [ 2 3 ] overlap .......... PASS
[ 2 3 ] and [ 1 2 ] overlap .......... PASS
[ 4 9 ] and [ 5 7 ] overlap .......... PASS
[ 5 7 ] and [ 4 9 ] overlap .......... PASS
[ 1 5 ] and [ 3 7 ] overlap .......... PASS
[ 3 7 ] and [ 1 5 ] overlap .......... PASS
[ 1 2 ] and [ 3 4 ] do not overlap ... PASS
[ 3 4 ] and [ 1 2 ] do not overlap ... PASS
[ 1 2 ] and [ 5 7 ] do not overlap ... PASS
[ 5 7 ] and [ 1 2 ] do not overlap ... PASS