Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pattern matching 'with'子句中的上下文计算不足_Pattern Matching_Proof_Agda - Fatal编程技术网

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))