summaryrefslogtreecommitdiff
path: root/test-suite/bugs/closed/5180.v
blob: 261092ee6d80818ba2e64ad17fe86f23dc1a0da8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Universes a b c ω ω'.
Definition Typeω := Type@{ω}.
Definition Type2 : Typeω := Type@{c}.
Definition Type1 : Type2 := Type@{b}.
Definition Type0 : Type1 := Type@{a}.

Set Universe Polymorphism.
Set Printing Universes.

Definition Typei' (n : nat)
  := match n return Type@{ω'} with
     | 0 => Type0
     | 1 => Type1
     | 2 => Type2
     | _ => Typeω
     end.
Definition TypeOfTypei' {n} (x : Typei' n) : Type@{ω'}
  := match n return Typei' n -> Type@{ω'} with
     | 0 | 1 | 2 | _ => fun x => x
     end x.
Definition Typei (n : nat) : Typei' (S n)
  := match n return Typei' (S n) with
     | 0 => Type0
     | 1 => Type1
     | _ => Type2
     end.
Definition TypeOfTypei {n} (x : TypeOfTypei' (Typei n)) : Type@{ω'}
  := match n return TypeOfTypei' (Typei n) -> Type@{ω'} with
     | 0 | 1 | _ => fun x => x
     end x.
Check Typei 0 : Typei 1.
Check Typei 1 : Typei 2.

Definition lift' {n} : TypeOfTypei' (Typei n) -> TypeOfTypei' (Typei (S n))
  := match n return TypeOfTypei' (Typei n) -> TypeOfTypei' (Typei (S n)) with
     | 0 | 1 | 2 | _ => fun x => (x : Type)
     end.
Definition lift'' {n} : TypeOfTypei' (Typei n) -> TypeOfTypei' (Typei (S n))
  := match n return TypeOfTypei' (Typei n) -> TypeOfTypei' (Typei (S n)) with
     | 0 | 1 | 2 | _ => fun x => x
     end. (* The command has indeed failed with message:
In environment
n : nat
x : TypeOfTypei' (Typei 0)
The term "x" has type "TypeOfTypei' (Typei 0)" while it is expected to have type
 "TypeOfTypei' (Typei 1)" (universe inconsistency: Cannot enforce b = a because  a < b).
 *)
Check (fun x : TypeOfTypei' (Typei 0) => TypeOfTypei' (Typei 1)).

Definition lift''' {n} : TypeOfTypei' (Typei n) -> TypeOfTypei' (Typei (S n)).
  refine match n return TypeOfTypei' (Typei n) -> TypeOfTypei' (Typei (S n))  with
         | 0 | 1 | 2 | _ => fun x => _
         end.
  exact x.
  Undo.
  (* The command has indeed failed with message:
In environment
n : nat
x : TypeOfTypei' (Typei 0)
The term "x" has type "TypeOfTypei' (Typei 0)" while it is expected to have type
 "TypeOfTypei' (Typei 1)" (universe inconsistency: Cannot enforce b = a because  a < b).
 *)
  all:compute in *.
  all:exact x.