diff --git a/lab4/.gitignore b/lab4/.gitignore new file mode 100644 index 0000000..38ee138 --- /dev/null +++ b/lab4/.gitignore @@ -0,0 +1 @@ +!task.txt \ No newline at end of file diff --git a/lab4/task.jpg b/lab4/task.jpg new file mode 100644 index 0000000..e3926cd Binary files /dev/null and b/lab4/task.jpg differ diff --git a/lab4/task.txt b/lab4/task.txt new file mode 100644 index 0000000..16f40f9 --- /dev/null +++ b/lab4/task.txt @@ -0,0 +1,19 @@ +Практическое задание 4. Тестирование в Haskell +№ 12 + +Создать проект в stack. Функции записать в библиотеку Lib.hs и ограничить доступ к вспомогательным функциям. Тесты записать в Spec.hs. + +Функция 1: Напишите функцию проверки равенства по модулю isCongruent :: Int -> Int -> Int -> Bool, которая проверяет, равны ли два числа по модулю третьего числа. Используя QuickCheck, проверьте следующие свойства: + +1. Если два числа равны по модулю, то их разность делится на модуль: + isCongruent a b m == (modulus (a - b) m == 0). +2. Равенство по модулю является симметричным: + isCongruent a b m == isCongruent b a m. +3. Если одно число равно другому, то они равны по любому модулю: + если a == b, то isCongruent a b m == True. + +Функция 2: Напишите функцию filterByPredicate :: (a -> Bool) -> [a] -> [a], которая фильтрует элементы списка по заданному предикату. Используя QuickCheck, проверьте следующие свойства: + +1. Все элементы результата удовлетворяют предикату: для каждого элемента x из результата должно выполняться условие: predicate x == True. +2. Длина результата не превышает длину исходного списка: length (filterByPredicate predicate xs) <= length xs. +3. Если предикат всегда возвращает True, то результат совпадает с исходным списком: если predicate x == True для всех x, то filterByPredicate predicate xs == xs. \ No newline at end of file