assert (goal) 没有错误,但 cut (goal) 有错误
no error with assert (goal) but error with cut (goal)
我很困惑为什么 assert 和 cut 在这种情况下表现不同。
我试图用 ssreflect seq 库来证明这个引理。
Lemma subseq_add_both: forall{A: eqType} (L1 L2: seq A) (a: A),
subseq L1 L2 -> subseq (a:: L1) (a :: L2).
Proof. intros.
assert (subseq [:: a] (a:: L2)).
以上工作正常。然而,
Lemma subseq_add_both: forall{A: eqType} (L1 L2: seq A) (a: A),
subseq L1 L2 -> subseq (a:: L1) (a :: L2).
Proof. intros.
cut (subseq [:: a] (a:: L2)).
产生错误
Error: Not a proposition or a type.
为什么会这样?我以为 assert 和 cut 都会以任意目标作为参数,但显然不是这样。这两种策略在他们致力于实现的目标方面有何不同?
谢谢。
这可能是一个错误。问题是 subseq
returns 是一个布尔值。您可以将其结果用作命题,因为 ssreflect 将 is_true b := b = true
声明为从 bool
到 Prop
的强制转换。我的猜测是 cut
没有应用这种强制转换,并且因为它得到的是布尔值而不是命题而感到困惑。
您可以通过显式强制转换来解决问题:
cut (is_true (subseq [:: a] (a:: L2))).
但是,由于您已经在使用 ssreflect,我建议使用 have
和 suffices
策略,而不是 assert
和 cut
。例如,
suffices : subseq [:: a] (a :: L2).
给你
2 subgoals (ID 279)
A : eqType
L1, L2 : seq A
a : A
H : subseq L1 L2
============================
subseq [:: a] (a :: L2) -> subseq (a :: L1) (a :: L2)
subgoal 2 (ID 280) is:
subseq [:: a] (a :: L2)
我很困惑为什么 assert 和 cut 在这种情况下表现不同。 我试图用 ssreflect seq 库来证明这个引理。
Lemma subseq_add_both: forall{A: eqType} (L1 L2: seq A) (a: A),
subseq L1 L2 -> subseq (a:: L1) (a :: L2).
Proof. intros.
assert (subseq [:: a] (a:: L2)).
以上工作正常。然而,
Lemma subseq_add_both: forall{A: eqType} (L1 L2: seq A) (a: A),
subseq L1 L2 -> subseq (a:: L1) (a :: L2).
Proof. intros.
cut (subseq [:: a] (a:: L2)).
产生错误
Error: Not a proposition or a type.
为什么会这样?我以为 assert 和 cut 都会以任意目标作为参数,但显然不是这样。这两种策略在他们致力于实现的目标方面有何不同?
谢谢。
这可能是一个错误。问题是 subseq
returns 是一个布尔值。您可以将其结果用作命题,因为 ssreflect 将 is_true b := b = true
声明为从 bool
到 Prop
的强制转换。我的猜测是 cut
没有应用这种强制转换,并且因为它得到的是布尔值而不是命题而感到困惑。
您可以通过显式强制转换来解决问题:
cut (is_true (subseq [:: a] (a:: L2))).
但是,由于您已经在使用 ssreflect,我建议使用 have
和 suffices
策略,而不是 assert
和 cut
。例如,
suffices : subseq [:: a] (a :: L2).
给你
2 subgoals (ID 279)
A : eqType
L1, L2 : seq A
a : A
H : subseq L1 L2
============================
subseq [:: a] (a :: L2) -> subseq (a :: L1) (a :: L2)
subgoal 2 (ID 280) is:
subseq [:: a] (a :: L2)