这是我对回文的归纳定义:
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。如果它终止于任何 listln
,则它的所有外部列表l0
也是回文,因为通过在回文的任一端附加两个相同元素构造的列表也是回文。
我认为推理是合理的,但我不确定如何将其正式化。它可以在 Coq 中变成证明吗?对所使用的策略如何起作用的一些解释将特别有帮助。