将布尔语句提升为命题
Lifting a boolean statement to a proposition
给定一个列表、一个 "property"(Bool
s 的函数)和一个证明 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 ≡ true
的 true
分支中。
里面应该放什么?我哪里理解错了?
关键是使用 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 [] ()
。
给定一个列表、一个 "property"(Bool
s 的函数)和一个证明 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 ≡ true
的 true
分支中。
里面应该放什么?我哪里理解错了?
关键是使用 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 [] ()
。