子序列顺序的推理规则
Inference rules for subsequence order
我正在用子序列顺序做一些练习,
record _⊑₀_ {X : Set} (xs ys : List X) : Set where
field
indices : Fin (length xs) → Fin (length ys)
embed : ∀ {a b : Fin (length xs)} → a < b → indices a < indices b
eq : ∀ {i : Fin (length xs)} → xs ‼ i ≡ ys ‼ (indices i)
哪里
_‼_ : ∀ {X : Set} → (xs : List X) → Fin (length xs) → X
[] ‼ ()
(x ∷ xs) ‼ fzero = x
(x ∷ xs) ‼ fsuc i = xs ‼ i
是通常的安全查找。
虽然记录版本很好,但我想改用推理规则,因为这可能比每次构建嵌入并证明它们的属性更容易。
所以我尝试以下操作,
infix 3 _⊑₁_
data _⊑₁_ {X : Set} : (xs ys : List X) → Set where
nil : ∀ {ys} → [] ⊑₁ ys
embed : ∀ {x y} → x ≡ y → x ∷ [] ⊑₁ y ∷ []
cons : ∀ {xs₁ ys₁ xs₂ ys₂} → xs₁ ⊑₁ ys₁ → xs₂ ⊑₁ ys₂ → xs₁ ++ xs₂ ⊑₁ ys₁ ++ ys₂
这看起来很有希望。虽然我很难证明它是录音版本的声音和完整反映。
总之,后序顺序是可传递的,这就有点麻烦了:
⊑₁-trans : ∀ {X : Set} (xs ys zs : List X) → xs ⊑₁ ys → ys ⊑₁ zs → xs ⊑₁ zs
⊑₁-trans .[] ys zs nil q = nil
⊑₁-trans ._ ._ [] (embed x₁) q = {! q is absurd !}
⊑₁-trans ._ ._ (x ∷ zs) (embed x₂) q = {!!}
⊑₁-trans ._ ._ zs (cons p p₁) q = {!!}
在看似不可能的模式上进行模式匹配时,我们会遇到统一错误 q
。因此,我尝试了其他 data
版本的命令来避免这种统一错误,但其他证明具有看似荒谬的模式。
我需要一些有关 data
版本的子序列顺序的帮助(具有可靠性和完整性证明,这很好)。
将公式形式的命题转换为 inference/data 形式时,是否有任何通用的启发式方法可以尝试?
谢谢!
We get unification errors when pattern matching on a seemingly
impossible pattern q
.
这是常见的 "green slime" 问题。用 Conor McBride 的话来说:
The presence of ‘green slime’ — defined functions in the return types
of constructors — is a danger sign.
请参阅 here 了解一些打败绿色史莱姆的技巧。
对于 _⊑_
使用 order preserving embeddings:
infix 3 _⊑_
data _⊑_ {α} {A : Set α} : List A -> List A -> Set α where
stop : [] ⊑ []
skip : ∀ {xs ys y} -> xs ⊑ ys -> xs ⊑ y ∷ ys
keep : ∀ {xs ys x} -> xs ⊑ ys -> x ∷ xs ⊑ x ∷ ys
⊑-trans : ∀ {α} {A : Set α} {xs ys zs : List A} -> xs ⊑ ys -> ys ⊑ zs -> xs ⊑ zs
⊑-trans p stop = p
⊑-trans p (skip q) = skip (⊑-trans p q)
⊑-trans (skip p) (keep q) = skip (⊑-trans p q)
⊑-trans (keep p) (keep q) = keep (⊑-trans p q)
我正在用子序列顺序做一些练习,
record _⊑₀_ {X : Set} (xs ys : List X) : Set where
field
indices : Fin (length xs) → Fin (length ys)
embed : ∀ {a b : Fin (length xs)} → a < b → indices a < indices b
eq : ∀ {i : Fin (length xs)} → xs ‼ i ≡ ys ‼ (indices i)
哪里
_‼_ : ∀ {X : Set} → (xs : List X) → Fin (length xs) → X
[] ‼ ()
(x ∷ xs) ‼ fzero = x
(x ∷ xs) ‼ fsuc i = xs ‼ i
是通常的安全查找。
虽然记录版本很好,但我想改用推理规则,因为这可能比每次构建嵌入并证明它们的属性更容易。
所以我尝试以下操作,
infix 3 _⊑₁_
data _⊑₁_ {X : Set} : (xs ys : List X) → Set where
nil : ∀ {ys} → [] ⊑₁ ys
embed : ∀ {x y} → x ≡ y → x ∷ [] ⊑₁ y ∷ []
cons : ∀ {xs₁ ys₁ xs₂ ys₂} → xs₁ ⊑₁ ys₁ → xs₂ ⊑₁ ys₂ → xs₁ ++ xs₂ ⊑₁ ys₁ ++ ys₂
这看起来很有希望。虽然我很难证明它是录音版本的声音和完整反映。
总之,后序顺序是可传递的,这就有点麻烦了:
⊑₁-trans : ∀ {X : Set} (xs ys zs : List X) → xs ⊑₁ ys → ys ⊑₁ zs → xs ⊑₁ zs
⊑₁-trans .[] ys zs nil q = nil
⊑₁-trans ._ ._ [] (embed x₁) q = {! q is absurd !}
⊑₁-trans ._ ._ (x ∷ zs) (embed x₂) q = {!!}
⊑₁-trans ._ ._ zs (cons p p₁) q = {!!}
在看似不可能的模式上进行模式匹配时,我们会遇到统一错误 q
。因此,我尝试了其他 data
版本的命令来避免这种统一错误,但其他证明具有看似荒谬的模式。
我需要一些有关 data
版本的子序列顺序的帮助(具有可靠性和完整性证明,这很好)。
将公式形式的命题转换为 inference/data 形式时,是否有任何通用的启发式方法可以尝试?
谢谢!
We get unification errors when pattern matching on a seemingly impossible pattern
q
.
这是常见的 "green slime" 问题。用 Conor McBride 的话来说:
The presence of ‘green slime’ — defined functions in the return types of constructors — is a danger sign.
请参阅 here 了解一些打败绿色史莱姆的技巧。
对于 _⊑_
使用 order preserving embeddings:
infix 3 _⊑_
data _⊑_ {α} {A : Set α} : List A -> List A -> Set α where
stop : [] ⊑ []
skip : ∀ {xs ys y} -> xs ⊑ ys -> xs ⊑ y ∷ ys
keep : ∀ {xs ys x} -> xs ⊑ ys -> x ∷ xs ⊑ x ∷ ys
⊑-trans : ∀ {α} {A : Set α} {xs ys zs : List A} -> xs ⊑ ys -> ys ⊑ zs -> xs ⊑ zs
⊑-trans p stop = p
⊑-trans p (skip q) = skip (⊑-trans p q)
⊑-trans (skip p) (keep q) = skip (⊑-trans p q)
⊑-trans (keep p) (keep q) = keep (⊑-trans p q)