{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
module Circuit.Markov
(
copyNatural,
discardNatural,
deterministic,
)
where
import Circuit.Bimonoid (Copy (..), Discard (..))
import Circuit.Category (Category (..))
import Circuit.Tensor (Tensor (..))
import Prelude hiding (id, (.))
copyNatural ::
(Tensor (,) arr, Copy arr a, Copy arr b) =>
(arr a (b, b) -> arr a (b, b) -> Bool) ->
arr a b ->
Bool
copyNatural :: forall (arr :: * -> * -> *) a b.
(Tensor (,) arr, Copy arr a, Copy arr b) =>
(arr a (b, b) -> arr a (b, b) -> Bool) -> arr a b -> Bool
copyNatural arr a (b, b) -> arr a (b, b) -> Bool
eq arr a b
f = arr a (b, b) -> arr a (b, b) -> Bool
eq (arr b (b, b)
forall (arr :: * -> * -> *) a. Copy arr a => arr a (a, a)
copy arr b (b, b) -> arr a b -> arr a (b, b)
forall b c a. arr b c -> arr a b -> arr a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr a b
f) (arr a b -> arr a b -> arr (a, a) (b, b)
forall a b c d. arr a b -> arr c d -> arr (a, c) (b, d)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k) (d :: k).
Tensor t arr =>
arr a b -> arr c d -> arr (t a c) (t b d)
tensor arr a b
f arr a b
f arr (a, a) (b, b) -> arr a (a, a) -> arr a (b, b)
forall b c a. arr b c -> arr a b -> arr a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr a (a, a)
forall (arr :: * -> * -> *) a. Copy arr a => arr a (a, a)
copy)
{-# INLINE copyNatural #-}
discardNatural ::
(Category arr, Discard arr a, Discard arr b) =>
(arr a () -> arr a () -> Bool) ->
arr a b ->
Bool
discardNatural :: forall (arr :: * -> * -> *) a b.
(Category arr, Discard arr a, Discard arr b) =>
(arr a () -> arr a () -> Bool) -> arr a b -> Bool
discardNatural arr a () -> arr a () -> Bool
eq arr a b
f = arr a () -> arr a () -> Bool
eq (arr b ()
forall {k} (arr :: k -> * -> *) (a :: k). Discard arr a => arr a ()
discard arr b () -> arr a b -> arr a ()
forall b c a. arr b c -> arr a b -> arr a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr a b
f) arr a ()
forall {k} (arr :: k -> * -> *) (a :: k). Discard arr a => arr a ()
discard
{-# INLINE discardNatural #-}
deterministic ::
( Tensor (,) arr,
Copy arr a,
Copy arr b,
Discard arr a,
Discard arr b
) =>
(arr a (b, b) -> arr a (b, b) -> Bool) ->
(arr a () -> arr a () -> Bool) ->
arr a b ->
Bool
deterministic :: forall (arr :: * -> * -> *) a b.
(Tensor (,) arr, Copy arr a, Copy arr b, Discard arr a,
Discard arr b) =>
(arr a (b, b) -> arr a (b, b) -> Bool)
-> (arr a () -> arr a () -> Bool) -> arr a b -> Bool
deterministic arr a (b, b) -> arr a (b, b) -> Bool
eqCopy arr a () -> arr a () -> Bool
eqDiscard arr a b
f = (arr a (b, b) -> arr a (b, b) -> Bool) -> arr a b -> Bool
forall (arr :: * -> * -> *) a b.
(Tensor (,) arr, Copy arr a, Copy arr b) =>
(arr a (b, b) -> arr a (b, b) -> Bool) -> arr a b -> Bool
copyNatural arr a (b, b) -> arr a (b, b) -> Bool
eqCopy arr a b
f Bool -> Bool -> Bool
&& (arr a () -> arr a () -> Bool) -> arr a b -> Bool
forall (arr :: * -> * -> *) a b.
(Category arr, Discard arr a, Discard arr b) =>
(arr a () -> arr a () -> Bool) -> arr a b -> Bool
discardNatural arr a () -> arr a () -> Bool
eqDiscard arr a b
f
{-# INLINE deterministic #-}