feat(library/data/encodable): add encodable subtypes
This commit is contained in:
parent
56e2e0c0a5
commit
303e9031d6
1 changed files with 32 additions and 0 deletions
|
@ -272,6 +272,38 @@ encodable.mk
|
||||||
decode_encode_finset
|
decode_encode_finset
|
||||||
end finset
|
end finset
|
||||||
|
|
||||||
|
section subtype
|
||||||
|
open subtype decidable
|
||||||
|
variable {A : Type}
|
||||||
|
variable {P : A → Prop}
|
||||||
|
variable [encA : encodable A]
|
||||||
|
variable [decP : decidable_pred P]
|
||||||
|
|
||||||
|
include encA
|
||||||
|
definition encode_subtype : {a : A | P a} → nat
|
||||||
|
| (tag v h) := encode v
|
||||||
|
|
||||||
|
include decP
|
||||||
|
definition decode_subtype (v : nat) : option {a : A | P a} :=
|
||||||
|
match decode A v with
|
||||||
|
| some a := if h : P a then some (tag a h) else none
|
||||||
|
| none := none
|
||||||
|
end
|
||||||
|
|
||||||
|
lemma decode_encode_subtype : ∀ s : {a : A | P a}, decode_subtype (encode_subtype s) = some s
|
||||||
|
| (tag v h) :=
|
||||||
|
begin
|
||||||
|
unfold [encode_subtype, decode_subtype], rewrite encodek, esimp,
|
||||||
|
rewrite [dif_pos h]
|
||||||
|
end
|
||||||
|
|
||||||
|
definition encodable_subtype [instance] : encodable {a : A | P a} :=
|
||||||
|
encodable.mk
|
||||||
|
encode_subtype
|
||||||
|
decode_subtype
|
||||||
|
decode_encode_subtype
|
||||||
|
end subtype
|
||||||
|
|
||||||
definition encodable_of_left_injection
|
definition encodable_of_left_injection
|
||||||
{A B : Type} [h₁ : encodable A]
|
{A B : Type} [h₁ : encodable A]
|
||||||
(f : B → A) (finv : A → option B) (linv : ∀ b, finv (f b) = some b) : encodable B :=
|
(f : B → A) (finv : A → option B) (linv : ∀ b, finv (f b) = some b) : encodable B :=
|
||||||
|
|
Loading…
Reference in a new issue