Coq 从可计算函数到归纳关系

Coq 从可计算函数到归纳关系,coq,Coq,我试图理解如何从对可计算函数进行运算的定理转移到使用归纳定义关系来表示计算的定理。考虑下面的简单开发。让我们从关系及其属性的标准定义开始: Definition relation (X : Type) := X -> X -> Prop. Definition reflexive {X : Type} (R : relation X) := forall a, R a a. Definition transitive {X : Type} (R : relation X) :

我试图理解如何从对可计算函数进行运算的定理转移到使用归纳定义关系来表示计算的定理。考虑下面的简单开发。让我们从关系及其属性的标准定义开始:

Definition relation (X : Type) := X -> X -> Prop.

Definition reflexive {X : Type} (R : relation X) :=
  forall a, R a a.

Definition transitive {X : Type} (R : relation X) :=
  forall a b c : X, (R a b) -> (R b c) -> (R a c).
Definition propA' {X : Type} (R : relation X) (F G : relation X)
          (Fdet : deterministic F) (Gdet : deterministic G) :=
  forall p q x y, F p x -> G q y -> R x q <-> R p y.

Definition propB' {X : Type} (R : relation X) (F G : relation X)
          (Fdet : deterministic F) (Gdet : deterministic G) :=
  forall x y z, F x y -> G y z -> R x z.

Definition propC' {X : Type} (R : relation X) (F : relation X)
          (Fdet : deterministic F) :=
  forall a b x y : X, F a x -> F b y -> R a b -> R x y.
现在,我为关系
R
和两个函数
F
G
定义了三个属性:

Definition propA {X : Type} (R : relation X) (F G : X -> X) :=
  forall p q, R (F p) q <-> R p (G q).

Definition propB {X : Type} (R : relation X) (F G : X -> X) :=
  forall x, R x (G (F x)).

Definition propC {X : Type} (R : relation X) (F : X -> X) :=
  forall a b : X, R a b -> R (F a) (F b).
最后我陈述了一个定理,如果
R
是自反的和传递的,并且属性a适用于
R
F
G
,那么属性C适用于
R
F

Lemma aPropC {X : Type} {R : relation X} {F G : X -> X}
      (Rrefl : reflexive R) (Rtrans : transitive R) (H : propA R F G) :
  propC R F.
Proof.
  unfold propC in *.
  intros.
  apply H.
  eapply Rtrans. eassumption.
  apply aPropB; assumption.
Qed.
现在,我想从将
F
G
表示为计算转移到将它们表示为关系。因此,我不再说
F:X->X
,而是说
F:relationx
,并坚持认为
F
是确定性的:

Definition deterministic {X : Type} (F : relation X) :=
  forall x y1 y2, F x y1 -> F x y2 -> y1 = y2.
我重申所有三个属性:

Definition relation (X : Type) := X -> X -> Prop.

Definition reflexive {X : Type} (R : relation X) :=
  forall a, R a a.

Definition transitive {X : Type} (R : relation X) :=
  forall a b c : X, (R a b) -> (R b c) -> (R a c).
Definition propA' {X : Type} (R : relation X) (F G : relation X)
          (Fdet : deterministic F) (Gdet : deterministic G) :=
  forall p q x y, F p x -> G q y -> R x q <-> R p y.

Definition propB' {X : Type} (R : relation X) (F G : relation X)
          (Fdet : deterministic F) (Gdet : deterministic G) :=
  forall x y z, F x y -> G y z -> R x z.

Definition propC' {X : Type} (R : relation X) (F : relation X)
          (Fdet : deterministic F) :=
  forall a b x y : X, F a x -> F b y -> R a b -> R x y.
但是我被第二个卡住了。我这样开始证明:

Lemma aPropC' {X : Type} {R : relation X} {F G : relation X}
      {Fdet : deterministic F} {Gdet : deterministic G}
      (Rrefl : reflexive R) (Rtrans : transitive R)
      (H : propA' R F G Fdet Gdet) :
  propC' R F Fdet.
Proof.
  unfold propC' in *.
  intros.
  eapply H; try eassumption.
并以以下目标结束以证明(省略了一些不相关的假设):

问题是
G
现在是
propA'
的一个明确前提,如果我想依赖
propA'
,我必须证明这一点。但在我目前的证明环境中,我对
G
没有任何假设,也看不到完成证明的方法。以前在使用函数的
aPropC
中,
G
只会出现在
aPropA
aPropB
的结论中。因此,目标的形状与我的假设和已知引理的形状相匹配,使我能够轻松地使用它们


我哪里出了问题?我从函数到关系的转换是否不正确?这里有什么技术可以使用吗?

Coq中的函数不仅是确定性关系,而且是总的关系。因此,您可能想加入:

 Definition total {X : Type} (R : relation X) : Prop :=
   forall x, exists y, R x y.
然后,
功能性
的概念是
确定性
总体
的结合:

 Definition functional {X : Type} (R : relation X) : Prop :=
   deterministic R /\ total R.

或者,您可以将假设添加到与关系所代表的部分函数的域相关的引理中。

我之所以要使用关系,是因为我的函数不是全部的。
 Definition functional {X : Type} (R : relation X) : Prop :=
   deterministic R /\ total R.