簡體   English   中英

如何在帶有“ with”的Agda證明中使用明顯的事實?

[英]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並且存在明顯的有效實例化ft 問題是您知道除了模式的類型之外由於其他原因,沒有有效的模式案例,而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.

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