据我了解,Coq 中的函数调用是不透明的。有时,我需要使用unfold
它来应用它,然后fold
将函数定义/主体转回其名称。这通常很乏味。我的问题是,有没有更简单的方法来应用函数调用的特定实例?
作为一个最小的例子,对于 list l
,证明右附加[]
不会改变l
:
Theorem nil_right_app: forall {Y} (l: list Y), l ++ [] = l.
Proof.
induction l.
reflexivity.
这留下:
1 subgoals
Y : Type
x : Y
l : list Y
IHl : l ++ [] = l
______________________________________(1/1)
(x :: l) ++ [] = x :: l
现在,我需要应用一次++
(ie app
) 的定义(假设目标中还有其他++
我不想应用/扩展的)。目前,我知道实现这个一次性应用程序的唯一方法是先展开++
然后折叠它:
unfold app at 1. fold (app l []).
给予:
______________________________________(1/1)
x :: l ++ [] = x :: l
但这很不方便,因为我必须弄清楚要在fold
. 我做了计算,而不是 Coq。我的问题归结为:
有没有更简单的方法来实现这个一次性功能应用程序达到同样的效果?