Тайм-аут при проверке WP с помощью Alt-ergo на Frama C
Я пытался проверить правильность приведенной ниже программы с помощью Frama-c. Я новый пользователь frama-C.
ПРОБЛЕМА:
Введите базовую заработную плату сотрудника и рассчитайте его валовую заработную плату в соответствии со следующим
Базовая зарплата <= 10000: HRA = 20%, DA = 80%
Базовая зарплата <= 20000: HRA = 25%, DA = 90%
Базовая зарплата> 20000: HRA = 30%, DA = 95%
#include <limits.h>
/*@requires sal >= 0 && sal <= INT_MAX/2;
ensures \result > sal && \result <= INT_MAX[enter image description here][1];
behavior sal1:
assumes sal <= 10000;
ensures \result == sal+(sal*0.2*0.8);
behavior sal2:
assumes sal <= 20000;
ensures \result == sal+(sal*0.25*0.9);
behavior sal3:
assumes sal >20000;
ensures \result == sal+(sal*0.3*0.95);
complete behaviors sal1,sal2,sal3;
*/
double salary(double sal){
if(sal<=10000){return (sal+(sal*0.2*0.8));}
else if(sal<=20000){return (sal+(sal*0.25*0.9));}
else{return (sal+(sal*0.3*0.95));}
}
какую ошибку я здесь делаю? если предусловие должно быть более точным.
консольное сообщение:
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_ensures : Timeout (Qed:57ms) (10s)
(cached)
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_assert_rte_is_nan_or_infinite_3 :
Timeout (Qed:20ms) (10s) (cached)
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_assert_rte_is_nan_or_infinite_6 :
Timeout (Qed:2ms) (10s) (cached)
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_assert_rte_is_nan_or_infinite_5 :
Timeout (Qed:2ms) (10s) (cached)
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_assert_rte_is_nan_or_infinite_4 :
Timeout (Qed:17ms) (10s) (cached)
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_assert_rte_is_nan_or_infinite_7 :
Timeout (Qed:15ms) (10s) (cached)
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_sal1_ensures : Timeout (Qed:33ms)
(10s) (cached)
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_assert_rte_is_nan_or_infinite_9 :
Timeout (Qed:2ms) (10s) (cached)
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_assert_rte_is_nan_or_infinite_8 :
Timeout (Qed:4ms) (10s) (cached)
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_sal2_ensures : Timeout (Qed:42ms)
(10s) (cached)
[wp] [Alt-Ergo 2.3.3] Goal typed_salary_sal3_ensures : Timeout (Qed:35ms)
(10s) (cached)
1 ответ
Автоматические средства доказательства теорем обычно довольно плохо ведут себя при вычислении с плавающей запятой (см., Например, этот отчет). Если они вам действительно очень нужны, вы можете установить Gappa, который специализируется на этом, или надеяться, что использование CVC4, Z3 и Alt-Ergo (в отличие от просто Alt-Ergo) позволит вам иметь хотя бы один прувер. в состоянии выполнить каждое обязательство по доказательству. Но я бы посоветовал придерживаться целочисленной арифметики, например, используя центы в качестве единицы, чтобы управлять только целыми числами при вычислении процентов (РЕДАКТИРОВАТЬ: поскольку ваше умножение процентов, это будет означать работу с 1/10000 единиц, но все равно не должно быть проблемой). Фактически, если вы настаиваете на двойных значениях, требования иметь значения меньше
INT_MAX
не имеет особого смысла.
В том же духе, если вы используете целочисленный тип, вероятно, проще выбрать
unsigned
, что автоматически выполнит требование о наличии неотрицательной зарплаты.
Наконец, ваша спецификация неоднозначна: для любой зарплаты меньше 10000 у вас есть две различные формулы для вычисления результата. то
assumes
пункт поведения
sal2
наверное следует читать:
assumes 10000 < sal <= 20000;