44 lines
1.3 KiB
Text
44 lines
1.3 KiB
Text
/-
|
||
Copyright (c) 2017 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Author: Mario Carneiro
|
||
-/
|
||
|
||
def pnat := {n : ℕ // n > 0}
|
||
notation `ℕ+` := pnat
|
||
|
||
instance coe_pnat_nat : has_coe ℕ+ ℕ := ⟨subtype.val⟩
|
||
|
||
meta def exact_dec_trivial : tactic unit := `[exact dec_trivial]
|
||
|
||
namespace nat
|
||
|
||
def to_pnat (n : ℕ) (h : n > 0 . exact_dec_trivial) : ℕ+ := ⟨n, h⟩
|
||
|
||
def succ_pnat (n : ℕ) : ℕ+ := ⟨succ n, succ_pos n⟩
|
||
|
||
def to_pnat' (n : ℕ) : ℕ+ := succ_pnat (pred n)
|
||
end nat
|
||
|
||
instance coe_nat_pnat : has_coe ℕ ℕ+ := ⟨nat.to_pnat'⟩
|
||
|
||
namespace pnat
|
||
open nat
|
||
|
||
instance : has_one ℕ+ := ⟨succ_pnat 0⟩
|
||
|
||
protected def add : ℕ+ → ℕ+ → ℕ+
|
||
| ⟨m, m0⟩ ⟨n, n0⟩ := ⟨m + n, add_pos m0 n0⟩
|
||
|
||
instance : has_add ℕ+ := ⟨pnat.add⟩
|
||
|
||
protected def mul : ℕ+ → ℕ+ → ℕ+
|
||
| ⟨m, m0⟩ ⟨n, n0⟩ := ⟨m * n, mul_pos m0 n0⟩
|
||
|
||
instance : has_mul ℕ+ := ⟨pnat.mul⟩
|
||
|
||
@[simp] theorem to_pnat'_val {n : ℕ} : n > 0 → n.to_pnat'.val = n := succ_pred_eq_of_pos
|
||
@[simp] theorem nat_coe_val {n : ℕ} : n > 0 → (n : ℕ+).val = n := succ_pred_eq_of_pos
|
||
@[simp] theorem to_pnat'_coe {n : ℕ} : n > 0 → (n.to_pnat' : ℕ) = n := succ_pred_eq_of_pos
|
||
|
||
end pnat
|