- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我对回文的归纳定义:
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.
我的证明的非正式概要如下:
Suppose
l0
is an arbitrary list such thatl0 = rev l0
. Then one of the following three cases must hold.l0
has:(a) zero elements, in which case it is a palindrome by definition.
(b) one element, in which case it is also a palindrome by definition.
(c) two elements or more, in which case
l0 = x :: l1 ++ [x]
for some elementx
and some listl1
such thatl1 = rev l1
.Now, since
l1 = rev l1
, one of the following three cases must hold...The recursive case analysis will terminate for any finite list
l0
because the length of the list analyzed decreases by 2 through each iteration. If it terminates for any listln
, all of its outer lists up tol0
are also palindromes, since a list constructed by appending two identical elements at either end of a palindrome is also a palindrome.
我认为推理是合理的,但我不确定如何将其形式化。它可以在 Coq 中转化为证明吗?对所使用的策略如何发挥作用的一些解释会特别有帮助。
最佳答案
这是一个很好的例子,其中“直接”归纳根本不能很好地工作,因为您不是直接在尾部进行递归调用,而是在尾部的部分上进行递归调用。在这种情况下,我通常建议用列表的长度来陈述你的引理,而不是在列表本身上。然后你可以专门化它。那会是这样的:
Lemma rev_eq_pal_length: forall (X: Type) (n: nat) (l: list X), length l <= n -> l = rev l -> pal l.
Proof.
(* by induction on [n], not [l] *)
Qed.
Theorem rev_eq_pal: forall (X: Type) (l: list X), l = rev l -> pal l.
Proof.
(* apply the previous lemma with n = length l *)
Qed.
如有需要,我可以为您提供更详细的帮助,只需发表评论即可。
祝你好运!
五。
编辑:只是为了帮助您,我需要以下引理来证明这一点,您可能也需要它们。
Lemma tool : forall (X:Type) (l l': list X) (a b: X),
a :: l = l' ++ b :: nil -> (a = b /\ l = nil) \/ exists k, l = k ++ b :: nil.
Lemma tool2 : forall (X:Type) (l1 l2 : list X) (a b: X),
l1 ++ a :: nil = l2 ++ b :: nil -> a = b /\ l1 = l2.
关于coq - 在 Coq 中证明可逆列表是回文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24363319/
有人知道符合上述所有条件的算法吗?我需要指定一个种子编号,以及我希望输出数字落入的范围(这也是输入数字所在的范围)。这个函数还需要有一个反向操作的对应物。 例如: 我传递了种子 5 和范围 5-35,
如何使递归重命名操作(Linux,使用 python)可逆? 我想在Linux下使用python编写一个程序,该程序执行以下任务:批量递归重命名文件夹中的所有文件,如果文件名有子字符串X,则重命名为Y
我的数组中有三种颜色。最初,我被要求创建一个函数,该函数只需要第一个函数并将其附加到末尾或执行相反的操作,因此我创建了这个函数: // Get our colours var colours = sc
当我错误地删除了contenteditable div中的一些文本时,我可以使用Ctrl + z将其反转。 但是在我使用 javascript 做了一些改变之后。我无法使用 Ctrl + z 返回到之
我有一个 PHP 网络服务,它当前返回一个 zip 存档作为其唯一输出。我正在使用 file_get_contents 从磁盘读取 zip 存档并将其作为响应的主体发回。 我希望它以 JSON 格式返
让我解释一下:在我的用例中,系统为我提供了很多大小可以变化的字符串(字符数;长度),有时它可能非常大!问题是我必须将这个字符串保存在“SQL Server”数据库表的列中,坏消息是我不允许在这个数据库
我是一名优秀的程序员,十分优秀!