[英]How to use obvious facts in Agda proofs with “with”?
我在用Agda編寫證明時遇到了麻煩。 所以我簡化了很多。
ffff : bool -> bool
ffff x with x , x
ffff x | t , t = t
ffff x | f , f = t
ffff x | t , ()
ffff x | f , ()
與編譯錯誤:
bool × bool should be empty, but the following constructor patterns
are valid:
_,_ _ _
我知道這是一種愚蠢的情況。 但這切入了我在agda中經常要做的工作的核心。 我該如何重組此證明,以使最后兩個案例變得荒謬?
您的代碼無法正常工作的原因是,當您使用荒謬的模式()時,應該認為沒有正確類型的模式的有效實例。 在這種情況下,情況並非如此:類型是荒謬的模式,只是bool
並且存在明顯的有效實例化f
和t
。 問題是您知道除了模式的類型之外 , 由於其他原因,沒有有效的模式案例,而Agda僅查看模式的類型。
因此,您應該嘗試做的是更改代碼,以使它遵循某種模式的類型,即沒有有效的情況。 在這種情況下經常有用的一種模式是“類固醇檢查”模式。 本質上,您要記住,在with塊中進行模式匹配的是(x , x)
值。 您可以按照以下方式使用“檢查類固醇”模式來執行此操作,盡管這可能並不是您實際的非簡化代碼中所需要的:
open import Data.Bool
open import Relation.Binary.PropositionalEquality
open import Data.Product
ffff : Bool -> Bool
ffff x with (x , x) | inspect (λ x → (x , x)) x
ffff x | true , true | _ = true
ffff x | false , false | _ = true
ffff x | true , false | [ () ]
ffff x | false , true | [ () ]
無論如何,我建議您在Google上對“類固醇檢查”模式(或較舊的“檢查”模式)進行很好的解釋,研究它,或者研究上面的示例,然后嘗試將其應用於您的實際代碼...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.