如何在Coq中获取元素的所有父元素? 我在Coq中定义了一个集合如下:
Inductive Gen : Set :=
| BGen : nat -> nat -> Gen.
有许多例如:
Definition g1 = BGen 1 2.
Definition g2 = BGen 2 3.
现在,我想获得3的父元素,即[1,2]。我写了一个函数:
Fixpoint parents (c : nat) (l : list Gen) :=
match l with
| [] => []
| (BGen p c') :: l' => if beq_nat c c'
then [p]
else parents c l'
end.
我只能得到3的直接父[2],如何在这个例子中得到[1,2]这样的所有父母?
答案 0 :(得分:4)
您似乎在询问如何在重复的函数应用程序下计算函数的闭包。该问题的关键是找到一种确保终止的方法,即确定可以调用该函数的最大次数的方法。在这种情况下,一个简单的上限是List.length l
;一个元素不能拥有比世代更多的传递父母。使用这种洞察力,我们可以定义一个函数,它接受一个数字列表,并输出这些数字的列表以及它们的所有父项,然后我们将这个函数List.length l
次应用于它自己,从{{1开始} parents
:
c