abgestimmt ist Ich versuche, etwas einfach zu beweisen:Proving `T b 'wenn' b 'bereits auf
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
dachte ich beweisen filter-repeat
durch Muster auf p x
passend zu leicht sein wird:
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)
Allerdings beschwert sich prf : ⊤
nicht vom Typ T (p x)
. Also dachte ich, OK, das wie ein bekanntes Problem scheint, lassen Sie uns inspect
zücken:
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)
aber trotz der rewrite
, die Art des Lochs ist noch T (p x)
statt T true
. Warum das? Wie reduziere ich den Typ auf T true
, damit ich es mit tt
füllen kann?
Umgehung
konnte ich durch T-≡
mit um ihn arbeiten:
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)
aber ich würde immer noch zu verstehen, warum die inspect
-basierte Lösung funktioniert nicht.