如何在Coq中表达继承?

时间:2017-10-20 06:36:25

标签: coq

如何在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]这样的所有父母?

1 个答案:

答案 0 :(得分:4)

您似乎在询问如何在重复的函数应用程序下计算函数的闭包。该问题的关键是找到一种确保终止的方法,即确定可以调用该函数的最大次数的方法。在这种情况下,一个简单的上限是List.length l;一个元素不能拥有比世代更多的传递父母。使用这种洞察力,我们可以定义一个函数,它接受一个数字列表,并输出这些数字的列表以及它们的所有父项,然后我们将这个函数List.length l次应用于它自己,从{{1开始} parents

c