我有一个已经被证明的证明。
Lemma Equal_Trans : forall T : Type, forall y x z: T,
Equal x y -> Equal y z -> Equal x z.
其次,我对加法可交换性证明进行了修正。
Lemma Add_com : forall x x': Nat, Equal (Add x x') (Add x' x).
Proof.
intros.
induction x.
simpl.
apply Add_zero.
simpl.
apply (Equal_Trans Nat (S (Add x' x)) ). (* var y *)
apply Equal_Morph.
assumption.
apply Add_S.
Qed.
但是,我不了解Equal_trans的用法(第8行)。据我了解,Equal_Trans接受3个参数:y x z?但是,为什么在Add_com引理中只有1个使用Equal_Trans的参数?
预先感谢您的帮助。
答案 0 :(得分:1)
策略apply
试图填充空白以使提供的术语类型与目标匹配。在这种情况下,目标(使用战术时)可能类似于a = b
(根据您的跟踪,实际上是Equal a b
)。 Equal_Trans
的类型(当使用所有参数时)为x = z
(Equal x z
),因此,为了统一这两种类型,我们应分别使用x := a
和{{1} }。只会使z := b
含糊不清,因此我们必须提供它。
要解决您的问题,不,y
不能仅将 用作一个参数。它需要一个类型(在您的情况下为Equal_Trans
),该类型的三个元素(Nat
,y
和x
)和两个相等证明。但是,请记住,Coq中的函数是经过咖喱处理的,这意味着您可以使用更少的参数来调用它们,但是结果将是其余参数的函数。
实际上,当我们说z
时,是说“拿起类型为apply (Equal_Trans Nat (S (Add x' x)).
的东西,并尝试填写一些参数以使其与我的目标相匹配”。
Coq查看该类型并意识到目标已经看起来像forall (x z: Nat), Equal x (S (Add x' x)) -> Equal (S (Add x' x)) z -> Equal x z
,因此可以推断出Equal x z
和x
的含义。 z
仍然接受Coq无法自行解决的两个论点(Equal_Trans
和Equal x y
的证明),因此其余的证明正在做。 >
我们在Equal y z
中使用传递性,因为我们可以使用归纳假设(y := S (Add x' x)
)来证明Equal (S (Add x x')) (S (Add x' x))
。我们也可以使用IHx
的定义来证明Equal (S (Add x' x)) (Add x' (S x))
。因此,自然通过Add
传递平等证明。
现在,我们还没有使用S (Add x' x)
的可传递性。我们可以证明y := S (Add x' x)
和(S (Add x x'))
都等于(Add x' (S x))
的其他元素。但是最简单,最直接的路线是通过Nat
。
答案 1 :(得分:0)
非常感谢您的帮助。
据我了解,Equal_trans仅接受1个参数,y参数?
但是,在执行命令apply (Equal_Trans Nat (S (Add x' x)) )
之前,CoqIDE告诉我:
1 subgoal
x, x' : Nat
IHx : Equal (Add x x') (Add x' x)
______________________________________(1/1)
Equal (S (Add x x')) (Add x' (S x))
我不明白为什么,在这里,我必须使用y:= S(加x'x)来应用Equal_trans吗?