open nat

structure [class] foo :=
(a : nat) (b : nat)

attribute [instance, priority std.priority.default-2]
definition i1 : foo :=
foo.mk 1 1

example : foo.a = 1 :=
rfl

attribute [instance, priority std.priority.default-1]
definition i2 : foo :=
foo.mk 2 2

example : foo.a = 2 :=
rfl

attribute [instance]
definition i3 : foo :=
foo.mk 3 3

example : foo.a = 3 :=
rfl

attribute [instance, priority std.priority.default-1]
definition i4 : foo :=
foo.mk 4 4

example : foo.a = 3 :=
rfl

attribute [instance, priority std.priority.default+2] i4

example : foo.a = 4 :=
rfl

attribute [instance, priority std.priority.default+3] i1

example : foo.a = 1 :=
rfl

attribute [instance, priority std.priority.default+4] i2

example : foo.a = 2 :=
rfl
