Я пытался научиться делать подтипы с помощью ssreflect, http://ssr.msr-inria.inria.fr/~jenkins/current/mathcomp.ssreflect.eqtype.html в качестве моей основной ссылки, но столкнулся с проблемами. То, что я пытаюсь сделать, это создать из типа T
с тремя терминами подтип T'
с двумя терминами a,b
. (1) в чем разница между {x:T | P x}
и 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.