У меня есть функция, которая должна возвращать количество найденных островов.
Я называю эту функцию Count_Islands, которая принимает параметр Map_Array типа Map, из которых Map является массивом островов.
острововтип перечислителя с набором Land, Water.
У меня есть спецификация функции в .ads и тело в .adb
Проблема, с которой я сейчас сталкиваюсь, заключается в том, чтобы доказать, что моя функция Count_Islands'Result будет меньше (X * Y)
Я пытался: с post => Count_Islands'Result - Всякий раз, когда я запускаю, докажите, что весь источник, который я получил: medium: postcondition может не получиться, не может доказать Count_Islands'Result
Функция в .adb:
function Count_Islands(Map_Array : Map)
return Integer with Pre => Map_Array'Length /= 0,
Post => Count_Islands'Result < X * Y;
Функция в .adb:
function Count_Islands(Map_Array : Map) return Integer
is
Visited_Array : Visited := (others => (others=> False));
Count : Integer := 0;
begin
if (Map_Array'Length = 0)then
return 0;
end if;
for i in X_Range loop
for j in Y_Range loop
if (Map_Array(i, j) = Land and then not Visited_Array(i,j)) then
Visited_Array := Visit_Islands(Map_Array, i, j,Visited_Array);
Count := Count + 1;
end if;
end loop;
end loop;
return Count;
end Count_Islands;
В матрице 4 * 5, например, то есть мои X = 4 и Y = 5 :
Map_Array : constant Map := ((Land, Water, Land, Water, Water),
(Land, Water, Land, Land, Water),
(Land, Water, Land, Land, Water),
(Land, Land, Land, Land, Water));
Я ожидаю, что выходной результат для островов (земель) будет равен 1, который меньше 4 * 5.GNATprove не может доказать моюисходный код для анализа этого, используя Post => Count_Islands'Result
Есть ли лучший способ доказать эту арифметику? Спасибо за вашу помощь.