1

undefinedプログラムをコンパイルしてテストするために何かを記入することになっています。ここで symdiff が何をすることになっているのかよくわからないので、 に何を入力すればよいかわかりませんundefined。誰かが私に何を挿入できるか、ヒントを教えてもらえますかundefined?

ところで、コードを ghci 7.6.3 でコンパイルしようとすると、エラーが発生します。 Could not find module 'Test.SmallCheck.Series'どうすれば修正できますか?

コードは次のとおりです。

{-# language FlexibleInstances #-}
{-# language MultiParamTypeClasses #-}
{-# language NoMonomorphismRestriction #-}

module Blueprint where

import Test.SmallCheck
import Test.SmallCheck.Series

data N = Z | S N deriving (Show , Eq)

symdiff :: N -> N -> N
symdiff x y = undefined



-- for testing in ghci:  smallCheck 10 spec1


spec1 = \ (x,y) -> symdiff x y == symdiff y x
spec2 = \ (x,y) -> symdiff x (plus x y) == y


plus :: N -> N -> N
plus x y = case x of
    Z -> y
    S x' -> S (plus x' y)

test :: Bool
test = and
   [ null $ failures 10 1000 $ spec1
   , null $ failures 10 1000 $ spec2   
   ]

instance Monad m => Serial m N where series = cons0 Z \/ cons1 S

-- | first f failures from t testcases for property p
failures f t p = take f
               $ filter ( \ x -> not $ p x ) 
               $ take t
               $ do d <- [ 0 .. ] ; list d series

ありがとう、それはとても役に立ちました!これはどうですか:

symdiff :: N -> N -> N
symdiff x y = case x of
    Z -> y
    S x' -> case y of
        Z -> x
        S y' -> ???

これらの行は正しいですか(???の行を除いて、私はすでに考えています)

これは最後の行で機能します。 S y' -> symdiff x' y'

4

1 に答える 1

6

ヒントは smallcheck テストにあります。

spec1 = \ (x,y) -> symdiff x y == symdiff y x
spec2 = \ (x,y) -> symdiff x (plus x y) == y

これはsymdiff、2 つの方程式を満たす必要があることを意味します。

symdiff x y == symdiff y x  -- shouldn't matter what order (symmetric?)
symdiff x (plus x y) == y   -- if they differ by y, that's the answer (difference)

つまりsymdiff、2 つの引数の違いを見つける必要があります。

ZゼロとS xの後継x、つまりx+1と考える必要があります。

の良いニュースは、 の可能性は 2 つしかないNため、 の方程式は最大 4 つですsymdiff

symdiff Z Z =
symdiff Z (S y) = 
symdiff (S x) Z = 
symdiff (S x) (S y) =


0 と 0
0 と 1+y
1+x と 0
1+x と 1+y
の違いを見つける方法を考えてみ
てください。

(より少ないケースに単純化できますが、これらの 4 つから始めてください。)

今それについて考えてみてください。よく考えた後でもヒントが足りない場合は、コメントしてください。

于 2014-05-07T16:33:26.870 に答える