这是我关于回文的归纳定义:
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] ).
我想证明的定理来自Software Foundations:
Theorem rev_eq_pal : forall ( X : Type ) ( l : list X ),
l = rev l -> pal l.
我的证明的非正式概述如下:
假设
l0
是一个任意列表,满足l0 = rev l0
。那么以下三种情况之一必定成立。对于l0
:(a) 元素个数为零,则根据定义它是一个回文。
(b) 元素个数为一,则根据定义它也是一个回文。
(c) 元素个数大于等于二,则存在某个元素
x
和某个列表l1
,使得l0 = x :: l1 ++ [x]
,且满足l1 = rev l1
。现在,由于
l1 = rev l1
,以下三种情况之一必定成立...由于每次迭代分析的列表长度都会减少 2,因此递归情况分析将终止任何有限列表
l0
。如果它对于任何列表ln
终止,那么从l0
到ln
的所有外部列表也均为回文,因为通过在回文两端添加两个相同的元素构造出的列表也是回文。
我认为这个推理是正确的,但我不确定如何将其形式化。它可以转变成 Coq 中的一个证明吗?对所使用的策略进行一些解释将特别有帮助。