我正在用子序列进行一些练习,
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
版本的子序列顺序的帮助(有完整性和完整性证明,这很好)。
在将公式中的命题转换为推理/数据形式时,是否有任何一般的启发式方法?
感谢 - 你!
答案 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)