Coq中列表的布尔等式?
我希望能够比较Coq中类型为“list”的两个项,并获得布尔值“true”或“false”来表示它们的等价性 现在,我以这种方式比较这两个列表: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
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}