【发布时间】:2014-08-13 08:08:55
【问题描述】:
这是我对回文的归纳定义:
Inductive pal { X : Type } : list X -> Prop :=
| pal0 : pal []
| pal1 : forall ( x : X ), pal [x]
| pal2 : forall ( x : X ) ( l : list X ), pal l -> pal ( x :: l ++ [x] ).
以及我想证明的定理,来自软件基础:
Theorem rev_eq_pal : forall ( X : Type ) ( l : list X ),
l = rev l -> pal l.
我的证明的非正式大纲如下:
假设
l0是一个任意列表,例如l0 = rev l0。那么以下三种情况之一必须成立。l0有:(a) 零个元素,在这种情况下,根据定义它是回文。
(b) 一个元素,在这种情况下,根据定义它也是一个回文。
(c) 两个或更多元素,在这种情况下,
l0 = x :: l1 ++ [x]用于某些元素x和某些列表l1使得l1 = rev l1。现在,由于
l1 = rev l1,以下三种情况之一必须成立……对于任何有限列表
l0,递归案例分析将终止,因为分析的列表的长度在每次迭代中都会减少 2。如果它对任何列表ln终止,则其直到l0的所有外部列表也是回文,因为通过在回文的任一端附加两个相同元素构造的列表也是回文。
我认为推理是合理的,但我不确定如何将其正式化。它可以在 Coq 中变成证明吗?对所使用的策略如何起作用的一些解释将特别有帮助。
【问题讨论】:
标签: coq palindrome theorem-proving logical-foundations