我希望能够在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?
答案 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相等,则表明列表相等是可判定的。