如何在Coq?中表达继承;

如何在Coq?中表达继承;,coq,Coq,如何获取Coq中元素的所有父元素? 我将Coq中的集合定义如下: Inductive Gen : Set := | BGen : nat -> nat -> Gen. 有许多例子,例如: Definition g1 = BGen 1 2. Definition g2 = BGen 2 3. 现在,我想得到3的parents元素,即[1,2]。我写了一个函数: Fixpoint parents (c : nat) (l : list Gen) := match l with | [

如何获取Coq中元素的所有父元素? 我将Coq中的集合定义如下:

Inductive Gen : Set :=
| BGen : nat -> nat -> Gen.
有许多例子,例如:

Definition g1 = BGen 1 2.
Definition g2 = BGen 2 3.
现在,我想得到3的parents元素,即[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
次应用于自身,从
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] *)

您似乎在询问如何在重复函数应用程序下计算函数的闭包。问题的关键是找到一种确保终止的方法,即确定函数可能被调用的最大次数的方法。在这种情况下,一个简单的上界是
List.length l
;元素的可传递父级不能多于代数。利用这一点,我们可以定义一个函数,该函数获取一个数字列表,并将这些数字的列表及其所有父项一起输出,然后我们将此函数
list.length l
次应用于自身,从
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] *)

如果您找到了一个匹配项,而不是返回列表其余部分中的其他匹配项,那么为什么还要返回
[p]
。但是,使用这个函数只能找到c的父母,我不能得到c的所有父母啊!我似乎误解了你的目标:你不仅想要父母,还想要父母的父母,等等。?基本上你想构建一个闭包?如果你找到了一个匹配项,而不是返回列表中的其他匹配项,那么为什么你要停止返回
[p]
。但是,使用这个函数只能找到c的父母,我不能得到c的所有父母啊!我似乎误解了你的目标:你不仅想要父母,还想要父母的父母,等等。?基本上你想结束?是的,这就是我想要的。是的,这就是我想要的。