В параметрах теста на основе свойств, таких как быстрая проверка Haskell для пользовательских структур данных, как вы генерируете тестовые данные для n-арных свойств отношений, например, транзитивности или симметрии? Язык реализации не имеет значения, я думаю.
Вот наивный пример C ++, использующий rapidcheck (только потому, что у меня есть этот инструмент под рукой, прямо сейчас):
rc::check("Double equality is symmetric.", [](double a, double b) {
RC_ASSERT(!(a == b) || (b == a)); // a == b ==> b == a
});
В таком наивном случае весьма маловероятно, что инструмент создаст много примеров, когда предпосылка (a == b
) действительно выполняется, так что в итоге вы тратите много усилий на бессмысленные тесты. Это становится еще хуже для 3-арных отношений, таких как транзитивность.
Существует ли общий метод решения этих проблем? Нужно ли генерировать равные пары (для некоторого конструктивного определения «равных»)? А как насчет таких вещей, как заказы?