Tôi cố gắng để chứng minh một cái gì đó đơn giản:minh 'T b` khi `b` đã được kết hợp trên
open import Data.List
open import Data.Nat
open import Data.Bool
open import Data.Bool.Properties
open import Relation.Binary.PropositionalEquality
open import Data.Unit
repeat : ∀ {a} {A : Set a} → ℕ → A → List A
repeat zero x = []
repeat (suc n) x = x ∷ repeat n x
filter-repeat : ∀ {a} {A : Set a} → (p : A → Bool) → (x : A) → T (p x) → ∀ n →
filter p (repeat n x) ≡ repeat n x
Tôi nghĩ minh filter-repeat
sẽ là dễ dàng bằng cách mô hình kết hợp trên p x
:
filter-repeat p x prf zero = refl
filter-repeat p x prf (suc n) with p x
filter-repeat p x() (suc n) | false
filter-repeat p x prf (suc n) | true = cong (_∷_ x) (filter-repeat p x prf n)
Tuy nhiên, điều này phàn nàn rằng prf : ⊤
không thuộc loại T (p x)
. Vì vậy, tôi nghĩ, OK, điều này có vẻ như một vấn đề quen thuộc, chúng ta hãy whip ra inspect
:
filter-repeat p x prf zero = refl
filter-repeat p x prf (suc n) with p x | inspect p x
filter-repeat p x() (suc n) | false | _
filter-repeat p x tt (suc n) | true | [ eq ] rewrite eq = cong (_∷_ x) (filter-repeat p x {!!} n)
nhưng bất chấp sự rewrite
, loại lỗ vẫn là T (p x)
thay vì T true
. Tại sao vậy? Tôi làm cách nào để giảm loại của mình thành T true
để tôi có thể điền vào số tt
?
Cách giải quyết
tôi đã có thể làm việc xung quanh nó bằng cách sử dụng T-≡
:
open import Function.Equality using (_⟨$⟩_)
open import Function.Equivalence
filter-repeat : ∀ {a} {A : Set a} → (p : A → Bool) → (x : A) → T (p x) → ∀ n →
filter p (repeat n x) ≡ repeat n x
filter-repeat p x prf zero = refl
filter-repeat p x prf (suc n) with p x | inspect p x
filter-repeat p x() (suc n) | false | _
filter-repeat p x tt (suc n) | true | [ eq ] = cong (_∷_ x) (filter-repeat p x (Equivalence.from T-≡ ⟨$⟩ eq) n)
nhưng tôi vẫn muốn hiểu tại sao các giải pháp dựa trên inspect
không hoạt động.