Pattern matching 'with'子句中的上下文计算不足
我被以下证据难住了Pattern matching 'with'子句中的上下文计算不足,pattern-matching,proof,agda,Pattern Matching,Proof,Agda,我被以下证据难住了 module Temp where open import Data.Empty open import Data.Fin hiding (compare) open import Data.Nat hiding (compare); open import Data.Nat.Properties open import Function open import Level open import Relation.Binary o
module Temp where
open import Data.Empty
open import Data.Fin hiding (compare)
open import Data.Nat hiding (compare); open import Data.Nat.Properties
open import Function
open import Level
open import Relation.Binary
open import Relation.Binary.PropositionalEquality
我正在使用自然数Γ作为上下文,一个la de Bruijn索引,并使用FinΓ
元素作为标识符。(就我的问题而言,人们不需要将其理解为上下文和标识符,但这可能有助于直觉。)
重命名是上下文变形:
Ren : Rel ℕ Level.zero
Ren Γ Γ′ = Fin Γ → Fin Γ′
我现在定义以下两个非常简单的操作。第一个是close var
,它产生一个重命名,从上下文中删除一个名称,并将其映射到剩余上下文中的现有名称。第二个,openvar
,产生一个重命名,其作用与此相反,在特定位置的上下文中插入一个新名称。要在上下文中定位插入点或删除点,我将ℕ代码>,因为我还没有摸索如何使用Data.Fin.compare
open StrictTotalOrder strictTotalOrder
open DecTotalOrder decTotalOrder renaming (refl to ≤-refl; trans to ≤-trans)
open import Data.Fin.Props using (bounded)
close-var : ∀ {Γ} → Fin Γ → Fin (suc Γ) → Fin (suc Γ) → Fin Γ
close-var _ y z with compare (toℕ y) (toℕ z)
close-var _ _ zero | tri< () _ _
close-var _ _ (suc z) | tri< _ _ _ = z
close-var x _ _ | tri≈ _ _ _ = x
close-var _ zero _ | tri> _ _ ()
close-var _ (suc y) z | tri> _ _ z<suc-y =
fromℕ≤ (≤-trans z<suc-y (bounded y))
open-var : ∀ {Γ} → Fin (suc Γ) → Fin Γ → Fin (suc Γ)
open-var y z with compare (toℕ y) (toℕ z)
... | tri< _ _ _ = suc z
... | tri≈ _ _ _ = suc z
... | tri> _ _ _ = inject₁ z
第一种情况应该是不可能的,但我似乎无法使用y≡z
和y≮suc-z
推导出一个矛盾,就像我在前面的例子中所做的那样。我认为这是因为模式本身是荒谬的,但我不知道如何说服Agda
第二个问题,也许是相关的,是在剩下的四个目标下,似乎没有足够的降价。它们都包含和模式,例如tri<.a.-b.-c
。但是我希望嵌套的和子句能够允许足够的执行来消除这些错误。我做错了什么
(作为健康检查,很容易验证:
sub : ∀ {Γ} (x : Fin Γ) (y : Fin (suc Γ)) → Ren Γ Γ
sub x y = close-var x y ∘ open-var y
Γ : ℕ
Γ = 5
ρ : Ren Γ Γ
ρ = sub (suc (zero)) (suc (suc (suc zero)))
ex₁ : ρ zero ≡ zero
ex₁ = refl
ex₂ : ρ (suc zero) ≡ suc zero
ex₂ = refl
ex₃ : ρ (suc (suc (zero))) ≡ suc (suc zero)
ex₃ = refl
ex₄ : ρ (suc (suc (suc (zero)))) ≡ suc (suc (suc zero))
ex₄ = refl
等等。)嵌套的和子句是可以的。问题在于,在close var
的定义中,不仅匹配compare(to)的结果ℕ y) (至)ℕ z)
,但也在参数y
和z
本身上。当然,Agda不能在不确定使用哪个函数方程的情况下减少某些东西
在第二个孔中,close var
应在inject上匹配模式₁ z
,但你没有(也不能)。您还必须对其进行抽象,然后进行足够的模式匹配,以使Agda相信它可以安全地选择一个等式
close∘open≡id x y z | tri> _ _ _
with inject₁ z | compare (toℕ y) (toℕ (inject₁ z))
... | tri> _ _ _ | Fin.zero | tri< () _ _
... | tri> _ _ _ | Fin.suc r | tri< _ _ _ = {!!} -- goal is r ≡ z
然后,您可以通过以下方式导出矛盾:
y≮suc-z (s≤s (≡→≤ y≡z))
(我没有查看StrictTotalOrder
记录,但这个引理可能已经存在了)。好的,这是有道理的,它做到了。再次感谢:)
≡→≤ : {x y : ℕ} → x ≡ y → x ≤ y
≡→≤ refl = ≤-refl
y≮suc-z (s≤s (≡→≤ y≡z))