Я пытаюсь построить индуктивный тип кобордизма, используя Coq, таким образом, чтобы можно было доказать некоторые свойства кобордизма (1-группоид и 2-группоид). Я использую следующий код Coq:
Unset Automatic Introduction.
Inductive Topo : Set := t | nt.
Definition F (i j : Topo) :=
match i, j with
| t, t => t
| t, nt => nt
| nt, t => nt
| nt, nt => nt
end.
Я рассматриваю два вида топологий кобордизмов: тривиальную (t) и нетривиальную (nt). Тривиальные кобордизмы - это цилиндр, рассматриваемый как единица в 1-группоиде. Функция F дает композицию топологий.
Под индуктивным типом кобордизма подразумевается:
Inductive cobordisms {A} : A -> A -> Topo -> Type := idcobordism : forall
x : A, cobordisms x x t.
с тактикой:
Hint Resolve @idcobordism.
Ltac cobordism_induction :=
intros; repeat progress (
match goal with
| [ p : cobordisms _ _ _ |- _ ] => induction p
| _ => idtac
end
); auto.
Состав кобордизмов вводится согласно:
Definition concat {A} {x y z : A} {i j : Topo} : cobordisms x y i -> cobordisms y z j
-> cobordisms x z (F i j) .
Proof.
cobordism_induction.
Defined.
Notation "p @ q" := (concat p q) (at level 60).
Обратное к заданному кобордизму определяется следующим образом:
Definition opposite {A} {x y : A} {i : Topo} : cobordisms x y i -> cobordisms y x i .
Proof.
cobordism_induction.
Defined.
Notation "! p" := (opposite p) (at level 50).
До сих пор все в порядке. Но когда я пытаюсь доказать первое свойство 1-групид, а именно левое единство:
Lemma idcobordism_left_unit A (x y : A) (i : Topo) (p : cobordisms x y i) :
(idcobordism x) @ p = p.
Я получаю следующее сообщение об ошибке:
Error: In environment
A : Type
x : A
y : A
i : Topo
p : cobordisms x y i
The term "p" has type "cobordisms x y i" while it is expected to have type
"cobordisms x y (F t i)".
Тогда мой вопрос: как заставить Coq считать, что (F t i)
эквивалентно i
для всех i
в соответствии с предыдущим определением F
?