{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE DataKinds #-}
module NoAdo where
import Control.Monad.Constrained
import Data.Set
import EnumVect
import Prob
import Numeric.Sized.WordOfSize
sumThriceNoAdo :: [Int] -> Int
sumThriceNoAdo xs = size $ do
a <- fromList' xs
b <- fromList' xs
c <- upTo' (a + b)
d <- fromList' xs
e <- fromList' xs
pure (c + e + d)
where
upTo' n = fromList [1..n]
fromList' = fromList
diceNoAdo :: Int -> [Int] -> Double
diceNoAdo n die' = probOf n $ do
a <- die
b <- die
c <- upTo' (a + b)
d <- die
e <- die
pure (c + e + d)
where
die = uniform die'
upTo' = upTo
diceVectNoAdo :: WordOfSize 3 -> [WordOfSize 3] -> Double
diceVectNoAdo n die' = probOfV n $ do
a <- die
b <- upTo' a
c <- die
d <- upTo' c
pure (b + d)
where
die = uniformV die'
upTo' = upToV