在 Coq 中证明可逆列表是回文

2024-02-24

这是我对回文的归纳定义:

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是一个任意列表,使得l0 = rev l0。那么以下三种情况之一必须成立。l0 has:

(a) 零个元素,在这种情况下,根据定义它是回文。

(b) 一个元素,在这种情况下,根据定义它也是回文。

(c) 两个或更多元素,在这种情况下l0 = x :: l1 ++ [x]对于某些元素x和一些清单l1这样l1 = rev l1.

现在,自从l1 = rev l1,下列三种情况之一必须成立...

对于任何有限列表,递归案例分析都将终止l0因为每次迭代分析的列表长度都会减少 2。如果它终止于任何列表ln,其所有外部列表直到l0也是回文,因为通过在回文两端附加两个相同元素构建的列表也是回文。

我认为推理是合理的,但我不确定如何将其形式化。它可以在 Coq 中转化为证明吗?对所使用的策略如何发挥作用的一些解释会特别有帮助。


这是一个很好的例子,其中“直接”归纳根本不能很好地工作,因为您不是直接在尾部进行递归调用,而是在part尾巴的。在这种情况下,我通常建议用列表的长度来陈述你的引理,而不是在列表本身上。然后你可以专门化它。那会是这样的:

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.

如有需要,我可以为您提供更详细的帮助,只需发表评论即可。

祝你好运 !

V.

编辑:只是为了帮助您,我需要以下引理来证明这一点,您可能也需要它们。

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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Coq 中证明可逆列表是回文 的相关文章

  • 一种更好的算法来查找数字字符串的下一个回文

    首先这里有一个问题 如果从左到右和从右到左读取的正整数在十进制系统中的表示相同 则该正整数称为回文 对于给定的不超过1000000位的正整数K 将大于K的最小回文数的值写入输出 显示的数字始终不带前导零 输入 第一行包含整数 t 即测试用例
  • 有没有办法禁用 Coq 中的特定符号?

    我希望在 Coqide 中 证明状态不使用某种符号 但仍使用所有其他符号 这可能吗 据我在文档中的理解 这是不可能的 您也许可以使用打开 关闭范围 但我不确定它是否有效 因为明确指出只要有可能 符号将用于打印
  • Coq - 在 if ... then ... else 中使用 Prop (True | False)

    我对 Coq 有点陌生 我正在尝试实现插入排序的通用版本 我正在实现一个以比较器作为参数的模块 该 Comparator 实现了比较运算符 如 is eq is le is neq 等 在插入排序中 为了插入 我必须比较输入列表中的两个元素
  • 检查字符串是否为回文

    我有一个字符串作为输入 必须将字符串分成两个子字符串 如果左子串等于右子串 则执行一些逻辑 我怎样才能做到这一点 Sample public bool getStatus string myString 例子 myString ankYkn
  • 如何阅读 Coq 对 proj1_sig 的定义?

    In Coq sig定义为 Inductive sig A Type P A gt Prop Type exist forall x A P x gt sig P 我读为 sig P 是一种类型 其中 P 是一个接受 A 并返回 Prop
  • 如何查找 Coq 证明策略的定义或实现?

    我正在看this https github com coq coq blob cdfe69d6da6b32338ba74c9f599c74389089c9dd theories Numbers Natural Abstract NAdd v
  • 使用 prolog 显示布尔逻辑失败的原因

    假设我有以下布尔逻辑 Z A or B and A or C 是否可以使用序言 可能与某些库一起 来找出 Z 为假的原因并以以下格式返回答案 Z 为假 因为 A 或 b 和 c 为假 如果我替代some已知值 或全部 例如 c true 它
  • F# 中的命令式多态性

    OCaml 的 Hindley Milner 类型系统不允许命令式多态性 类似于 System F 除非通过最近对记录类型的扩展 这同样适用于 F 然而 有时需要将用命令式多态性 例如 Coq 编写的程序翻译成此类语言 Coq 的 OCam
  • `Set` 类型的具体示例是什么?`Set` 的含义是什么?

    我一直试图理解什么Set除了在 Adam Chlipala 的书中遇到它之后SO中的这个精彩讨论 https stackoverflow com questions 39601502 what exactly is a set in coq
  • 如何暂时禁用 Coq 中的符号

    当您熟悉项目时 符号很方便 但当您刚刚开始使用代码库时 符号可能会令人困惑 我知道你可以用白话关闭所有符号Set Printing All 但是 我想保留一些打印 例如隐式参数 全部打印如下 Require Import Utf8 core
  • 依赖类型的 Church 编码:从 Coq 到 Haskell

    在 Coq 中 我可以为长度为 n 的列表定义 Church 编码 Definition listn A Type nat gt Type fun m gt forall X nat gt Type X 0 gt forall m A gt
  • 如何一步步检查 Coq 中更复杂的策略的作用?

    我试图经历那些著名的和精彩的软件基础书籍 https softwarefoundations cis upenn edu lf current Basics html lab30但我举了一个例子simpl and reflexivity 只
  • 如何学习阿格达

    我正在努力学习agda 但是 我遇到了一个问题 我在 agda wiki 上找到的所有教程对我来说都太复杂了 并且涵盖了编程的不同方面 在并行阅读了 3 个关于 agda 的教程后 我能够编写简单的证明 但我仍然没有足够的知识来使用它来实现
  • Coq 中的案例分析证明

    我试图证明关于以下函数的命题 Program Fixpoint division m nat n nat measure m nat match lt nat 0 n with false gt 0 true gt match leq na
  • 递归函数:检查 Java 中的回文数

    我有一个类检查字符串是否是回文 我有两个问题 1 这是检查回文的最有效方法吗 2 这可以递归实现吗 public class Words public static boolean isPalindrome String word Stri
  • 优化两个三位数乘积的最大回文数?

    我正在研究一个面试问题 我被问到这个问题 我应该编写一个程序 从两个三位数的乘积中找到最大的回文数 这里是question https projecteuler net problem 4 我想出了这种从底部开始的蛮力方法 public c
  • “auto”如何与双条件(关闭)交互

    我注意到 那auto忽略双条件 这是一个简化的示例 Parameter A B Prop Parameter A iff B A lt gt B Theorem foo1 A gt B Proof intros H apply A iff
  • Coq:承认断言

    有没有办法在 Coq 中承认断言 假设我有一个这样的定理 Theorem test forall m n nat m n n m Proof intros n m assert H1 m m n m S n Admitted Abort 上
  • 证明依赖类型实例之间的相等性

    当尝试形式化对应于代数结构的类 例如所有幺半群的类 时 自然的设计是创建一个类型monoid a Type 作为对所有必需字段进行建模的产品类型 元素e a 一个操作员app a gt a gt a 证明幺半群定律得到满足等 在此过程中 我
  • 教 coq 检查终止

    Coq 与许多其他参数不同 它接受一个可选的显式参数 该参数可用于指示定点定义的递减结构 根据 Gallina 规范 1 3 4 Fixpoint ident params struct ident0 type0 term0 定义语法 但从

随机推荐