从带有uniq的finType的seq派生ssreflect finType

时间:2019-02-17 23:18:46

标签: coq ssreflect

我有一个结构,该结构由有限类型上的序列和该序列的唯一性证明组成。这应该描述显然是有限的类型,但是我看不出如何显示出来。

我以为我可以使用UniqFinMixin,但是,如果我理解正确的话,它需要提供该类型所有元素的显式序列,而我不知道该如何计算。我尝试在有限类型上使用Finite.enum,但它只会生成包含有限类型所有元素的seq,而我没有找到一种优雅的方式来计算所有子序列/排列。

import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter

class myClass : BaseAdapter() {
  override fun getView(
    position: Int,
    convertView: View?,
    parent: ViewGroup?
  ): View {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  }

  override fun getItem(position: Int): Any {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  }

  override fun getItemId(position: Int): Long {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  }

  override fun getCount(): Int {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  }

}

在我看来,这里没有一种简单的方法来衍生finType很奇怪,但是我在finset.v文件中找不到它。预先感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您可以证明dbranch嵌入到另一个finType中,例如ft的元素列表类型,其元素大小受#|ft|限制。

Lemma size_dbranch d : size (branch d) < #|ft|.+1.
Proof.
rewrite ltnS [card]unlock uniq_leq_size ?buniq // => ?.
by rewrite mem_enum.
Qed.

Definition tag_of_dbranch d : {k : 'I_#|ft|.+1 & k.-tuple ft} :=
  @Tagged _ (Sub (size (branch d)) (size_dbranch d))
            (fun k : 'I_#|ft|.+1 => k.-tuple ft)
            (in_tuple (branch d)).

Definition dbranch_of_tag (t : {k : 'I_#|ft|.+1 & k.-tuple ft}) : option dbranch :=
  insub (val (tagged t)).

Lemma tag_of_dbranchK : pcancel tag_of_dbranch dbranch_of_tag.
Proof. by rewrite /tag_of_dbranch /dbranch_of_tag=> x; rewrite valK. Qed.

Definition dbranch_finMixin := PcanFinMixin tag_of_dbranchK.
Canonical dbranch_finType := Eval hnf in FinType dbranch dbranch_finMixin.