Coq 不承认依赖列表的相等性
Coq doesn't recognize equality of dependent list
我之前提过一个问题,但我认为这个问题形式化不好,所以...
我在使用这个特定定义来证明它们的属性时遇到了一些问题:
我有一个列表的定义:
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'_list x = (list_correspodence x)).
我一直在尝试在一些有限的范围内证明 list_correspodence 并且效果很好,似乎定义是平等的,但对于 coq 不是。
这里的 list_correspondence
是一个虚假的 Fixpoint
(即 fix
)(它不进行递归调用),这妨碍了减少。
您可以通过破坏递减参数来强制缩减 fix
:
destruct x'.
- reflexivity.
- reflexivity.
或者您可以首先避免使用 Fixpoint
。请改用 Definition
。
你可能 运行 在这里遇到一个带有隐式参数的奇怪错误,可以通过添加类型签名(如下所示)或不将局部函数的参数标记为隐式来避免 curry_list
:
Definition list_correspodence (A : Type) (v' : A) (func : A -> A -> A) (xs : list func v')
: A :=
(* ^ add this *)
我之前提过一个问题,但我认为这个问题形式化不好,所以... 我在使用这个特定定义来证明它们的属性时遇到了一些问题:
我有一个列表的定义:
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'_list x = (list_correspodence x)).
我一直在尝试在一些有限的范围内证明 list_correspodence 并且效果很好,似乎定义是平等的,但对于 coq 不是。
这里的 list_correspondence
是一个虚假的 Fixpoint
(即 fix
)(它不进行递归调用),这妨碍了减少。
您可以通过破坏递减参数来强制缩减 fix
:
destruct x'.
- reflexivity.
- reflexivity.
或者您可以首先避免使用 Fixpoint
。请改用 Definition
。
你可能 运行 在这里遇到一个带有隐式参数的奇怪错误,可以通过添加类型签名(如下所示)或不将局部函数的参数标记为隐式来避免 curry_list
:
Definition list_correspodence (A : Type) (v' : A) (func : A -> A -> A) (xs : list func v')
: A :=
(* ^ add this *)