Logic coq(或一般)中的定理可以不用以前证明过的引理来证明吗?

Logic coq(或一般)中的定理可以不用以前证明过的引理来证明吗?,logic,coq,proof,Logic,Coq,Proof,考虑到coq中的证明只是可以以各种方式构建的高度复杂的函数,似乎有意义的是,每个定理都存在一个coq证明,它既不涉及先前证明的定理,也不涉及assert语句 例如,证明自然数加法的交换性很简单,没有任何引理,即使可以用引理简化: Theorem plus_comm' : forall n m : nat, n + m = m + n. Proof. induction n. intro m. simpl. induction m. reflexivity.

考虑到coq中的证明只是可以以各种方式构建的高度复杂的函数,似乎有意义的是,每个定理都存在一个coq证明,它既不涉及先前证明的定理,也不涉及
assert
语句

例如,证明自然数加法的交换性很简单,没有任何引理,即使可以用引理简化:

Theorem plus_comm' :
  forall n m : nat, n + m = m + n.
Proof.
  induction n.
    intro m. simpl. induction m.
      reflexivity.
      simpl. rewrite <- IHm. reflexivity.
    intro m. simpl. rewrite -> IHn. induction m.
      reflexivity.
      simpl. rewrite <- IHm. reflexivity.
Qed.
定理加上_comm':
对于所有n m:nat,n+m=m+n。
证明。
归纳法。
介绍m。简单。归纳法。
自反性。
简单。重写IHn。归纳法。
自反性。

简单。重写当然,有一个没有引理或断言的证明,只要有这样一个目标的证明,
m+(n+m*n)=n+(m+m*n)
。这里有一个,虽然不是很清楚:

remember (m*n) as o.
clear.
generalize dependent o.
generalize dependent m.
induction n; simpl; try reflexivity.
simpl.
intros m o.
rewrite <- (IHn m o).
remember (n+o) as p.
clear.
generalize dependent p.
induction m; simpl; try reflexivity.
intros p; rewrite (IHm p).
reflexivity.
记住(m*n)作为o。
清楚的
广义相依o。
广义相依m。
诱导n;单纯形;试试自反性。
简单。
介绍m o。
重写Coq的逻辑,这意味着任何涉及中间引理的证明(即带有beta重定义的lambda项)都可以通过简化算法转化为直接证明(即正规形式的项)

然而,这可能以指数膨胀为代价:例如,减少
幂2100
(如应用于
2
100
的函数
将产生一个大小为
2^100
的项,从大小为
1+2+100
的项开始)


如果您正在尝试编写校样搜索算法,您可能希望了解聚焦。鉴于您似乎想专注于归纳证明,您可能也想看看Boyer&Moore的prover。

感谢您为示例提供了证据,我没能想到这一点。我问这个问题的原因是因为我正在研究自动定理证明,并试图写一些策略,在不使用引理的情况下自动进行归纳证明,因此意识到我只是不够有创造性,这对我很有帮助。再次感谢。
remember (m*n) as o.
clear.
generalize dependent o.
generalize dependent m.
induction n; simpl; try reflexivity.
simpl.
intros m o.
rewrite <- (IHn m o).
remember (n+o) as p.
clear.
generalize dependent p.
induction m; simpl; try reflexivity.
intros p; rewrite (IHm p).
reflexivity.