我一直在尝试学习如何使用 ssreflect 进行子类型化,http ://ssr.msr-inria.inria.fr/~jenkins/current/mathcomp.ssreflect.eqtype.html作为我的主要参考,但一直遇到问题. 我想要做的是从T
具有三个术语的类型,创建一个T'
具有两个术语的子类型a,b
。{x:T | P x}
(1)和有什么区别subType P
?(2) 从我下面的代码中,我必须Sub a Pa
是 的一个术语T'
,是否有可能有一个适用于两者的通用证明a, b
?我在这里感到困惑,因为eqType.v
它感觉好像insub
是用来从一种类型投影到其子类型的那种。
From mathcomp Require Import ssreflect ssrfun ssrbool eqtype.
Inductive T : Set := a | b | c.
Definition P := fun (x:T) =>
match x with
| a => true
| b => true
| c => false
end.
Definition T' := {x:T | P x}.
Definition T'' := subType P.
Definition cast (x: T) : option T'.
destruct (P x) eqn:prf.
- exact (Some (exist _ x prf)).
- exact None.
Defined.
Definition Pa : is_true (P a).
destruct (P a) eqn:prf.
exact. simpl in prf. unfold is_true. symmetry. apply prf. Defined.
Check (Sub a Pa) : T'.
Check val (Sub a Pa) : T.
Check insub (val (Sub a Pa)) : option T'.
Definition Px :forall x : T, is_true (P x).
intros x. destruct (P x) eqn:prf.
- unfold is_true. reflexivity.
- unfold is_true.
Abort.