【问题标题】:Boolean equality of lists in Coq?Coq中列表的布尔相等?
【发布时间】:2018-04-25 07:56:44
【问题描述】:

我希望能够在 Coq 中比较两个“列表”类型的项目,并得到一个布尔值“真”或“假”来表示它们的等价性。

现在,我正在这样比较两个列表:

Eval vm_compute in (list 1 = list 2). 

我得到一个形式的 Prop:

= nil
   :: (2 :: 3 :: nil)
      :: (2 :: nil)
         :: (3 :: nil) :: nil =
   nil
   :: (2 :: 3 :: nil)
      :: (2 :: nil)
         :: (3 :: nil) :: nil
 : Prop

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

【问题讨论】:

  • 您对list 做出了自己的定义吗?通常它是一个类型构造函数,这样list nat 是数字列表的type。但是您似乎将它用作(值)构造函数,创建了一个具体的列表,所以您一定是自己编造了一些东西,对吧?
  • 请注意,= 返回一个 Prop,这与布尔值不同。 This answer 更详细地解释了这个问题。

标签: coq


【解决方案1】:

我使用Mathematical Components Library boolean equality operators

From mathcomp Require Import all_ssreflect.

...

Eval vm_compute in list 1 == list 2

【讨论】:

  • 在我的一个证明的上下文中,我有H0 : (a1 == a2) = true。我应该如何在证明中交替使用a1a2?我的意思是我应该如何将这个假设更改为a1=a2。例如,我应该如何根据假设将equalityfunction a1 b=true 之类的目标更改为equalityfunction a2 b=true
  • 这对我有用。我很感激。我想知道您是否参考了学习 Mathcomp 的好资源。
  • 数学比较书是主要参考资料。
【解决方案2】:

您可以使用 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}

如果底层类型相等与莱布尼茨相等一致,则表明列表相等是可判定的。

【讨论】:

  • 请注意,您可以通过编写 Scheme Equality for list. 让 Coq 为您生成大部分内容
  • 谢谢。我不知道Scheme Equality。我会相应地更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2017-12-18
  • 2017-02-14
  • 2015-03-18
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多