帮助进行子序列的Coq证明

我有定义的归纳类型: Inductive InL (A:Type) (y:A) : list A -> Prop := | InHead : forall xs:list A, InL y (cons y xs) | InTail : forall (x:A) (xs:list A), InL y xs -> InL y (cons x xs). Inductive SubSeq (A:Type) : list A -> list A -> Prop :=

Coq 共归纳和依赖类型

我正在尝试编写一个Coq函数,它接受一个流和一个谓词,并作为列表,返回属性所在流的最长前缀。这就是我所拥有的: Require Import List Streams. Require Import Lt. Import ListNotations. Local Open Scope list_scope. Section TakeWhile. Context {A : Type} {P : Stream A -> Prop}. Hypothesis decide_P : foral

关于Coq中的细化策略

考虑以下几行(以Coq为单位): 变量A:类型。 变量fg:A->A。 公理Hfg:forall x,fx=gx。 变量a:b:a。 公理t:ga=gb。 目标f a=g b。 策略refine(eq\u trans(Hfg\ut)解决了目标。也就是说,Coq能够在没有帮助的情况下用a替换孔。但是策略refine(eq\u trans(Hfg a)将上述目标替换为目标ga=gb 但是,Coq无法单独找到t。策略的Idem优化(eq\u trans(Hfg)\uq) Coq能够猜到第一个洞而不是

如何为coq销毁现有目标

这是一个有点通用,所以请随意询问细节,我简化了,使问题更容易沟通 说我的目标是 let (r,_) := f x in Q r 其中fx具有类型{u|pu} 我想“破坏”这个,这样我就有了qr 以pr作为假设作为目标。实现这一目标的最佳方式是什么? 在过去,我已经实现了我想要的 pose (f x). 然后简化 这里的每个请求都有一些简化的代码 Parameter T:Type. Parameter P:T -> Prop. Axiom A : {t:T|P t}. Definit

Coq 启用非指示集的大型类型上的反转

在我的设置中,我使用带有-impredicative set标志的Coq,并且在其构造函数中具有以下具有存在类型的数据类型 设置隐式参数。 归纳分机:集合:= |外部:对于所有(X:Set),X->ext。 然后我为我的数据类型定义一个等式 变量eqXY:forall X,X->X->Prop。 感应式均衡器外部:外部->外部->道具:= |均衡器外部:forall(X:集合) (x y:x), eqXY x y-> Eq_ext(ext_x)(ext_y)。 我喜欢我的等式是一种关系,因此

用Coq求解线性方程组

我需要证明这个方程组没有解(原因是它被过度确定)。有没有一种简单的方法可以在Coq中实现?也就是说,战术还是图书馆 Require Import Reals. Open Scope R. Lemma no_solution: forall b11 b12 b13 b14 b21 b22 b23 b24 b31 b32 b33 b34 r r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 : R, 1 = r * b11 + r0 * b21 + r

Coq 关于在定理中提取的类型类实例的推理?

我真正想要的是:因为我知道act解析为natListAction,所以我知道act=cons。因此,引理应该通过 如果我的Action类中没有someProof,那么我就可以展开natListAction了。但现在,我不能这样做 但是,在这种情况下,我如何说服coqact=cons?我在另一个SO线程上找到了答案: 用Qed结束Proof部分会使其不透明。相反,用定义的结束证明,证明将通过 为完整起见,以下是最终证明: Class Action (Actor: Type) (Acted: Typ

Coq 布尔函数的归纳定义

简单地说,我试图将自己的bool类型定义为: Inductive mybool : Type := | true | false. 然后我做一个“打印mybool”,但输出显示 Inductive mybool : Set := true : mybool | false : mybool. 为什么设置了“mybool”的类型而不是类型?Coq使用所谓的“宇宙最小化”将归纳类型放入最小的可能宇宙中。由于mybool不依赖于任何其他类型,也不进行任何通用量化,因此它可以安全地放

Coq 与萨姆布尔的宇宙不一致性

我定义并证明了以下引理: NM.In k m -> {NM.In k m0}+{NM.In k m1}. 我还可以证明一个对称引理: {NM.In k m0}+{NM.In k m1} -> NM.In k m 但是,当我尝试将它们合并为一个时: NM.In k m <-> {NM.In k m0}+{NM.In k m1}. 如何解决这个问题?正如Daniel指出的,问题在于,连接词只将命题作为参数,而sumbool生活在集合中。有几种方法

Coq 如何证明给定一个等式,一个字符串是它的反面,它的尾部也是它的反面?

这对我来说太直观了,以至于我无法在这方面取得任何进展。我从l上的归纳开始,使用自反性解决基本情况,然后立即陷入另一个问题 我到底错过了什么?我认为这不是真的。例如: Theorem rev_cons : forall X x (l : list X), x :: l = rev (x :: l) -> l = rev l. 我认为这不是真的。例如: Theorem rev_cons : forall X x (l : list X), x :: l = rev (x ::

Coq IndProp测试

这本书的作者为nostutter练习的一些单元测试提供了证据。不幸的是,他们没有解释他们是如何工作的。我能理解所有的证据,只有一个: Inductive nostutter {X:Type} : list X -> Prop := | ns_nil : nostutter [] | ns_one : forall (x : X), nostutter [x] | ns_cons: forall (x : X) (h : X) (t : list X), nostutter (h::t) -

Coq 是否有从假设中提取含义的策略(反转除外)?

假设我有以下目标: 在人眼看来,很明显,H最终为真的唯一方法是n为7或21。我想用“既然H需要n是7或21,那么目标必须是真的”来证明这一点 我的第一个猜测是使用“反转H”,但这只增加了另一个相同形式的假设。考虑到假设H的形状,我担心这里最好的策略是使用暴力:即使匹配以简洁的形状打印,它的计算就像是由22个嵌套模式匹配组成,如 H : match n with | 0 => false | S n1 => match n1 with | 0

Coq Elim与诱导

我想了解“elim”和“归纳法”在Coq上的用法。。。 为什么? 因为我试着做一些练习,不明白为什么有时我必须用“elim”而有时我必须用“归纳法” 例如: Lemma parte2_1_b : forall l, sum(rev l) = sum l. Proof. intro. induction l. simpl. reflexivity. simpl. SearchRewrite(_++_). SearchAbout(_++_). rewrite parte2_1_a. simpl. r

如果(和b c=orb b c)在coq中,我如何证明b=c?

我是coq的新手,我正试图证明这一点 Theorem andb_eq_orb : forall (b c : bool), (andb b c = orb b c) -> (b = c). 这是我的证明,但当我到达目标时,我会被卡住(false=true->false=true) 我不确定我将如何重写这个表达式,以便使用反身性。但即使我这样做,我也不确定这是否会带来证据 如果我从假设b=c开始,我就能够解决这个问题。即 Theorem andb_eq_orb_rev : fo

info_自动战术在Coq8.5中不再打印痕迹?

我曾经使用info\u auto来显示通过auto策略在发动机罩下实际执行的步骤。然而,这似乎不再适用于Coq 8.5(beta3) 以下示例用于Coq 8.4: Example auto_example_5: 2 = 2. Proof. info_auto. Qed. 并给我一些必要的步骤,比如apply@eq\u refl. 使用Coq8.5,我得到一个警告: The "info_auto" tactic does not print traces anymore. Use "Info

Coq中部分计算目标的策略

我有目标 quad X Y ,但我不记得“quad”的定义,也不想开始搜索它的定义 有没有一种策略可以让我快速地用它的定义替换quad Record quad (X Y:Type):= { x:X; y:Y}. 或者我必须记住并使用 refine (@Build_quad _ _). ?你有点错误,Build\u quad不是quad的定义,而是它的构造函数。它创建类型为quad的术语。 正如@ejgallego所说,在这种情况下,您应该使用构造函数策略 您的目标是提供一个类型为quad

Coq 8.5pl1中的细化和@(at)符号

在以前版本的Coq中,使用symbol@In refine命令可以让我一步一步地创建一个prove。(每个论点都是一个单独的目标。) 我希望避免像“?目标0?目标1”这样的隐式参数。现在我不能。 我该怎么做才能获得这种可能性 (这对我来说非常不舒服,尤其是当我试图处理递归函数时。)您正在寻找简单优化 在8.5中,可以通过统一(您称之为隐式)解决的目标被放在“搁置”的隐藏区域中,因为它们被认为是微不足道的。您可以使用unshelve取消搁置它们,但这是一个本地命令,有点不方便 simple ref

Coq 如何在通用量化下捕获参数(使用模块?部分?)

我想知道在Coq中如何最好地处理这种情况: 假设我需要定义和证明一个任意结构的一些东西(为了讨论的目的,让我们假设一个具有二元关系的集合)。当然,我始终可以提供集合和关系作为每个此类定义/证明的参数: Inductive star (X : Set) (R : X -> X -> Prop) := ... Lemma star_trans (X : Set) (R : X -> X -> Prop) : ... 当然,过了一段时间,这会让人厌烦。我想做的是将X和R作为

Coq 为示例提供节参数

考虑这一节: Section MyMap. Variables D R : Type. Fixpoint mymap (f : D -> R) (l : list D) : list R := match l with | nil => nil | d :: t => f d :: mymap f t end. End MyMap. 在这里,我使用了变量来声明我的域和范围类型。作为对我的函数定义的合理性检查,我想包括一个示例: Example examp

如何将Idris/Agda/Coq中的类型映射为值?

我试图定义一个名为byteWidth的函数,它捕获了关于“获取特定原子类型的字节宽度”的用法 我的第一次审判: byteWidth : Type -> Int byteWidth Int = 8 byteWidth Char = 1 Idris编译器抱怨:“当检查字节宽度的左侧时:左侧没有显式类型:Int” 我的第二次审判: interface BW a where byteWidth : a -> Int implementation BW Int where by

Coq 归纳类型中多态性的不同处理方法

在定义归纳类型时,将事物放在冒号之前或之后有根本区别吗?在我看来,这主要是一个句法方便的问题。例如,这4个多态列表定义对我来说基本上是一样的: Inductive list1 : Type -> Type := | Nil1 : forall (X : Type), list1 X | Cons1 : forall (X : Type), X -> list1 X -> list1 X. Inductive list2 (X : Type) : Type := |

Coq中推送/弹出评估器产生的奇怪证明义务

我试图用Coq定义一种简单的基于堆栈的语言。目前,指令集包含推送nat的push,以及弹出nat的指令pop。其思想是程序是独立类型的程序2是一个程序,执行后在堆栈上留下两个元素 这是通过以下简单程序实现的: 需要导入Coq.Vectors.VectorDef。 感应程序:nat->类型:= |推送:forall n:nat,nat->Prog n->Prog(SN) |pop:forall n:nat,Prog(sn)->Prog n。 固定点评估(n:nat)(p:Prog n):t nat

以coq为单位计算可判定属性中的if

我想写一个计算p0真值计数的函数。。p t在nat->prop函数中 Section count\u sc。 变量p:nat->Prop。 假设p_dec:forall x:nat,{px}+{~px}。 固定点计数(x:nat):= 将x与 |0=>如果p_dec(0),则1否则0 |sy=>如果p_dec(x),则1+计数y,否则计数y 结束。 结束计数。 定义fret(x:nat):=假。 检查计数。 公理fret_dec:forall x:nat,{fret x}+{~fret x}。

在coq中如何证明强排序列表?

我正在尝试制作一个Coq河内校样塔作为学习练习。经过数小时徒劳的尝试后,我的第一次证明中的最后一个目标被卡住了 你能解释一下我的程序失败的原因,以及如何纠正它吗 编辑:回顾代码,似乎我需要证明StronglySorted le(l:list nat)才能证明有序堆叠,不是吗 Require Import List. Require Import Arith. Require Import Coq.Sorting.Sorting. Definition stack_disk := fun (

防止在Coq中应用后意外展开

我的符号在应用后被无意中展开。 我不想每次使用modus ponens时,都把这个小例子文本最后一行的策略称为“更改”。 如何禁止Coq展开我的符号“(a'='b)” 需要导出Coq.Vectors.Vector。 导入矢量符号。 归纳术语:类型:= FVC:nat->术语。 定义Fo:=nat。 上下文(axs0:nat->Type)。 上下文(Atom:Vector.t Terms 2->Fo)。 符号“(a'='b)”:=(原子[a:术语;b:术语])。 符号“(A-->B)”:=(A+B

->;在Coq中

我试图证明Coq命题中->的及物性: Theorem implies_trans : forall P Q R : Prop, (P -> Q) -> (Q -> R) -> (P -> R). Proof. 我想破坏所有命题,简单地用反身性处理所有8种可能性。显然,事情没那么简单。 以下是我尝试过的: Theorem implies_trans : forall P Q R : Prop, (P -> Q) -> (Q -> R) -&

Coq 用mathcomp实例化Zn的交换环

我能够创建一个ComRingMixin,但是当我试图将此类型声明为规范环时,Coq抱怨: x:phantom(GRing.Zmodule.class_of?bT)(GRing.Zmodule.class?bT) 术语“x”的类型为“幻影(GRing.Zmodule.class_of?bT)(GRing.Zmodule.class?bT)” 而预计其类型为“幻影(GRing.Zmodule.class_'I_n)?b” 这就是我到目前为止所拥有的,我能够定义操作并实例化阿贝尔组mixin以及规范声

在经过验证的软件工具链中,我如何指定一些不是函数体的Clight,以及我';我是从Coq内部生成的?

我想编写一个Gallina函数,其类型类似于gen\u code:Foo->statement,然后证明它生成的代码满足特定的规范。我心里确实有一个非正式的霍尔三元组;然而,我对VST还不是非常熟悉,我也不确定如何将其转化为框架可以使用的东西。我想我想要一个关于所有{spect:OracleKind}(foo:foo),semax?Delta(pfoo)(gen_-code-foo)(normal_-ret-assert(qfoo))的形式的定理,在这里我知道P和Q是什么,但我不确定?Delta

Coq 可判定子集类型术语的简单语法

我有一个BoundedNat n类型,表示小于n的自然数。我目前的执行情况如下: Definition BoundedNat n := {x : nat | x < n}. BoundedNat n类型的操纵元素相对较重。我经常需要使用exist n ltac:lia进行包装,并使用proj1_sig元素进行展开。如何才能最好地利用基础类型的符号、等式、排序等?尽管您肯定可以使用自己的有界自然数实现,但我强烈建议您重用现有的有界自然数实现。我最喜欢的库是ssreflect。它包含一个与f

Coq 从其他文件引用类型变量时出错

我正在coq中研究群体理论的形式化。我有两个文件: v-包含群的定义和定理 群_Z.v-包含Z群的定理和定义 第五组: Require Import Coq.Setoids.Setoid. Require Import Coq.Lists.List. Require Import PeanoNat. Class Semigroup G : Type := { mult : G -> G -> G; assoc : forall x y z:G,

Coq 添加不在当前假设中的假设

我有证据,在我的假设中,我有: ... l0 : list (list (ATrs.rule (Sig a)) * boolean * option (list positiveInteger) * option cpf.dpProof) H: forall x : list (ATrs.rule (Sig a)) * bool * option (list positiveInteger) * option cp

Coq Isabelle/HOL-Isar中的假假设证明

我试图证明一个引理,它在某一部分有一个错误的假设。在Coq中,我曾经写过“一致性”,它会消除目标。然而,我不知道如何在伊莎贝尔·伊萨尔身上继续下去。我试图证明一个关于我的le函数的引理: primrec le::"nat ⇒ nat ⇒ bool" where "le 0 n = True" | "le (Suc k) n = (case n of 0 ⇒ False | Suc j ⇒ le k j)" lemma def_le: "le a b = True ⟷ (∃k. a + k =

Coq 清除列表但只清除一个元素的函数的幂等性证明

我是一个初学者,我一直在用Coq证明nat的列表 我有一个nat的listreg和一个函数clear\u regs,它将每个值都更改为0,并保持第三个值(索引2)不变 我想显示对于所有regs,clear\u regs regs=clear\u regs(clear\u regs regs) 我目前有两个功能,但我不知道其中一个是否比另一个更好 (1) 第一个是用一个辅助递归函数定义的,该函数取一个(降序)索引并检查它是否是第三个值。如果是这种情况,它将保留其值,否则它将生成一个0 (2) 第二

具有依赖类型coq的构造函数的等式

我有以下设置(抱歉,如果MCVE有点长),我试图证明最后一个定理,但我陷入了困境,因为它无法统一态射的类型,因为它们依赖于理论上不同的对象类型,即使对象类型相同 是否有一个通用的策略来分解具有依赖类型的构造函数注入和反转产生了似乎无用的结果,与ob\u fn(我可以很容易地证明等价定理)有关,而不是morph\u fn Inductive Cat := cons_cat (O : Type) (M : O -> O -> Type). Definition ob (c : Cat)

Coq 使用eq_refl获得一个;x=x";假设

简言之,这可能吗 我想证明取消在团体中有效 我有 a, b, x : G H: a <+> x = b <+> x 我的想法是得到一个假设 H2: a <+> x <+> i x = a <+> x <+> i x 但是这似乎不起作用。如果你的目标真的像你发布的那样,那么你的策略应该失败,因为它重复使用了名称H。如果这不是问题,那么了解Coq显示的错误消息将有所帮助。如果你的目标与你发布的目标非常相似,那么你的策略应该失

Coq 即使对称,右侧也未简化

在开始讨论Coq和“软件基础”问题时,我遇到了以下示例: Theorem plus_O_n : forall n : nat, 0 + n = n. Proof. intros n. simpl. reflexivity. Qed. 事实证明这很好。然而,当我尝试右边的等式时 Theorem plus_n_O : forall n, n = n + 0. Proof. intros n. simpl. (* Doesn't do anything! *) 事实上,这是书中的一个练习

Coq第1.2.10项类型铸件

不确定以下内容在Coq手册v8.7.0中的含义: 表达式“term:type”是类型强制转换表达式。它将术语的类型强制为type “term据我所知,默认简化机制和VM简化机制旨在强制执行相同的键入规则 但它们的行为并不相同,因为对于某些计算,验证时间可能具有不同的数量级 这里有一个例子 Time Check (refl_equal 1 : (10 ^ 200 - 9 * 10 ^ 199) / 10 ^ 199 = 1). ... Finished transaction in 0.103

Coq Reals和SSR反射研磨

我想在Coq.Reals.Raxioms中定义的Reals上使用ssreflect引理。 我该怎么做 例如,我希望能够对类型为rdeffinations.R的变量直接使用add、mul等为ssralg.GRing.Ring定义的操作,并将Num.real\u closed\u公理直接应用于Coq reals 是否有必要证明从eqType、choice、zmodule等到ClosedReals的所有结构?如果是这样的话,肯定有人曾经这样做过,但我一直没能找到它。还有其他的发展我可以使用吗 如果不是

Coq 如何证明一阶语言的术语是有根据的?

目前,我已经开始在Coq()中证明关于一阶逻辑的定理。我已经证明了演绎定理,但后来我陷入了正确性定理的引理1。所以我已经简洁地描述了一个优雅的引理,我邀请社区来看看它。这是一个不完整的证据,证明了条款的充分性。如何正确地摆脱这对“承认”呢 (* PUBLIC DOMAIN *) Require Export Coq.Vectors.Vector. Require Export Coq.Lists.List. Require Import Bool.Bool. Require Import Log

Coq 注入策略能否修改最终目标,或添加无关的假设?

考虑以下发展,这是一个独立的部分: 请参阅内联注释-G在开始时匹配,并最终用于验证最终目标是否保持不变。这是否排除了injection H可能修改目标或添加额外假设的可能性?我认为您不能修改G,但您可以创建一个假设,从中injection将生成多个等式 我们定义了injectionCtx2,它与injectionCtx相同,只是它不使用G Ltac injectionInCtx2 := match goal with | [ H : ?F ?X = ?F ?Y |- _ ] =>

对Coq中的两个子目标使用相同的证明

在对归纳类型进行归纳之后,我有两个子目标要证明。假设和目标略有不同,但可以通过相同的(长)证明来解决,目前的证明如下: induction x. { admit. } { <long proof> } { <copy-paste of long proof> } 感应x。 { 承认 } { } { } 有没有一种方法可以避免这种复制粘贴并保持交互性,例如编写类似于以下内容的内容 induction x. { admit. } all: { <

Coq 主要证明的唯一性

对于具有可判定顺序的类型,是否存在等同于身份证明唯一性的等价物?特别是在Peano自然数的类型中?它是否在Coq的库中的某个地方实现?(我找不到) 这在自然数上似乎是正确的,因为我认为可判定运算符的类型不应该落在Prop中,而应该落在bool中,就像在Math Comp中所做的那样 这样,如果T->bool你很容易得到无关性 Lemma le_irrelevance m n le_mn1 le_mn2 : le_mn1 = le_mn2 :> (m <= n)%coq_nat. 引

Coq 小于等于函数

我正在通过coq课程。解决问题: 具有较少或相等的功能: Fixpoint leb (n m : nat) : bool := match n with | O => true | S n' => match m with | O => false | S m' => leb n' m' end end. Definition blt_nat (n m : nat) : bool (* REPLACE

Coq中模参数的特殊化

我有一个模块,我需要专门化它的一个参数。我想使用自然数,而不是任意的通常的decidabletypefull。我如何在Coq中获得这种行为 我定义了一些模块: Module PRO2PRE_mod (SetVars FuncSymb PredSymb PropSymb: UsualDecidableTypeFull). (* ... *) End PRO2PRE_mod. 然后我专门化了最后一个参数PropSymb Require Import Arith.PeanoNat. Module m

我如何在Coq中为西格玛类型做出示例?

对于该类型: Record Version := mkVersion { major : nat; minor : nat; branch : {b:nat| b > 0 /\ b <= 9}; hotfix : {h:nat| h > 0 /\ h < 8} }. 它失败的原因是: 术语“exist?p5”的类型为“?p5->{x:nat |?px}” 预期类型为“{b:nat | b>0/\b失败的原因是,您不仅需要提供证人(b和h,在本

Coq 如何证明相同的子目标

我有两个相同的子目标,如下所示: prove_me(x::xs)=true prove_me(x::xs)=true 证明将是平等的。如何使用第一个目标解决第二个目标?你不能在另一个目标上重复使用一个目标的证明,但你可以证明一个辅助引理: assert (H : prove_me (x::xs) = true). { (* proof of result *) } 然后,你可以使用H在两个子目标出现时完成它们。我同意你的观点。但是如果我们没有很好的证据。我指的是运用战术的顺序,最好写1,2:

Coq 无法使用依赖归纳法重命名对象?

在我的证明过程中,这是有效的 感应H1为[| | | | | | | |]. 但是,当我把它换成 相关感应H1为[| | | | | | | |]. 我得到“错误: 语法错误:[tractic:ltac\u use\u default]应在[tractic:tractic](在[vernac:tractic\u命令]中)之后。 " 在进行相依归纳时,你能认真地不选择变量的名称吗?那太疯狂了;我真的希望我只是把语法搞错了 谢谢。在阅读了Equality.v的代码之后,这里尝试定义一个表示从属归纳法

Coq VST中使用异构阵列验证程序

我正在验证一个使用数组存储异构数据的c程序——特别是,该程序使用数组实现cons单元格,其中数组的第一个元素是整数值,第二个元素是指向下一个cons单元格的指针 例如,此列表的自由操作为: void listfree(void * x) { if((x == 0)) { return; } else { void * n = *((void **)x + 1); listfree(n); free(x); return; } } 注意:此处未

  1    2   3   4   5   6  ... 下一页 最后一页 共 41 页