[英]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
這是z
, xs
和ys
的屬性。 我們稱之為p(z,xs,ys)
。 而且, ++
的第一個參數是xs
,所以這表明通過對xs
的歸納來進行。
我們需要證明:
p(z,[],ys)
。 p(z,x:xs,ys)
假設歸納假設p(z,xs,ys)
您還需要在某些時候利用elem
的定義。
平等推理很有趣! 如果你自己做一些證明,你會很快得到它的訣竅。 我熱烈推薦ch。 Graham Hutton 在Haskell編程中的 13個簡要介紹。
無論如何,你可以證明,對於所有的等價和有限 (見湯姆埃利斯的回答 ) xs
, ys
和z
,
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
令ys
為Eq 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
讓xs
, ys
是類型的值Eq a => [a]
和x
, z
類型的值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)
然后注意f
和f'
的表達式是相等的。
我之前的回答不正確:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.