packages feed

safe-coupling-0.1.0.0: src/TD/Lemmata/Relational/Act.hs

{-@ LIQUID "--reflection"     @-}
{-@ LIQUID "--ple"            @-}

module TD.Lemmata.Relational.Act where 

import           Monad.PrM
import           Data.Dist
import           Data.List
import           Prelude hiding (max)

import           Monad.PrM.Predicates
import           Monad.PrM.Relational.Theorems (mapMSpec)

import           TD.Lemmata.Relational.Sample

import           TD.TD0 
import           Language.Haskell.Liquid.ProofCombinators



{-@ relationalact :: l:Nat -> t:TransitionOf l -> m:{_|0 <= m} -> v1:{_ | llen v1 == l} 
                  -> {v2:_|llen v2 = l} 
                  -> {bounded m v1 v2 => lift (bounded (k * m)) (act l t v1) (act l t v2)} @-}
relationalact :: Int -> Transition -> Double -> ValueFunction -> ValueFunction -> ()
relationalact _ t m v1 v2 | bounded m v1 v2 
    = mapMSpec (k * m)
            (sample v1 t) (sample v2 t) 
            (range 0 (llen v1)) 
            (relationalsample m (llen v1) t v1 v2)
relationalact _ _ _ _ _ = ()