feat(library/init/lean/name): add lean.name

This commit is contained in:
Leonardo de Moura 2018-04-29 08:44:58 -07:00
parent 12f2831f9f
commit b39daa40ef

View file

@ -0,0 +1,71 @@
/-
Copyright (c) 2018 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
-/
prelude
import init.data.string.basic init.coe init.data.uint
namespace lean
inductive name
| anonymous : name
| mk_string : name → string → name
| mk_numeral : name → nat → name
instance : inhabited name :=
⟨name.anonymous⟩
def mk_str_name (p : name) (s : string) : name :=
name.mk_string p s
def mk_num_name (p : name) (v : nat) : name :=
name.mk_numeral p v
def mk_simple_name (s : string) : name :=
mk_str_name name.anonymous s
instance string_to_name : has_coe string name :=
⟨mk_simple_name⟩
namespace name
/- TODO: mark `hash` as opaque, and mark that is replaced by
the code generator. Since it is marked as opaque, other modules
can't assume anything about it. -/
def hash (n : name) : uint32 :=
0
def get_prefix : name → name
| anonymous := anonymous
| (mk_string p s) := p
| (mk_numeral p s) := p
def update_prefix : name → name → name
| anonymous new_p := anonymous
| (mk_string p s) new_p := mk_string new_p s
| (mk_numeral p s) new_p := mk_numeral new_p s
instance has_decidable_eq : decidable_eq name
| anonymous anonymous := is_true rfl
| (mk_string p₁ s₁) (mk_string p₂ s₂) :=
if h₁ : s₁ = s₂ then
match has_decidable_eq p₁ p₂ with
| is_true h₂ := is_true $ h₁ ▸ h₂ ▸ rfl
| is_false h₂ := is_false $ λ h, name.no_confusion h $ λ hp hs, absurd hp h₂
end
else is_false $ λ h, name.no_confusion h $ λ hp hs, absurd hs h₁
| (mk_numeral p₁ n₁) (mk_numeral p₂ n₂) :=
if h₁ : n₁ = n₂ then
match has_decidable_eq p₁ p₂ with
| is_true h₂ := is_true $ h₁ ▸ h₂ ▸ rfl
| is_false h₂ := is_false $ λ h, name.no_confusion h $ λ hp hs, absurd hp h₂
end
else is_false $ λ h, name.no_confusion h $ λ hp hs, absurd hs h₁
| anonymous (mk_string _ _) := is_false $ λ h, name.no_confusion h
| anonymous (mk_numeral _ _) := is_false $ λ h, name.no_confusion h
| (mk_string _ _) anonymous := is_false $ λ h, name.no_confusion h
| (mk_string _ _) (mk_numeral _ _) := is_false $ λ h, name.no_confusion h
| (mk_numeral _ _) anonymous := is_false $ λ h, name.no_confusion h
| (mk_numeral _ _) (mk_string _ _) := is_false $ λ h, name.no_confusion h
end name
end lean