【发布时间】:2011-07-07 23:31:35
【问题描述】:
我有一个数据类型
data N a = N a [N a]
玫瑰树和应用实例
instance Applicative N where
pure a = N a (repeat (pure a))
(N f xs) <*> (N a ys) = N (f a) (zipWith (<*>) xs ys)
并且需要证明它的应用定律。然而,pure 创建了无限深、无限分支的树。因此,例如,在证明同态定律时
pure f <*> pure a = pure (f a)
我认为证明相等
zipWith (<*>) (repeat (pure f)) (repeat (pure a)) = repeat (pure (f a))
通过近似(或采用)引理会起作用。然而,我的尝试在归纳步骤中导致了“恶性循环”。特别是减少
approx (n + 1) (zipWith (<*>) (repeat (pure f)) (repeat (pure a))
给予
(pure f <*> pure a) : approx n (repeat (pure (f a)))
其中 approx 是近似函数。 如何在没有明确的归纳证明的情况下证明相等性?
【问题讨论】:
-
为什么要在不使用共归纳法的情况下证明它?正如归纳是有限列表/树等数据的自然证明方法一样,联合归纳是余数据(如流或“无限深、无限分支的树”)的自然证明方法。
-
特别是,因为证明是在“程序语法”级别运行的。双相似性证明没有。
-
这看起来像是 cstheory stackexchange 网站的一个很好的候选者,特别是如果你用稍微更一般/正式的术语来说明它。
标签: list haskell infinite applicative