Coq中列表的布尔等式?

Coq中列表的布尔等式?,coq,Coq,我希望能够比较Coq中类型为“list”的两个项,并获得布尔值“true”或“false”来表示它们的等价性 现在,我以这种方式比较这两个列表: Eval vm_compute in (list 1 = list 2). 我得到一个道具的形式: = nil :: (2 :: 3 :: nil) :: (2 :: nil) :: (3 :: nil) :: nil = nil :: (2 :: 3 :: nil) :: (2 :: n

我希望能够比较Coq中类型为“list”的两个项,并获得布尔值“true”或“false”来表示它们的等价性

现在,我以这种方式比较这两个列表:

Eval vm_compute in (list 1 = list 2). 
我得到一个道具的形式:

= nil
   :: (2 :: 3 :: nil)
      :: (2 :: nil)
         :: (3 :: nil) :: nil =
   nil
   :: (2 :: 3 :: nil)
      :: (2 :: nil)
         :: (3 :: nil) :: nil
 : Prop
显然,list1=list2,那么如何让它只返回true或false呢?

我使用:


您可以生成一个布尔列表相等函数,该函数使用Coq命令自动将元素上的布尔相等作为输入:

Require Import Coq.Lists.List Coq.Bool.Bool.

Import Coq.Lists.List.ListNotations.

Scheme Equality for list.
这张照片是:

list_beq is defined
list_eq_dec is defined
其中,
list\u beq
是列表上的一个布尔等式函数,它的第一个参数是列表元素的比较函数,然后是两个列表:

Print list_beq.
给予

给予

list\u eq\u dec
:对于所有(A:Type)(等式A:A->A->bool),
(对于所有xy:A,等式A×y=true->x=y)->
(对于所有xy:A,x=y->eq_A x y=true)->对于所有xy:list A,{x=y}+{x y}

如果基础类型相等与leibniz相等一致,则表明列表相等是可判定的。

您对
列表
有自己的定义吗?通常它是一个类型构造函数,
list nat
是数字列表的类型。但您似乎将其用作(值)构造函数,创建一个具体的列表,因此您必须自己编写一些东西,对吗?请注意,
=
返回一个
Prop
,这与布尔值不同。更详细地解释了这个问题。请注意,您可以通过编写
Scheme Equality for list来让Coq为您生成大部分内容。
谢谢。我不知道
方案平等性
。我将相应地更新我的答案。在我的一个证明的上下文中,我有
H0:(a1==a2)=true
。我应该如何在证明中互换使用
a1
a2
?我的意思是我应该如何把这个假设变成像
a1=a2
。例如,根据假设,我应该如何将目标(如
equalityfunction a1 b=true
更改为
equalityfunction a2 b=true
。@TomAnd.,mathcomp确实提供了非常好的支持,您可以使用例如
重写(eqP H0)
eqP
是一个引理,它将布尔等式与其命题对应项联系起来。这对我很有用。我很感激。我想知道你是否参考了一个学习数学竞赛的好资源。数学竞赛书是主要的参考资料。
Print list_beq.
list_beq = 
fun (A : Type) (eq_A : A -> A -> bool) =>
fix list_eqrec (X Y : list A) {struct X} : bool :=
  match X with
  | [] => match Y with
          | [] => true
          | _ :: _ => false
          end
  | x :: x0 => match Y with
               | [] => false
               | x1 :: x2 => eq_A x x1 && list_eqrec x0 x2
               end
  end
     : forall A : Type, (A -> A -> bool) -> list A -> list A -> bool
Check list_eq_dec
list_eq_dec
     : forall (A : Type) (eq_A : A -> A -> bool),
       (forall x y : A, eq_A x y = true -> x = y) ->
       (forall x y : A, x = y -> eq_A x y = true) -> forall x y : list A, {x =  y} + {x <> y}