Coq 我如何证明(eqb x y)表示x=y

Coq 我如何证明(eqb x y)表示x=y,coq,Coq,我是Coq的新手,这项任务应该很简单: forall x: nat, forall y: nat, x == y = true -> x = y 这是更大任务中的一小部分,但我一直坚持着。我知道反问题更容易解决。这表明这种问题很少见 罗德里戈评论后更新 通过对x进行归纳,然后对y 引理显而易见:forall x:nat,forall y:nat, 等式x y=true->x=y。 证明。 简介xyh。 感应x为[|x']。 (*情况x=0*) 破坏y。 (*情况y=0*) 自反性。(*

我是Coq的新手,这项任务应该很简单:

forall x: nat, forall y: nat,
x == y = true -> x = y
这是更大任务中的一小部分,但我一直坚持着。我知道反问题更容易解决。这表明这种问题很少见

罗德里戈评论后更新


通过对
x
进行归纳,然后对
y

引理显而易见:forall x:nat,forall y:nat, 等式x y=true->x=y。 证明。 简介xyh。 感应x为[|x']。 (*情况x=0*) 破坏y。 (*情况y=0*) 自反性。(* 0 = 0 *) (*情况y=sy'*) 反转H.(*0=sy',我无法解释在这种情况下我应该做什么*) (*情况x=sx'*) 破坏y。 (*情况y=0*) 反转H.(*sx'=0*) (*情况y=sy'*)
rewrite要解决数据类型构造函数之间这种不可能的相等,最好的策略是同余,它实现了一个称为同余闭包的决策过程。我已经证明了这个引理,没有放任何“格”


要解决这种数据类型构造函数之间不可能相等的问题,最好的策略是同余,即实现称为同余闭包的决策过程。我已经证明了这个引理,没有放任何“格”


在Coq中,用不同构造函数构造的两个术语定义为不同的术语,即所谓的莱布尼兹等式,
\u=\ ucode>使用的术语

对于
nat
值,
S
O
是不同的构造函数,因此
sn=O
永远不可能为真。对于
bool
true
false
是不同的构造函数,因此
true=false
永远不能为true

当你用
销毁
归纳
等方法对不可能的案例进行案例分析时,你会得到这些“非理性”假设

当您在证明上下文中得到这些类型的假设时,使用的策略是
一致性
。它定位了一个“坏”的假设,并证明它意味着目标,因为任何错误的假设都意味着任何命题

congrence
使用起来很方便,但您也可以“手工”创建验证术语。例如:

Goal  true <> false.
Proof.
    intro C.   (* now we have "C : true = false" in the context *)
    refine (match C with eq_refl => I end).
Qed.
目标为真为假。
证明。
简介C.(*现在我们在上下文*中有了“C:true=false”)
优化(将C与eq_refl=>I end匹配)。
Qed。

在Coq中,根据定义,由不同构造函数构造的两个术语是由所谓的莱布尼兹等式(Leibniz equality)定义的不同术语,即
\u=\ ucode>使用的术语

对于
nat
值,
S
O
是不同的构造函数,因此
sn=O
永远不可能为真。对于
bool
true
false
是不同的构造函数,因此
true=false
永远不能为true

当你用
销毁
归纳
等方法对不可能的案例进行案例分析时,你会得到这些“非理性”假设

当您在证明上下文中得到这些类型的假设时,使用的策略是
一致性
。它定位了一个“坏”的假设,并证明它意味着目标,因为任何错误的假设都意味着任何命题

congrence
使用起来很方便,但您也可以“手工”创建验证术语。例如:

Goal  true <> false.
Proof.
    intro C.   (* now we have "C : true = false" in the context *)
    refine (match C with eq_refl => I end).
Qed.
目标为真为假。
证明。
简介C.(*现在我们在上下文*中有了“C:true=false”)
优化(将C与eq_refl=>I end匹配)。
Qed。

通过在
x
上归纳,然后在
y
上进行案例分析,感谢您的回复。我添加了一些尝试。如果你能给出一些比倒装法更合适的策略,那就太好了。通过对
x
进行归纳,然后对
y
@RodrigoRibeiro进行案例分析,谢谢你的回答。我添加了一些尝试。如果你能给出一些比倒装更合适的战术,那就太好了。
Goal  true <> false.
Proof.
    intro C.   (* now we have "C : true = false" in the context *)
    refine (match C with eq_refl => I end).
Qed.