如何从字面上展开Coq不动点
我试图展开一个如何从字面上展开Coq不动点,coq,coq-tactic,Coq,Coq Tactic,我试图展开一个固定点定义并获得定义的主体。但是Coq并没有给出确切的定义。相反,它给了我一些以(fix…)开头的东西,我无法使用它们 例如,在从 国家是: ... ______________________________________(1/1) F x (fun (y : A) (p : R y x) => Fix_F y (Acc_inv x r y p)) = Fix_F x r 现在,RHS上的Fix_F定义与LHS完全相同: Fixpoint Fix_F (x:
固定点
定义并获得定义的主体。但是Coq并没有给出确切的定义。相反,它给了我一些以(fix…
)开头的东西,我无法使用它们
例如,在从
国家是:
...
______________________________________(1/1)
F x
(fun (y : A) (p : R y x) =>
Fix_F y (Acc_inv x r y p)) =
Fix_F x r
现在,RHS上的Fix_F定义与LHS完全相同:
Fixpoint Fix_F (x:A) (r:Acc x) {struct r} : P x :=
F x (fun (y:A) (p:R y x) => Fix_F y (Acc_inv x r y p)).
我试图通过以下方式使它成为一个微不足道的平等:
unfold Fix_F at 2.
然而,我在RHS上得到了类似于(fix\u F…
的东西,我不能再沿着这条路线继续下去了:
______________________________________(1/1)
F x
(fun (y : A) (p : R y x) =>
Fix_F y (Acc_inv x r y p)) =
(fix
Fix_F (x0 : A) (r0 : Acc x0) {struct r0} :
P x0 :=
F x0
(fun (y : A) (p : R y x0) =>
Fix_F y (Acc_inv x0 r0 y p))) x r
问题是:
是否有办法将上述固定点
展开至其功能体?
注意:我知道有一个变通方法可以证明这个例子
Proof. intros. destruct r. simpl. trivial.
Defined.
但是我更感兴趣的是
展开
-ing方法,如果它是有效的。你能明确地写下你的预期目标吗?我不相信这是可能的,因为它不是定义
,而是固定点
,所以定义就是你在展开
中得到的。不过我不是COQ专家。@Elazar,不动点定义的主体是:fx(fun(y:a)(p:ryx)=>Fix\fy(Acc\u inv x ryp))
。我希望通过“展开”得到这个,然后要证明的是一个反身性。你能解释一下你提到的定义
和固定点
之间的区别,以及为什么不可能按原样扩展固定点定义吗?据我所知,固定点
是调用函数固定点
(我想是COQ固有的)的语法糖,这就是。实际定义正是您在展开后看到的定义。按原样扩展固定点定义意味着您删除了语法上的糖分,留下了不同的定义。@Elazar的注释是正确的。在这里,您真正想要的不是展开定义,而是执行一步计算。要做到这一点,请尝试cbv
。你能明确地写下你的预期目标吗?我认为这是不可能的,因为它不是定义
,而是固定点
,所以定义就是你在展开
中得到的。不过我不是COQ专家。@Elazar,不动点定义的主体是:fx(fun(y:a)(p:ryx)=>Fix\fy(Acc\u inv x ryp))
。我希望通过“展开”得到这个,然后要证明的是一个反身性。你能解释一下你提到的定义
和固定点
之间的区别,以及为什么不可能按原样扩展固定点定义吗?据我所知,固定点
是调用函数固定点
(我想是COQ固有的)的语法糖,这就是。实际定义正是您在展开后看到的定义。按原样扩展固定点定义意味着您删除了语法上的糖分,留下了不同的定义。@Elazar的注释是正确的。在这里,您真正想要的不是展开定义,而是执行一步计算。要做到这一点,请尝试cbv
。
Proof. intros. destruct r. simpl. trivial.
Defined.