Coq 中子列表的归纳命题

Inductive proposition for sublists in Coq

我正在努力想出一个列表的子列表的概念,它是通过删除列表中的元素创建的(以便保留顺序)。我需要想出一个归纳命题来决定 l1 是否是 l2 的子列表。

到目前为止:

  1. 我知道空列表是所有列表的子列表。
  2. 所有列表都是它们自己的子列表。
  3. 如果已知 l1 是 l2 的子列表,则将相同列表附加到 l1 和 l2 的头部或尾部的列表将导致前者是后者的子列表
  4. 现在是困难的部分。如何证明像 ["x";"y"] 这样的列表是 ["a";"x";"z";"y"] 的子列表?

语法类似于 Inductive Sublist {X : Type} : list X -> list X -> Prop := ..

有人可以帮我吗?

你已经非正式地做了什么?只使用你的三个规则。如果你不能管理它意味着你可能有一个太复杂/不完整的定义。

我认为你可以专注于你的例子,同时牢记列表是如何构建的,而不是试图去思考所有那些复杂的例子。 为什么 [ x ; y ][ a ; x ; y ; z ] 的子列表?因为(没有第二个列表的头部)[ x ; y ][ x ; y ; z ] 的子列表,那是因为 [ y ][ y ; z ] 的子列表,这是因为 [][ z ] 的子列表,它始终成立。

你看到规律了吗?