[英]How do I use QuickCheck to test if a function terminates?
我想使用QuickCheck來測試一個函數,以確保它終止(沒有無限遞歸,沒有拋出異常等)。 這就是我現在所做的:
f :: Int -> Int -> Int
prop_fTerminates :: Int -> Int -> Bool -- say
prop_fTerminates x y = f x y `seq` True
是否有更好的(更具表現力和慣用語)的方式?
這是暫停的問題 。 沒有能夠告訴您函數是否終止的算法。
特別是,如果你願意等待足夠長的時間,你可能會得到一個積極的結果(即如果函數確實終止,這個命題會告訴你)。 但只是等待,你永遠不會知道這個函數沒有終止的區別, 這個功能還沒有終止 。
您可以執行檢查,例如此功能在時間T中終止,這可能適合您的需要。
編輯如上所述,您的功能無法滿足您的要求。 考慮
> let f = 1:f
> f `seq` True
True
原因是seq
僅評估弱頭正常形式 。 相反,您可以使用deepseq
評估數據結構的deepseq
,
> import Control.DeepSeq (deepseq)
> f `deepseq` True
* never returns *
我可能不會打擾,我只是測試其輸出的其他屬性。
以任何方式檢查fxy
輸出的任何屬性都將至少與您的prop_fTerminates
一樣進行終止檢查,那么為什么要浪費時間加倍檢查呢?
如果由於某種原因“fxy終止”是你可以測試f
的唯一屬性,那么你所得到的似乎是合理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.