【发布时间】:2014-06-19 10:26:52
【问题描述】:
这是一个递归函数all_zero,它检查自然数列表的所有成员是否为零:
Require Import Lists.List.
Require Import Basics.
Fixpoint all_zero ( l : list nat ) : bool :=
match l with
| nil => true
| n :: l' => andb ( beq_nat n 0 ) ( all_zero l' )
end.
现在,假设我有以下目标
true = all_zero (n :: l')
我想使用unfold 策略将其转换为
true = andb ( beq_nat n 0 ) ( all_zero l' )
不幸的是,我不能用一个简单的unfold all_zero 来做到这一点,因为这种策略会急切地找到并替换所有all_zero 的实例,包括曾经展开形式的那个,它会变成一团糟。有没有办法避免这种情况并只展开一次递归函数?
我知道我可以通过证明与 assert (...) as X 的临时等效性来获得相同的结果,但它效率低下。我想知道是否有类似于unfold 的简单方法。
【问题讨论】:
-
你也可以证明
forall n l, all_zero (n :: l) = andb (beq_nat n 0) (all_zero l)并用它重写。