gpt4 book ai didi

record - Coq:是否可以证明,如果两条记录不同,那么它们的一个字段也不同?

转载 作者:行者123 更新时间:2023-12-01 00:23:38 24 4
gpt4 key购买 nike

假设你有一个记录:

Record Example := {
fieldA : nat;
fieldB : nat
}.

我们能否证明:
Lemma record_difference : forall (e1 e2 : Example),
e1 <> e2 ->
(fieldA e1 <> fieldA e2)
\/
(fieldB e1 <> fieldB e2).

如果是这样,如何?

一方面,它看起来是真的,因为 Record s 完全由它们的字段定义。另一方面,不知道是什么让 e1不同于 e2首先,我们应该如何决定要证明析取的哪一边?

作为比较,请注意,如果记录中只有一个字段,我们可以证明各自的引理:
Record SmallExample := {
field : nat
}.

Lemma record_dif_small : forall (e1 e2 : SmallExample),
e1 <> e2 -> field e1 <> field e2.
Proof.
unfold not; intros; apply H.
destruct e1; destruct e2; simpl in H0.
f_equal; auto.
Qed.

最佳答案

On the other, without knowing what made e1 different from e2 in the first place, how are we supposed to decide which side of the disjunction to prove?



这正是关键所在:我们需要弄清楚是什么让两个记录不同。我们可以通过测试是否 fieldA e1 = fieldA e2来做到这一点。 .
Require Import Coq.Arith.PeanoNat.

Record Example := {
fieldA : nat;
fieldB : nat
}.

Lemma record_difference : forall (e1 e2 : Example),
e1 <> e2 ->
(fieldA e1 <> fieldA e2)
\/
(fieldB e1 <> fieldB e2).
Proof.
intros [n1 m1] [n2 m2] He1e2; simpl.
destruct (Nat.eq_dec n1 n2) as [en|nen]; try now left.
right. intros em. congruence.
Qed.

在这里, Nat.eq_dec是标准库中的一个函数,它允许我们检查两个自然数是否相等:
Nat.eq_dec : forall n m, {n = m} + {n <> m}.
{P} + {~ P}符号表示一种特殊的 bool 值,它可以为您提供 P 的证明。或 ~ P当被破坏时,取决于它位于哪一侧。

值得通过这个证明来看看发生了什么。例如,在证明的第三行,执行 intros em导致以下目标。
n1, m1, n2, m2 : nat
He1e2 : {| fieldA := n1; fieldB := m1 |} <> {| fieldA := n2; fieldB := m2 |}
en : n1 = n2
em : m1 = m2
============================
False

enem成立,那么两条记录一定相等,矛盾 He1e2 . congruence tactic 只是指示 Coq 尝试自己解决这个问题。

编辑

有趣的是,如果没有可判定的平等,人们可以走多远。可以简单地证明以下类似的陈述:
forall (A B : Type) (p1 p2 : A * B),
p1 = p2 <-> fst p1 = fst p2 /\ snd p1 = snd p2.

通过对立,我们得到
forall (A B : Type) (p1 p2 : A * B),
p1 <> p2 <-> ~ (fst p1 = fst p2 /\ snd p1 = snd p2).

正是在这里,我们在没有可判定性假设的情况下陷入困境。德摩根定律将允许我们将右侧转换为形式 ~ P \/ ~ Q 的语句。 ;然而,他们的证明诉诸可判定性,这在 Coq 的构造逻辑中通常不可用。

关于record - Coq:是否可以证明,如果两条记录不同,那么它们的一个字段也不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46673164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com