Как фальсифицировать коммутативность композиции функций с помощью QuickCheck - PullRequest
0 голосов
/ 18 ноября 2011
  1. Что такое ex, который должен быть передан в CoArbitrary следующего кода?

  2. Как использовать функцию в Test.QuickCheck.Function для представления f и g в предложении?

  3. правильно ли написать, если нет, то как?

    где types = [f, g] :: [Function]

  4. Может ли вариант принять функцию? как я знаю, функция генерации часто использует> <или вариант, который указан в исходном коде QuickCheck </p>

Ошибка:

<interactive>:1:12:
    No instance for (Eq (b0 -> b0))
      arising from a use of `prop_commutative'
    Possible fix: add an instance declaration for (Eq (b0 -> b0))
    In the first argument of `quickCheck', namely `prop_commutative'
    In the expression: quickCheck prop_commutative
    In an equation for `it': it = quickCheck prop_commutative

[Обновлено]

но это не реализовано CoArbitrary http://www.google.com.hk/url?sa=t&rct=j&q=QuickCheck+meiser.pdf&source=web&cd=1&ved=0CBwQFjAA&url=http%3A%2F%2Fwww.st.cs.uni-saarland.de%2Fedu%2Fseminare%2F2005%2Fadvanced-fp%2Fslides%2Fmeiser.pdf&ei=hhfHTo_ZDdCciAethMjqDw&usg=AFQjCNFF467CXacWGMkN8jvgqatkcLcVcg

Другая запись имитирует пример в функции, ошибка синтаксического анализа при '=' в ghci let prop_commutative (Fun _ f) (Fun _ g) = (f.g) == (g.f) можно запустить

код:

import Test.QuickCheck.Function
import Test.QuickCheck.Gen
import Test.QuickCheck

let prop_commutative (Fun _ f) (Fun _ g) = (f.g) == (g.f)

main = quickCheck prop_commutative

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

QuickCheck ищет контрпримеры . Таким образом, вы должны предоставить отрицание собственности, которую вы ищете:

prop1 f g x = not $ (f . g) x == (g . f) x

Это конкретное свойство не указывает тип функции - любая функция a -> a может работать. Поэтому вам необходимо указать типы для f и g или для всей функции prop1.

  1. Вы не можете сравнивать f . g и g . f на равенство, поскольку они обе являются функциями, и у вас не может быть разумного определения Eq для функций с бесконечными доменами в Haskell. Вам также необходимо случайным образом сгенерировать аргумент и сравнить функции f . g и g . f, сравнив их результаты. передав случайный аргумент обоим.

  2. Прочитайте документацию по типу Fun _ f. f существует мономорфная функция. QuickCheck не может генерировать случайные функции разных типов - он может генерировать только функции определенного типа. Но . является полиморфным , поэтому конкретный тип f не может быть выведен из контекста. Поэтому вам нужно выбрать несколько произвольных типов для f и g и указать это в сигнатуре типа для вашего свойства.

Кроме того, вам не нужно let для определений верхнего уровня. Пусть можно использовать только внутри выражений в виде let..in и внутри do блоков без in.

0 голосов
/ 19 ноября 2011

Принимая заметку от nponeccop, я бы предложил этот шаблон:

import Test.QuickCheck

prop_commutative f g x = ...

main = quickCheck $ prop_commutative f g
  where f x = ...
        g x = ...

Этот подход требует, чтобы вы выдвинули контрпример. Все просто: представьте себе две функции, которые, будучи составленными в обоих направлениях, не дают одинакового результата. Этот подход также использует частичное применение. Я передал две функции prop_commutative, оставив только 1005 * для быстрой генерации и проверки.

Хотя это может быть слишком просто. Если вы можете сделать это, то следующий шаг - удалить конкретные контрпримеры и выяснить, как заставить quickCheck генерировать функции для вас.

...