我以为我可以使用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文件中找不到它。预先感谢您的帮助。
答案 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.