Подтвердить что ты не робот

Как мне стать хорошим (маленьким) с QuickCheck?

Я пытаюсь запустить QuickCheck в некоторых вложенных списках, что-то похожее на это:

type Constraint = Text
data Value = Value [Constraint]
data Literal = Literal Value [Value]
type Formula = [Literal]

Таким образом, формула представляет собой список литералов, каждый из которых содержит предикат и некоторые аргументы; предикат/аргументы - это значения, которые являются дизъюнкцией ограничений в форме строки каждый. Это дает нам список списков списков, phew!

Если один из моих свойств QuickCheck не работает, я, как правило, получаю непонятную страницу вывода. Прежде чем экспериментировать с термоусадочной пленкой, я использовал это, чтобы иметь произвольные экземпляры, которые могли генерировать только небольшой набор (малых) значений. Реализация функции усадки для каждого из моих типов, похоже, немного помогает, но не так сильно, как хотелось бы. Я все еще получаю распечатку вывода.

Я думаю, что я хочу от сокращения - это небольшой список литералов, где каждый литерал имеет небольшой список значений, который, в свою очередь, имеет несколько ограничений, каждый из которых как можно короче. Но в моих текущих усилиях, по крайней мере, из этих списков становится достаточно большим, чтобы сделать выход ужасным. Если я попытаюсь настроить мои сокращения, я также обнаружил, что QC начинает очень долго (поиск сокращений?), Что смягчает мои усилия по эффективному сокращению.

Как вы улучшаете свои шансы на понимание сбоев QuickCheck, когда у вас есть вложенные данные?

4b9b3361

Ответ 1

FWIW, посмотрите https://github.com/leepike/SmartCheck, который утверждает, что он лучше сокращается, чем обычно можно делать вручную.

Ответ 2

У меня была аналогичная проблема, но я использовал генератор примеров C и home made:) У меня была медленная и правильная, быстрая и некорректная реализация.

Используя случайные примеры, когда вы найдете неверный пример, я бы предложил уменьшить сам пример. (Это, конечно, может или должно быть сделано программой, а не компьютером)

Если у вас есть предикат для этого теста, и у вас есть пример, который не работает, попробуйте исключить списки форм элементов, всех заказов (это должен быть линейный порядок значений звонков) и для каждой попытки, если он не прошел тест.

Если он все еще терпит неудачу, нет причин для сохранения этого в примере.

Если он начинает проходить, то этот элемент должен оставаться в сокращенном примере.

(Это жадный и не оптимальный, но он выполняет в poly вместо экспоненциального времени, и это сработало для меня)

Для более научного взгляда я предлагаю главу "Упрощение проблем" из книги "ПОЧЕМУ ПРОГРАММЫ НЕИСПРАВНО: руководство по систематической отладке" от A.Zeller.

Примечание: в основном это сокращение...