47 lines
1.4 KiB
Text
47 lines
1.4 KiB
Text
/-
|
|
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Author: Leonardo de Moura
|
|
-/
|
|
import data.rat.basic data.countable data.encodable data.int.countable
|
|
open encodable nat int option quot
|
|
|
|
namespace rat
|
|
definition encode_prerat : prerat → nat
|
|
| (prerat.mk n d h) := mkpair (encode n) (encode d)
|
|
|
|
definition decode_prerat (a : nat) : option prerat :=
|
|
match unpair a with
|
|
| (cn, cd) :=
|
|
match decode int cn with
|
|
| some n :=
|
|
match decode int cd with
|
|
| some d := if h : d > 0 then some (prerat.mk n d h) else none
|
|
| none := none
|
|
end
|
|
| none := none
|
|
end
|
|
end
|
|
|
|
lemma decode_encode_prerat (p : prerat) : decode_prerat (encode_prerat p) = some p :=
|
|
begin
|
|
cases p with n d h, unfold [encode_prerat, decode_prerat],
|
|
rewrite unpair_mkpair, esimp, rewrite [*encodek, dif_pos h]
|
|
end
|
|
|
|
definition encodable_prerat [instance] : encodable prerat :=
|
|
encodable.mk
|
|
encode_prerat
|
|
decode_prerat
|
|
decode_encode_prerat
|
|
|
|
definition decidable_equiv [instance] : ∀ a b : prerat, decidable (prerat.equiv a b)
|
|
| (prerat.mk n₁ d₁ h₁) (prerat.mk n₂ d₂ h₂) := begin unfold prerat.equiv, exact _ end
|
|
|
|
|
|
definition encodable_rat [instance] : encodable rat :=
|
|
@encodable_quot _ _ decidable_equiv encodable_prerat
|
|
|
|
lemma countable_rat : countable rat :=
|
|
countable_of_encodable encodable_rat
|
|
end rat
|