与结合的方程式推理 [英] Equational reasoning with tying the knot

查看:140
本文介绍了与结合的方程式推理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  s0 =(flip runContT )return $ do 
(k,n)< - callCC $ \k - >令f x = k(f,x)
作为回报(f,0)
lift $打印n
如果n < 3
,则k(n + 1)>> return()
else return()

我设法达到了这一点:

  s21 = runContT(让fx = ContT $ \ _  - > cc(f,x) ,0)))cc其中
cc =(\(k,n) - > let
iff = if n <3 then k(n + 1)else ContT($())
in print n>> runContT iff(\_-> return()))

在这一点上,我不知道如何处理 f
的递归定义。完成这个缩减的最佳方法是什么?

解决方案

您可以按照以下步骤操作。

 <$ c $ ($(f,0)))cc其中,
cc =(\(k,n) - > let
iff = if n <3 then k(n + 1)else ContT($())
in print n>> runContT iff(\_ - > return ())

- runContT与ContT

s22 =(let ($(f,0)))cc
其中
cc =(\(k,n) - >让
iff = if n < 3然后k(n + 1)else ContT($())
in print n>> runContT iff(\_-> return())

- 重排序

s23 =($(f,0))cc
其中
fx = ContT $ \_ - > cc(f,x)
cc =(\(k,n) - > let
iff = if n <3 then k(n + 1)else ContT($())
in print n>> runContT iff(\_-> return())

s24 = cc(f,0)
其中...

- beta

s25 = let iff = if 0 <3 then f(0 + 1)else ContT($())
in print 0>> ; runContT iff(\_-> return())
其中...

- if,算术

s26 = let iff = f 1
in print 0>> runContT iff(\_ - > return())
where ...

s27 =打印0>> runContT( f1)(\_-> return())
其中...

s28 =打印0>>>> runContT(ContT $ \_ - > cc f(1))(\_-> return())
其中...

s29 = print 0>>(\_-> cc(f ,1))(\_-> return())
其中...

s30 =打印0> gt cc(f,1)
其中...

- 重复所有步骤s24..s30

s31 = p rint 0>>打印1>> cc(f,2)
其中...

- 等等

s32 =打印0 >>打印1>>打印2>> cc(f,3)
其中...

s33 =打印0>>打印1>>打印2>>
let iff = if 3< 3然后在打印3中f(3 + 1)else ContT($())
>> runContT iff(\_ - > return())
其中...

s34 =打印0>>打印1>>打印2>>打印3>>
让runFontT中的iff = ContT($())
iff(\_-> return()))
其中...

s35 =打印0>>打印1>>打印2>>打印3>>
runContT(ContT($()))(\_-> return())
其中...

s36 =打印0>>打印1>>打印2>>打印3>>
($())(\_ - > return())
其中...

s37 =打印0>>打印1>>打印2>>打印3>>
return()


I'm trying to wrap my head around Cont and callCC, by reducing this function:

s0 = (flip runContT) return $  do
    (k, n) <- callCC $ \k -> let f x = k (f, x)
                             in  return (f, 0)
    lift $ print n
    if n < 3
        then k (n+1) >> return ()
        else return ()

I've managed to reach this point:

s21 = runContT (let f x = ContT $ \_ -> cc (f, x) in ContT ($(f,0))) cc where
    cc = (\(k,n) -> let
        iff = if n < 3 then k (n+1) else ContT ($())
        in print n >> runContT iff (\_ -> return ()))

And at this point i have no idea what to do with recursive definition of f What is the best way to finish this reduction?

解决方案

You can proceed as follows.

s21 = runContT (let f x = ContT $ \_ -> cc (f, x) in ContT ($(f,0))) cc where
    cc = (\(k,n) -> let
        iff = if n < 3 then k (n+1) else ContT ($())
        in print n >> runContT iff (\_ -> return ())

-- runContT is the opposite of ContT

s22 =  (let f x = ContT $ \_ -> cc (f, x) in ($(f,0))) cc
    where
    cc = (\(k,n) -> let
        iff = if n < 3 then k (n+1) else ContT ($())
        in print n >> runContT iff (\_ -> return ())

-- reordering

s23 = ($(f,0)) cc
    where
    f x = ContT $ \_ -> cc (f, x)
    cc = (\(k,n) -> let
        iff = if n < 3 then k (n+1) else ContT ($())
        in print n >> runContT iff (\_ -> return ())

s24 = cc (f,0)
    where ...

-- beta

s25 = let iff = if 0 < 3 then f (0+1) else ContT ($())
       in print 0 >> runContT iff (\_ -> return ())
    where ...

-- if, arithmetics

s26 = let iff = f 1
       in print 0 >> runContT iff (\_ -> return ())
    where ...

s27 = print 0 >> runContT (f 1) (\_ -> return ())
    where ...

s28 = print 0 >> runContT (ContT $ \_ -> cc (f, 1)) (\_ -> return ())
    where ...

s29 = print 0 >> (\_ -> cc (f, 1)) (\_ -> return ())
    where ...

s30 = print 0 >> cc (f, 1)
    where ...

-- repeat all the steps s24..s30

s31 = print 0 >> print 1 >> cc (f, 2)
    where ...

-- etc.

s32 = print 0 >> print 1 >> print 2 >> cc (f, 3)
    where ...

s33 = print 0 >> print 1 >> print 2 >>
      let iff = if 3 < 3 then f (3+1) else ContT ($())
       in print 3 >> runContT iff (\_ -> return ())
    where ...

s34 = print 0 >> print 1 >> print 2 >> print 3 >> 
      let iff = ContT ($())
       in runContT iff (\_ -> return ()))
    where ...

s35 = print 0 >> print 1 >> print 2 >> print 3 >> 
      runContT (ContT ($())) (\_ -> return ())
    where ...

s36 = print 0 >> print 1 >> print 2 >> print 3 >> 
      ($()) (\_ -> return ())
    where ...

s37 = print 0 >> print 1 >> print 2 >> print 3 >> 
      return ()

这篇关于与结合的方程式推理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆