如何在 Coq 中使用归纳类型来处理案例

2023-11-22

我想使用destruct通过案例来证明陈述的策略。我在网上读了几个例子,但我很困惑。有人可以更好地解释一下吗?

这是一个小例子(还有其他方法可以解决它,但尝试使用destruct):

 Inductive three := zero 
                  | one 
                  | two.
 Lemma has2b2: forall a:three, a<>zero /\ a<>one -> a=two.

现在网上的一些示例建议执行以下操作:

intros. destruct a.

在这种情况下我得到:

3 subgoals H : zero <> zero /\ zero <> one
______________________________________(1/3) 
zero = two

______________________________________(2/3) 
one = two

______________________________________(3/3) 
two = two

所以,我想证明前两种情况是不可能的。但机器将它们列为子目标并希望我证明它们......这是不可能的。

概括: 如何准确剔除不可能的情况?

我见过一些使用的例子inversion但我不明白这个程序。

最后,如果我的引理取决于几种归纳类型并且我仍然想涵盖所有情况,会发生什么?


如何排除不可能的情况?嗯,确实前两项义务无法证明,但请注意它们有相互矛盾的假设(zero <> zero and one <> one, 分别)。所以你将能够证明这些目标tauto(如果您有兴趣,还有更原始的策略可以达到目的)。

inversion是 destruct 的更高级版本。除了“破坏”归纳法之外,它有时还会生成一些等式(您可能需要)。它本身是一个简单版本induction,这还会为您生成一个归纳假设。

如果您的目标中有多种归纳类型,您可以destruct/invert他们一一。

更详细的演练:

Inductive three := zero | one | two .

Lemma test : forall a, a <> zero /\ a <> one -> a = two.
Proof.
  intros a H.
  destruct H. (* to get two parts of conjunction *)
  destruct a. (* case analysis on 'a' *)
(* low-level proof *)
  compute in H. (* to see through the '<>' notation *)
  elimtype False. (* meaning: assumptions are contradictory, I can prove False from them *)
  apply H.
  reflexivity.
(* can as well be handled with more high-level tactics *)
  firstorder.
(* the "proper" case *)
  reflexivity.
Qed.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Coq 中使用归纳类型来处理案例 的相关文章

  • 计算进行时显示进度条

    我正在编写代码来计算 Pi 的值 有时可能需要很长时间才能计算 我添加了一个进度条来显示进度 但代码完全按照我的指示执行 它在计算后打开进度条 然后立即关闭它 当值达到 100 时它会关闭 我试图将进度条的代码粘贴到循环中 但很快我意识到这
  • 网格中最大的产品

    我被这个问题困扰了 我确实认为我已经找到了正确的解决方案 但是当将其提交到网站时 它不接受 我尝试通过打印所有可能的组合来调试它 它们都完成了 水平 垂直和对角线 数组也被正确填充 我后来打印出来检查了一下 你知道问题可能出在哪里吗 Que
  • 依赖类型的 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
  • C++ 查找单词中的 Anagrams

    我正在开发一个程序 该程序使用以下命令来检查特定单词是否是字谜词std count但是 我认为我的功能逻辑不正确 而且我似乎无法弄清楚 假设文件中有以下单词 Evil Vile Veil Live 我的代码如下 include
  • oracle sql 日期不晚于今天

    我需要显示一些数据 如果它是 新数据 更新数据 比方说 我将从发布日期列和更新列中获取这些数据 其中发布日期和更新日期都是时间戳 那么如果是新的日期如何计算呢 过去 24 小时 Where publish date gt sysdate 1
  • Coq QArith 除以零就是零,为什么?

    我注意到在 Coq 的有理数定义中 零的倒数被定义为零 通常 除以零是没有明确定义 合法 允许的 Require Import QArith Lemma inv zero is zero 0 0 Proof unfold Qeq refle
  • Unity3D 中 Update() 循环方法内的执行顺序

    我正在尝试找到合适的词语来描述我遇到的问题 希望这能解释问题 我有两个Update 两个不同类中的方法 并且一个类中的某些功能依赖于另一个类中的数据 代码 A 依赖于代码 B 的数据 使用调试日志 我发现代码B的Update 在代码 A 之
  • Coq:添加“强归纳”策略

    对自然数的 强 或 完全 归纳意味着当证明 n 上的归纳步骤时 您可以假设该属性对于任何 k 都成立 Theorem strong induction forall P nat gt Prop forall n nat forall k n
  • 如何匹配 Coq 中的特定值?

    我正在尝试实现一个函数 该函数可以简单地计算包中某些 nat 的出现次数 只是列表的同义词 这就是我想做的 但它不起作用 Require Import Coq Lists List Import ListNotations Definiti
  • Verilog 中的 If 语句和分配连线

    我试图弄清楚基于组合逻辑分配电线的基础知识 I have wire val wire x wire a wire b always begin if val 00 I want to assign x a if val 01 I want
  • 按位运算的替代方法

    设想 我说有 4 个复选框 用户可以以任意组合选择这些复选框 他们也有权不选择任何一个复选框 我必须将这 4 个选项存储到一列中 我认为最好的选择是使用二进制表示形式存储 option1 has the constant value 1 o
  • 如何使用 Fitch 系统证明 ((p ⇒ q) ⇒ p) ⇒ p

    仅供参考 我使用的逻辑程序无法进行矛盾引入 这一点很可能是无关紧要的 因为我非常怀疑我是否需要使用任何形式的矛盾来证明这一点 在尝试解决这个问题时 我首先假设 p q p 它是否正确 如果是这样 接下来怎么办 如果解决方案看起来如此明显 请
  • 我如何编写行为类似于“破坏...作为”的策略?

    在coq中 destruct https coq inria fr distrib current refman Reference Manual010 html hevea tactic65策略有一个接受 连接析取引入模式 的变体 该模式
  • 没有可判定的相等性或排除中间值的鸽巢证明

    在软件基础中IndProp v https softwarefoundations cis upenn edu lf current IndProp html lab244一个人被要求证明鸽巢原理 并且可以使用排除中间 但有人提到这并不是绝
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • JQuery .hasClass 用于 if 语句中的多个值

    我有一个简单的 if 语句 if html hasClass m320 do stuff 这按预期工作 但是 我想添加更多的类if statement检查是否存在任何类标签 我需要它 所以它不是全部 而只是至少一个类的存在 但它可以更多 我
  • 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 证明幺半群定律得到满足等 在此过程中 我
  • 逻辑编程帮助

    A if infos 空和inputs empty 删除 B if infos空和inputs 空的 添加 C if infos 空和inputs 等于信息 添加 我们可以有这样的 if B it s the most common ope
  • Prolog 否定和逻辑否定

    假设我们有以下程序 a tom v pat 和查询 返回 false a X v X 当追踪时 我可以看到X被实例化为tom 谓词a tom 成功 因此 a tom fails 我在一些教程中读到 不 在Prolog中只是一个测试 不会导致

随机推荐