【发布时间】:2017-10-05 15:08:15
【问题描述】:
我从 Coq 开始,发现我必须提供可判定相等性的证明才能使用 List.remove。例如
Require Import Coq.Lists.List.
Import List.ListNotations.
Inductive T : Set := A | B | C.
Lemma eq_dec : forall a b : T, {a = b} + {a <> b}.
Proof.
destruct a, b; try (left; reflexivity); try (right; congruence).
Qed.
Definition f (xs : list T) : list T := List.remove eq_dec A xs.
现在可以进行类型检查,但我不明白如何使用它。
Theorem foo : f [ A; B; C ] = [ B; C ].
Proof. reflexivity.
给我
Error: Unable to unify "[B; C]" with "f [A; B; C]".
这种可判定的平等是如何工作的,我可以阅读哪些好的资料?
编辑 1
我刚刚了解了decide equality 策略,
解决
forall x y:R, {x=y}+{~x=y}形式的目标,其中 R 是 归纳类型,使得它的构造函数不采取证明或 作为参数的函数,也不是依赖类型中的对象。
所以eq_dec可以改写:
Lemma eq_dec : forall a b : T, {a = b} + {a <> b}.
Proof. decide equality. Defined.
编辑 2
我刚刚了解了Scheme Equality for T 命令,它
尝试生成布尔等式和可判定性证明 通常的平等。如果 identi 涉及其他一些归纳类型, 必须首先定义它们的相等性。
所以T_beq : T -> T -> bool和T_eq_dec : forall x y : T, {x = y} + {x <> y}可以自动生成。
【问题讨论】:
标签: coq