Reasoning and Derivation of Monadic Programs Shin-Cheng Mu Tom - - PowerPoint PPT Presentation

reasoning and derivation of monadic programs
SMART_READER_LITE
LIVE PREVIEW

Reasoning and Derivation of Monadic Programs Shin-Cheng Mu Tom - - PowerPoint PPT Presentation

Reasoning and Derivation of Monadic Programs Shin-Cheng Mu Tom Schrijvers Koen Pauwels Content Equational reasoning Reasoning with monads Goal of the paper Our contribution (a + b) * (a - b) [distr: forall x y z. x * (y + z) =


slide-1
SLIDE 1

Reasoning and Derivation of Monadic Programs

Shin-Cheng Mu Tom Schrijvers Koen Pauwels

slide-2
SLIDE 2

Content

  • Equational reasoning
  • Reasoning with monads
  • Goal of the paper
  • Our contribution
slide-3
SLIDE 3

(a + b) * (a - b) [distr: forall x y z. x * (y + z) = x*y + x*z] (a + b)*a - (a + b)*b [distr: forall x y z. x * (y + z) = x*y + x*z] a^2 + b*a - a*b - b^2 [comm: forall x y. x*y = y*x] a^2 + a*b - a*b - b^2 [addinv: forall x. x - x = 0] a^2 - b^2

slide-4
SLIDE 4

def increment(n): print(“surprise!”) return n+1

four = increment(3) print(four + four)

slide-5
SLIDE 5

def increment(n): print(“surprise!”) return n+1

print(increment(3) + increment(3))

slide-6
SLIDE 6

increment :: Int -> IO Int increment n = do putStrLn "surprise!" return (n+1) main = let four = increment 3 in print $ four + four -- error!

slide-7
SLIDE 7

increment :: Int -> IO Int increment n = do putStrLn "surprise!" return (n+1) main = do four <- increment 3 print $ four + four

slide-8
SLIDE 8

increment :: Int -> IO Int increment n = do putStrLn "surprise!" return (n+1) main = let four = increment 3 in ((+) <$> four <*> four) >>= print = ((+) <$> increment 3 <*> increment 3) >>= print

slide-9
SLIDE 9

class Monad m => MonadState s m | m → s where get :: m s put :: s → m () put s >> put s’ = put s’ put s >> get = put s >> return s get >>= put = skip get >>= \s -> get >>= \s’ -> k s s’ = get >>= \s -> k s s

slide-10
SLIDE 10

queens :: MonadNondet m => Int -> m [Int] queens n = perm [0 .. n-1] >>= assert safe

slide-11
SLIDE 11

class Monad m => MonadNondet m where fail :: m a (||) :: m a -> m a -> m a

associativity: (m || n) || k = m || (n || k) zero element for (||): fail || m = m = m || fail distributivity from left: (m || n) >>= f = (m >>= f) || (n >>= f) left zero for (>>=): fail >>= f = fail

slide-12
SLIDE 12

queens :: MonadNondet m => Int -> m [Int] queens n = perm [0 .. n-1] >>= assert safe

[0,1,…]

(n-2)!

slide-13
SLIDE 13

class (MonadNondet m, MonadState s m) => MonadNDState s m

right-distributivity: m >>= (\x -> f1 x || f2 x) = (m >>= f1) || (m >>= f2) right-zero: m >> fail = fail

slide-14
SLIDE 14

queens :: (MonadNondet m, MonadState (Int,[Int],[Int])) => Int -> m [Int] queens n = protect (put (0,[],[]) >> queensBody [0 .. n-1] queensBody :: (MonadNondet m, MonadState (Int,[Int],[Int])) => [Int] -> m [Int] queensBody [] = return [] queensBody xs = do (x,ys) <- select xs st <- get guard (check st x)) put (f st x) fmap (x:) (queensBody ys) where ...

slide-15
SLIDE 15

class (MonadNondet m, MonadState s m) => MonadNDState s m

right-distributivity: m >>= (\x -> f1 x || f2 x) = (m >>= f1) || (m >>= f2) right-zero: m >> fail = fail

slide-16
SLIDE 16

modify next >> search >>= modReturn prev where

modify f = get >>= (put · f) modReturn f v = modify f >> return v

rollback unreachable: modify next >> fail >>= modReturn prev rollback executed multiple times: modify next >> (m1 || m2 || m3) >>= modReturn prev

slide-17
SLIDE 17

side (modify next) || m1 || m2 || m3 || side (modify prev) where side m = m >> fail

slide-18
SLIDE 18

putR :: (MonadNondet m, MonadState s m) => s -> m () putR s = get >>= \s0 -> put s || side (put s0)

slide-19
SLIDE 19

putR s >> comp [def putR] (get >>= \s0 -> put s || side (put s0)) >> comp [assoc monad law, left distributivity] get >>= \s0 -> (put s >> comp) || (side (put s0) >> comp) [left zero] get >>= \s0 -> (put s >> comp) || side (put s0)

slide-20
SLIDE 20

get-put: get >>= putR = return ()

(get >>= putR) >> put t = get >>= \s -> put t || side (put s) return () >> put t = put t

slide-21
SLIDE 21

Replace all occurrences of put by putR

slide-22
SLIDE 22

m =GS n <==> forall C. run(C[m]) = run(C[n])

slide-23
SLIDE 23

m =LS n <==> forall C. run(trans(C[m])) = run(trans(C[n]))

slide-24
SLIDE 24

get-get: get (\s1 -> get(\s2 -> k s1 s2)) =LS get (\s -> k s s) put-get: putR x (get k) =LS putR x (k x) get-put: get (\s -> putR s k) =LS k put-put: putR x (putR y m) =LS putR y m

slide-25
SLIDE 25

right-distributivity: putR x m1 || putR x m2 =LS putR x (m1 || m2) right-zero: putR x fail =LS fail