簡體   English   中英

證明流的平等

[英]Proving equality of streams

我有一個數據類型

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 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是近似函數。 如果沒有明確的共同證據,我怎樣才能證明這種平等?

我會使用展開的通用屬性(因為重復和適當的不合格的拉鏈都展開)。 在我的博客上有一個相關的討論。 但您可能也喜歡Ralf Hinze關於ICFP2008 (以及隨后的JFP論文)的獨特定點的論文。

(只是檢查一下:你所有的玫瑰樹都是無限寬而且無限深?我猜這些法律不會另有規定。)

以下是我認為有用並且保持在程序語法和等式推理層面的一些草圖。

基本的直覺是, repeat x推理要比推理流(更糟糕的是,列表)更容易。

uncons (repeat x) = (x, repeat x)

zipWithAp xss yss = 
    let (x,xs) = uncons xss
        (y,ys) = uncons yss
    in (x <*> y) : zipWithAp xs ys

-- provide arguments to zipWithAp
zipWithAp (repeat x) (repeat y) = 
    let (x',xs) = uncons (repeat x)
        (y',ys) = uncons (repeat y)
    in (x' <*> y') : zipWithAp xs ys

-- substitute definition of uncons...
zipWithAp (repeat x) (repeat y) = 
    let (x,repeat x) = uncons (repeat x)
        (y,repeat y) = uncons (repeat y)
    in (x <*> y) : zipWithAp (repeat x) (repeat y)

-- remove now extraneous let clause
zipWithAp (repeat x) (repeat y) = (x <*> y) : zipWithAp (repeat x) (repeat y)

-- unfold identity by one step
zipWithAp (repeat x) (repeat y) = (x <*> y) : (x <*> y) : zipWithAp (repeat x) (repeat y)

-- (co-)inductive step
zipWithAp (repeat x) (repeat y) = repeat (x <*> y)

你為什么需要共同誘導? 只是歸納。

pure f <*> pure a = pure (f a)

也可以寫(你需要證明左右相等)

N f [(pure f)] <*> N a [(pure a)] = N (f a) [(pure (f a))]

這允許你一次關閉一個學期。 這會給你感應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM