| /-! | |
| # Pretty print with `∀` instead of `→` when domain is type | |
| https://github.com/leanprover/lean4/issues/1834 | |
| -/ | |
| set_option linter.unusedVariables false | |
| /-! | |
| Tests of various pi types. | |
| -/ | |
| section | |
| variable (α : Nat → Type) (p q : Prop) (P : Nat → Prop) | |
| -- default nondep | |
| /-- info: Nat → Nat : Type -/ | |
| #guard_msgs in #check (i : Nat) → Nat | |
| -- implicit nondep | |
| /-- info: {i : Nat} → Nat : Type -/ | |
| #guard_msgs in #check {i : Nat} → Nat | |
| -- instance implicit nondep | |
| /-- info: [Inhabited Nat] → Nat : Type -/ | |
| #guard_msgs in #check [Inhabited Nat] → Nat | |
| -- default nondep, both prop | |
| /-- info: p → q : Prop -/ | |
| #guard_msgs in #check (h : p) → q | |
| -- default nondep, only codomain prop | |
| /-- info: ∀ (i : Nat), p : Prop -/ | |
| #guard_msgs in #check (i : Nat) → p | |
| -- implicit nondep, only codomain prop | |
| /-- info: ∀ {i : Nat}, p : Prop -/ | |
| #guard_msgs in #check {i : Nat} → p | |
| -- instance implicit nondep, only codomain prop, hygienic name | |
| /-- info: ∀ [Inhabited Nat], p : Prop -/ | |
| #guard_msgs in #check [Inhabited Nat] → p | |
| -- instance implicit nondep, only codomain prop, user-provided name | |
| /-- info: ∀ [instNat : Inhabited Nat], p : Prop -/ | |
| #guard_msgs in #check [instNat : Inhabited Nat] → p | |
| -- default dep | |
| /-- info: (i : Nat) → α i : Type -/ | |
| #guard_msgs in #check (i : Nat) → α i | |
| -- implicit dep | |
| /-- info: {i : Nat} → α i : Type -/ | |
| #guard_msgs in #check {i : Nat} → α i | |
| -- instance implicit dep | |
| /-- info: [inst : Inhabited Nat] → α default : Type -/ | |
| #guard_msgs in #check [Inhabited Nat] → α default | |
| -- default dep, codomain prop | |
| /-- info: ∀ (i : Nat), P i : Prop -/ | |
| #guard_msgs in #check (i : Nat) → P i | |
| -- implicit dep, codomain prop | |
| /-- info: ∀ {i : Nat}, P i : Prop -/ | |
| #guard_msgs in #check {i : Nat} → P i | |
| -- instance implicit dep, codomain prop, hygienic name | |
| /-- info: ∀ [inst : Inhabited Nat], P default : Prop -/ | |
| #guard_msgs in #check [Inhabited Nat] → P default | |
| -- instance implicit dep, codomain prop, user-provided name | |
| /-- info: ∀ [instNat : Inhabited Nat], P default : Prop -/ | |
| #guard_msgs in #check [instNat : Inhabited Nat] → P default | |
| -- Same tests but with `pp.foralls` set to false. | |
| set_option pp.foralls false | |
| -- default nondep | |
| /-- info: Nat → Nat : Type -/ | |
| #guard_msgs in #check (i : Nat) → Nat | |
| -- implicit nondep | |
| /-- info: {i : Nat} → Nat : Type -/ | |
| #guard_msgs in #check {i : Nat} → Nat | |
| -- default nondep, both prop | |
| /-- info: p → q : Prop -/ | |
| #guard_msgs in #check (h : p) → q | |
| -- default nondep, only codomain prop | |
| /-- info: Nat → p : Prop -/ | |
| #guard_msgs in #check (i : Nat) → p | |
| -- default dep | |
| /-- info: (i : Nat) → α i : Type -/ | |
| #guard_msgs in #check (i : Nat) → α i | |
| -- implicit dep | |
| /-- info: {i : Nat} → α i : Type -/ | |
| #guard_msgs in #check {i : Nat} → α i | |
| -- default dep, codomain prop | |
| /-- info: (i : Nat) → P i : Prop -/ | |
| #guard_msgs in #check (i : Nat) → P i | |
| -- implicit dep, codomain prop | |
| /-- info: {i : Nat} → P i : Prop -/ | |
| #guard_msgs in #check {i : Nat} → P i | |
| -- implicit nondep, only codomain prop | |
| /-- info: {i : Nat} → p : Prop -/ | |
| #guard_msgs in #check {i : Nat} → p | |
| end | |
| /-! | |
| Rewrote forall, remains a forall, since domain is `Nat`. | |
| -/ | |
| /-- | |
| trace: P : Nat → Prop | |
| q : Prop | |
| h : ∀ (n : Nat), P n = q | |
| hq : q | |
| ⊢ ∀ (n : Nat), q | |
| -/ | |
| #guard_msgs in | |
| example (P : Nat → Prop) (q : Prop) (h : ∀ n, P n = q) (hq : q) : | |
| ∀ n, P n := by | |
| conv => enter [n]; rw [h] | |
| trace_state | |
| exact fun _ => hq | |
| /-! | |
| When `pp.foralls` is false, uses non-dependent `→`. | |
| -/ | |
| /-- | |
| trace: P : Nat → Prop | |
| q : Prop | |
| h : (n : Nat) → P n = q | |
| hq : q | |
| ⊢ Nat → q | |
| -/ | |
| #guard_msgs in | |
| set_option pp.foralls false in | |
| example (P : Nat → Prop) (q : Prop) (h : ∀ n, P n = q) (hq : q) : | |
| ∀ n, P n := by | |
| conv => enter [n]; rw [h] | |
| trace_state | |
| exact fun _ => hq | |
| /-! | |
| Rewrote forall, turns into an implication, since domain is a proposition. | |
| -/ | |
| /-- | |
| trace: p : Prop | |
| P : p → Prop | |
| q : Prop | |
| h : ∀ (n : p), P n = q | |
| hq : q | |
| ⊢ p → q | |
| -/ | |
| #guard_msgs in | |
| example (p : Prop) (P : p → Prop) (q : Prop) (h : ∀ n, P n = q) (hq : q) : | |
| ∀ n, P n := by | |
| conv => enter [n]; rw [h] | |
| trace_state | |
| exact fun _ => hq |