将布尔语句提升为命题

Lifting a boolean statement to a proposition

给定一个列表、一个 "property"(Bools 的函数)和一个证明 any f xs ≡ true,我想得到一个 Any (λ x → T (f x)) ns 的值,即我想要一个将证明从 any 转换为 Any 的证明。

到目前为止,我已经能够勾勒出证明,但我被一个看似简单的陈述所困(请参阅下面的倒数第二行):

open import Data.Bool
open import Data.Bool.Properties
open import Data.List
open import Data.List.Relation.Unary.Any using (Any; here; there)
open import Data.Unit
open import Relation.Binary.PropositionalEquality 

≡→T : ∀ {b : Bool} → b ≡ true → T b
≡→T refl = tt

any-val : ∀ {a} {A : Set a} (f) (ns : List A)
        → any f ns ≡ true
        → Any (λ x → T (f x)) ns
any-val f [] ()
any-val f (n ∷ ns) any-f-⟨n∷ns⟩≡true with f n
...                            | true  = here (≡→T ?)
...                            | false = there (any-val f ns any-f-⟨n∷ns⟩≡true)

显然,我需要证明 f n ≡ true,这应该很容易证明,因为我们在 with 语句 f ≡ truetrue 分支中。

里面应该放什么?我哪里理解错了?

关键是使用 inspect 习语,我已经在另一个答案中对此进行了详细描述:

这给出了以下代码,我清理了它,包括导入:

open import Data.Bool
open import Data.List
open import Data.List.Relation.Unary.Any using (Any; here; there)
open import Data.Unit
open import Relation.Binary.PropositionalEquality 
open import Function

≡→T : ∀ {b : Bool} → b ≡ true → T b
≡→T refl = tt

any-val : ∀ {a} {A : Set a}
  f (ns : List A) → any f ns ≡ true → Any (T ∘ f) ns
any-val f (x ∷ l) p with f x | inspect f x
... | false | _ = there (any-val f l p)
... | true | [ fx≡true ] = here (≡→T fx≡true)

附带说明一下,请确保您已将 Agda 更新到最新版本,这样您就不必像代码中那样处理空案例 any-val f [] ()