作为一个粗略和未经训练的背景,在HoTT中,可以推断出归纳定义的类型
Inductive paths {X : Type } : X -> X -> Type :=
| idpath : forall x: X, paths x x.
Run Code Online (Sandbox Code Playgroud)
这允许非常一般的建筑
Lemma transport {X : Type } (P : X -> Type ){ x y : X} (? : paths x y):
P x -> P y.
Proof.
induction ?.
exact (fun a => a).
Defined.
Run Code Online (Sandbox Code Playgroud)
这Lemma transport 将是HoTT"替换"或"改写"战术的核心; 据我所知,诀窍就是假设你或我可以抽象地认出的目标
...
H : paths x y
[ Q : (G x) ]
_____________
(G y)
Run Code Online (Sandbox Code Playgroud)
找出什么是必要的依赖类型G,以便我们可以apply (transport G H).到目前为止,我所知道的就是那个
Ltac transport_along ? :=
match (type of ?) with
| ?a ~~> ?b =>
match goal with
|- ?F b => apply (transport F ?)
| _ => idtac "apparently couldn't abstract" b "from the goal." end
| _ => idtac "Are you sure" ? "is a path?" end.
Run Code Online (Sandbox Code Playgroud)
不够通用.也就是说,第一个idtac经常被使用.
问题是
[有没有| 什么是正确的事情?
关于在类型中使用重写关系有一个错误,这可以让你说rewrite <- y.
同时,
Ltac transport_along ? :=
match (type of ?) with
| ?a ~~> ?b => pattern b; apply (transport _ y)
| _ => idtac "Are you sure" ? "is a path?"
end.
Run Code Online (Sandbox Code Playgroud)
可能做你想要的.