子序列的推理规则

时间:2016-02-23 07:16:51

标签: list sequence agda

我正在用子序列进行一些练习,

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版本的子序列顺序的帮助(有完整性和完整性证明,这很好)。

在将公式中的命题转换为推理/数据形式时,是否有任何一般的启发式方法?

感谢 - 你!

1 个答案:

答案 0 :(得分:3)

  

当看似模式匹配时,我们会出现统一错误   不可能的模式q

这是通常的“绿色粘液”问题。用Conor McBride的话说:

  

“绿色粘液”的存在 - 返回类型中定义的函数   建设者 - 是一个危险的信号。

有关击败绿泥的一些技巧,请参阅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)