Coq中如何表达继承?

How to express inheritance in 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]等所有父?

你好像问的是在重复函数应用下如何计算函数的闭包。问题的关键是找到一种确保终止的方法,即确定函数可能被调用的最大次数的方法。在这种情况下,一个简单的上限是 List.length l;一个元素的传递父代数不能超过代数。利用这种洞察力,我们可以定义一个函数,它接受一个数字列表,并输出这些数字及其所有父项的列表,然后我们将此函数应用于自身 List.length l 次,从 [=13 开始=] 共 c 个:

Require Import Coq.Lists.List. Import ListNotations.
Require Import Coq.Sorting.Mergesort. Import NatSort.
Scheme Equality for nat.
Inductive Gen : Set :=
| BGen : nat -> nat -> Gen.

Definition g1 := BGen 1 2.
Definition g2 := BGen 2 3.


Fixpoint parents (l : list Gen) (c : nat) :=
  match l with
  | [] => []
  | (BGen p c') :: l' => if nat_beq c c'
                         then [p]
                         else parents l' c
  end.

Fixpoint deduplicate' (ls : list nat) :=
  match ls with
  | [] => []
  | x :: [] => [x]
  | x :: ((y :: ys) as xs)
    => if nat_beq x y
       then deduplicate' xs
       else x :: deduplicate' xs
  end.
Definition deduplicate (ls : list nat) := deduplicate' (sort ls).

Definition parents_step (l : list Gen) (cs : list nat) :=
  deduplicate (cs ++ List.flat_map (parents l) cs).

Fixpoint all_parents' (l : list Gen) (cs : list nat) (fuel : nat) :=
  match fuel with
  | 0 => cs
  | S fuel'
    => all_parents' l (parents_step l cs) fuel'
  end.
Definition all_parents (l : list Gen) (c : nat) :=
  deduplicate (all_parents' l (parents l c) (List.length l)).

Definition gs := (g1::g2::nil).

Compute all_parents gs 3. (* [1; 2] *)