Практическое задание 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.