Syntax 为什么带分号的证明不适用于句号?

Syntax 为什么带分号的证明不适用于句号?,syntax,coq,Syntax,Coq,以下证明在Coq中仓促给出: 我试着一步一步地写这篇文章来理解发生了什么,但是在解决了基本情况之后,归纳假设就不一样了!因此,战术失败: Lemma exercise6' : forall n m, add n (S m) = S (add n m). Proof. induction n. intros m. simpl. reflexivity. rewrite IHn. reflexivity. Qed. 它们在以“重写”开头的行失败,错误如下: 错误:在当前目标中未

以下证明在Coq中仓促给出:

我试着一步一步地写这篇文章来理解发生了什么,但是在解决了基本情况之后,归纳假设就不一样了!因此,战术失败:

Lemma exercise6' : forall n m, add n (S m) = S (add n m).
Proof.
  induction n.
  intros m.
  simpl.
  reflexivity.
  rewrite IHn. reflexivity.
Qed.
它们在以“重写”开头的行失败,错误如下:

错误:在当前目标中未找到与添加n(S?M1580)匹配的子项

为什么一步一步地编写相同的代码会失败?分号和句号有什么区别

此外,有没有一种方法可以让我快速查看Coq中给出的证明的逐步过程?

简言之:

  • 归纳法n
    生成2个子目标
  • A;B
    将策略
    B
    应用于
    A
在这里,
介绍m;simpl
应用于
归纳法生成的两个目标
。这意味着您可以通过在
重写之前插入额外的
简介m
和额外的
siml
来修复第二个脚本:

Lemma exercise6' : forall n m, add n (S m) = S (add n m).
Proof.
  induction n.
  intros m.
  simpl.
  reflexivity.
  intros m.
  simpl.
  rewrite IHn.
  reflexivity.
Qed.
顺便说一下,通过使用项目符号来划分各个子目标,您可以使校对脚本的结构更加清晰。这提供了以下两个脚本,您可以在
练习6
中看到
简介m;siml
在输入任一子目标之前执行,而在
练习6'
中,它们已被推入每个子目标:

Lemma exercise6 : forall n m, add n (S m) = S (add n m).
Proof.
  induction n; intros m; simpl.
  - reflexivity.
  - rewrite IHn; reflexivity.
Qed.

Lemma exercise6' : forall n m, add n (S m) = S (add n m).
Proof.
  induction n.
  - intros m.
    simpl.
    reflexivity.
  - intros m.
    simpl.
    rewrite IHn.
    reflexivity.
Qed.

对不起,我没看到!我猜当我搜索“分号”和“句号”时,它没有出现,因为答案的名称中有“;”和“.”。谢谢你的快速回答!我特别欣赏关于要点的提示——我想知道如何编写更可读的代码。不用麻烦了!我编辑了其他问题,在标题中添加了分号和句号。希望这将使它更容易发现在未来!
Lemma exercise6 : forall n m, add n (S m) = S (add n m).
Proof.
  induction n; intros m; simpl.
  - reflexivity.
  - rewrite IHn; reflexivity.
Qed.

Lemma exercise6' : forall n m, add n (S m) = S (add n m).
Proof.
  induction n.
  - intros m.
    simpl.
    reflexivity.
  - intros m.
    simpl.
    rewrite IHn.
    reflexivity.
Qed.