lean4-htt/Lake/Util/Name.lean

70 lines
2.2 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2022 Mac Malone. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Mac Malone
-/
import Lean.Data.Name
import Lake.Util.Compare
open Lean
namespace Lake
export Lean (Name NameMap)
@[inline] def NameMap.empty : NameMap α := Std.RBMap.empty
instance : ForIn m (NameMap α) (Name × α) where
forIn self init f := self.forIn init f
/-! # Name Helpers -/
namespace Name
open Lean.Name
@[simp] protected theorem beq_false (m n : Name) : (m == n) = false ↔ ¬ (m = n) := by
rw [← beq_iff_eq m n]; cases m == n <;> simp
@[simp] theorem isPrefixOf_self {n : Name} : n.isPrefixOf n := by
cases n <;> simp [isPrefixOf]
@[simp] theorem isPrefixOf_append {n m : Name} : n.isPrefixOf (n ++ m) := by
show n.isPrefixOf (n.append m)
induction m <;> simp [isPrefixOf, Name.append, *]
@[simp] theorem quickCmpAux_iff_eq : ∀ {n n'}, quickCmpAux n n' = .eq ↔ n = n'
| .anonymous, n => by cases n <;> simp [quickCmpAux]
| n, .anonymous => by cases n <;> simp [quickCmpAux]
| .num .., .str .. => by simp [quickCmpAux]
| .str .., .num .. => by simp [quickCmpAux]
| .num p₁ n₁, .num p₂ n₂ => by
simp only [quickCmpAux]; split <;>
simp_all [quickCmpAux_iff_eq, show ∀ p, (p → False) ↔ ¬ p from fun _ => .rfl]
| .str p₁ s₁, .str p₂ s₂ => by
simp only [quickCmpAux]; split <;>
simp_all [quickCmpAux_iff_eq, show ∀ p, (p → False) ↔ ¬ p from fun _ => .rfl]
instance : LawfulCmpEq Name quickCmpAux where
eq_of_cmp := quickCmpAux_iff_eq.mp
cmp_rfl := quickCmpAux_iff_eq.mpr rfl
theorem eq_of_quickCmp {n n' : Name} : n.quickCmp n' = .eq → n = n' := by
unfold Name.quickCmp
intro h_cmp; split at h_cmp
next => exact eq_of_cmp h_cmp
next => contradiction
theorem quickCmp_rfl {n : Name} : n.quickCmp n = .eq := by
unfold Name.quickCmp
split <;> exact cmp_rfl
instance : LawfulCmpEq Name Name.quickCmp where
eq_of_cmp := eq_of_quickCmp
cmp_rfl := quickCmp_rfl
open Syntax
def quoteFrom (ref : Syntax) : Name → Term
| .anonymous => mkCIdentFrom ref ``anonymous
| .str p s => mkApp (mkCIdentFrom ref ``mkStr) #[quoteFrom ref p, quote s]
| .num p v => mkApp (mkCIdentFrom ref ``mkNum) #[quoteFrom ref p, quote v]