Как получить хорошие (маленькие) сокращения из QuickCheck? - PullRequest
31 голосов
/ 09 января 2012

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 08 августа 2012

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

1 голос
/ 24 января 2012

У меня была похожая проблема, но я использовал C и самодельный генератор примеров :) У меня была медленная и правильная, быстрая и неправильная реализация.

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

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

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

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

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

Для более научного взгляда я предлагаю главу «Упрощение проблем» из книги «ПОЧЕМУ ПРОГРАММЫ НЕ УДАЛЯЮТ: Руководство по систематической отладке» А. Зеллера.

Примечание: это в основном то, что делает термоусадка ...

...