簡體   English   中英

如何使用QuickCheck測試函數是否終止?

[英]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.

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