簡體   English   中英

我怎樣才能證明elem z(xs ++ ys)== elem z xs || 你好嗎?

[英]How can I prove that elem z (xs ++ ys) == elem z xs || elem z ys?

我有以下內容:

elem :: Eq a => a -> [a] -> Bool
elem _ [] = False
elem x (y:ys) = x == y || elem x ys

我怎樣才能證明所有x的y和z都是......

elem z (xs ++ ys) == elem z xs || elem z ys

我試圖讓左側等同於右側,但我的嘗試都沒有取得豐碩成果。

L.S elem z (x:xs ++ y:ys) = z==x || z==y || elem xs || elem ys

R.S elem z (x:xs) || elem z (y:ys) = z==x || z==y || elem xs || elem ys

有人可以幫我嗎?

這是一個提示。

++運算符是通過對第一個參數的歸納來定義的:

[]     ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)

你想要證明

elem z (xs ++ ys) == elem z xs || elem z ys

這是zxsys的屬性。 我們稱之為p(z,xs,ys) 而且, ++的第一個參數是xs ,所以這表明通過對xs的歸納來進行。

我們需要證明:

  1. 基本情況: p(z,[],ys)
  2. 歸納情形: p(z,x:xs,ys)假設歸納假設p(z,xs,ys)

您還需要在某些時候利用elem的定義。

平等推理很有趣! 如果你自己做一些證明,你會很快得到它的訣竅。 我熱烈推薦ch。 Graham Hutton 在Haskell編程中的 13個簡要介紹。

無論如何,你可以證明,對於所有的等價和有限 (見湯姆埃利斯的回答xsysz

elem z (xs ++ ys) == elem z xs || elem z ys

通過列表xs上的歸納。 為此,您需要使用++||的定義 elem ,並使用||的事實 是關聯的:

[]     ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)

False || b = b
True  || _ = True

elem _ [] = False
elem x (y:ys) = x == y || elem x ys

基本情況

ysEq a => [a]類型的值, z為類型Eq a => a ; 然后我們有

elem z ([] ++ ys)
=     {applying ++}
elem z ys
=     {unapplying ||}
False || elem z ys
=     {unapplying elem}
elem z [] || elem z ys

歸納案例

xsys是類型的值Eq a => [a]xz類型的值Eq a => a 假設(歸納假設)

elem z (xs ++ ys) == elem z xs || elem z ys

然后我們有

elem z ((x:xs) ++ ys)
=     {applying ++)
elem z (x : (xs ++ ys))
=     {applying elem}
z == x || elem (xs ++ ys)
=     {induction hypothesis}
z == x || (elem z xs || elem z ys)
=     {associativity of ||}
(z == x || elem z xs) || elem z ys
=     {unapplying elem}
elem z (x:xs) || elem z ys

(QED)

為了擴展已接受的答案,當xs為無窮大時,這個等式也是正確的。 如果elem z xs = True ,那么elem z (xs ++ ys) = True = elem z xs || elem z ys elem z (xs ++ ys) = True = elem z xs || elem z ys 否則, elem z (xs ++ ys) = ⊥ = elem z xs || elem z ys elem z (xs ++ ys) = ⊥ = elem z xs || elem z ys ,可以在ghci中輕松驗證。

Haskell中的列表不滿足歸納原理,因為Haskell是一種惰性語言,列表可能是無限的。 相反,我相信你應該用相同的形式寫兩個表達式來表明它們是等價的。 所需的形式是

f [] = z
f (x:xs) = g x (f xs)

使用這種方法來證明所需的結果

f xs = elem z (xs ++ ys)
f' xs = elem z xs || elem z ys

請注意,通過xs上的模式匹配並使用(++)elem的定義,這些相當於

f [] = elem z ys
f (x:xs) = x == z || elem z (xs ++ ys)

f' [] = elem z ys
f' (x:xs) = x == z || elem z xs || elem z ys

我們可以將遞歸調用重寫為

f [] = elem z ys
f (x:xs) = x == z || f xs

f' [] = elem z ys
f' (x:xs) = x == z || f' xs

如果我們定義gx rest = x == z || rest 然后gx rest = x == z || rest

f [] = elem z ys
f (x:xs) = g x (f xs)

f' [] = elem z ys
f' (x:xs) = g x (f' xs)

然后注意ff'的表達式是相等的。

我之前的回答不正確:

這不是真的。 考慮xs = repeat 0 ys = [1] z = 1然后elem z ys = elem 1 [1] = True所以elem z xs || elem z ys = True但是elem z(xs ++ ys)= elem 1(重復0 ++ [1])= False因為在`repeat 0`中搜索`1`永遠不會終止。 這是一個典型的例子,說明為什么懶惰語言的等式理論不如嚴格語言那么豐富。 正如其他答案所示,你可以通過結構歸納證明你的定理是* finite *`xs`。 但這有點乞求這個問題。 什么是*有限*列表?

暫無
暫無

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

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