Coq中列表的布尔相等?

时间:2018-04-25 07:56:44

标签: 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 :: nil)
         :: (3 :: nil) :: nil
 : Prop

显然list1 = list2,那么如何让它返回true或false?

2 个答案:

答案 0 :(得分:3)

我使用Mathematical Components Library boolean equality operators

From mathcomp Require Import all_ssreflect.

...

Eval vm_compute in list 1 == list 2

答案 1 :(得分:-1)

您可以生成一个布尔列表相等函数,该函数使用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_beq是列表上的布尔相等函数,它将列表元素的比较函数作为第一个参数,然后是两个列表:

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}

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