Coq不承认依赖列表的相等性

Coq不承认依赖列表的相等性,coq,proof,dependent-type,proof-of-correctness,church-encoding,Coq,Proof,Dependent Type,Proof Of Correctness,Church Encoding,我以前提过一个问题,但我认为这个问题形式化得不好,所以。。。 为了证明其属性,我在这一特定定义中遇到了一些问题: 我对列表有一个定义: Inductive list (A : Type) (f : A -> A -> A) : A -> Type := |Acons : forall {x : A} (y' : A) (cons' : list f x), list f (f x y') |Anil : forall (x: A) (y : A), list f (f

我以前提过一个问题,但我认为这个问题形式化得不好,所以。。。 为了证明其属性,我在这一特定定义中遇到了一些问题:

我对列表有一个定义:

Inductive list (A : Type) (f : A -> A -> A) : A -> Type :=
  |Acons : forall {x : A} (y' : A) (cons' : list f x), list f (f x y')
  |Anil : forall (x: A) (y : A), list f (f x y).
这就是定义:

Definition t_list (T : Type) := (T -> T -> T) -> T -> T.
Definition nil {A : Type} (f : A -> A -> A) (d : A) := d.
Definition cons {A : Type} (v' : A) (c_cons : t_list _) (f : A -> A -> A) (v'' : A) :=
  f (c_cons f v'') v'.

Fixpoint list_correspodence (A : Type) (v' : A) (z : A -> A -> A) (xs : list func v'):=
  let fix curry_list {y : A} {z' : A -> A -> A} (l : list z' y) := 
      match l with
        |Acons x y => cons x (curry_list y)
        |Anil _ _ y  => cons y nil
      end in (@curry_list _ _ xs) z (let fix minimal_case {y' : A} {functor : A -> A -> A} (a : list functor y') {struct a} :=
                                    match a with
                                      |Acons x y => minimal_case y
                                      |Anil _ x _ => x
                                    end in minimal_case xs).

Theorem z_next_list_coorresp : forall {A} (z : A -> A -> A) (x y' : A) (x' : list z x), z (list_correspodence x') y' = list_correspodence (Acons y' x').
intros.
generalize (Acons y' x').
intros.
unfold list_correspodence.
(*reflexivity should works ?*)
Qed.
z_next_list_coorres实际上是一个引理,我需要用另一个理论证明一个目标v''u list x=list\u correspodence x

我一直在尝试用一些有限的范围来证明列表对应关系,并且效果很好,似乎定义是相等的,但对于coq来说不是。

这里列表对应关系是一个虚假的不动点,也就是说,修复它不进行递归调用,这阻碍了减少

您可以通过破坏其递减参数强制减少修复:

destruct x'.
- reflexivity.
- reflexivity.
或者,您可以首先避免使用Fixpoint。用定义代替

在这里,您可能会遇到隐式参数的奇怪错误,可以通过如下添加类型签名或不标记本地函数curry_list的隐式参数来避免:


由于某种原因,重复使用变量A作为类型和列表使我很难理解这个程序。将curry_list和minimal_case提升为顶级固定点,而不是像这里这样使它们成为本地函数,这也将有助于可读性。这不是我第一次遇到类型签名泄漏的问题,我认为我应该不再使用类型推断。我忘了把这个取下来。非常感谢你。我感谢你的奉献精神。
Definition list_correspodence (A : Type) (v' : A) (func : A -> A -> A) (xs : list func v')
  : A :=
 (* ^ add this *)