如果我們有一個給定的謂詞p :: [Bool] -> Bool,它以一個無限串列作為引數并回傳True或False基于一些未知條件,我們不知道這個謂詞是什么。
假設該謂詞是可滿足的,我們能否計算出一個函式f :: ([Bool] -> Bool) -> [Bool],該函式采用這樣的謂詞并回傳一個無限串列 l where p l == True。
uj5u.com熱心網友回復:
您可以將無限串列[Bool]視為一個二進制數,最低有效位在前:
0 = repeat False
1 = True : repeat False
2 = False : True : repeat False
3 = True : True : repeat False
等等到無窮大。
所以如果你構造一個這樣的函式:
intToBools :: Integer -> [Bool]
然后你可以寫
f p = head $ filter p $ map intToBools [0..]
這對每個謂詞都有效p嗎?好吧,如果我們將自己限制為全函式,那么p必須檢查其引數的有限前綴,如果任何有限前綴是可接受的,那么最終必須到達該前綴。
如果p不是total但可以回傳True至少一個引數(例如謂詞“argument contains at least one True”),那么這個問題不能按書面形式解決,因為我們不知道是否p x會終止。但是,如果p可以表示為狀態機:
newtype BoolPredicate = BoolPredicate (Bool -> Either Bool BoolPredicate)
然后您可以通過在廣度優先搜索中遞回應用True和False到上一步的輸出來列舉每個可能的輸入,直到找到Left True.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387033.html
下一篇:monad定義中的樣板代碼
