Coq中不可转换项上的态射集形

我在Coq中有以下功能。现在我想定义一个实例,如下所示。在我的例子中,定义了[nat]类型上的等价[==],但没有定义[StringMap.tstring.t]类型上的等价。如果您正确解决了安装问题,请联系我们。谢谢 Definition SC (u: nat) (zm: StringMap.t String.t): StringMap.t String.t := match u with | S p => match p with | 2

有没有办法禁用Coq中的特定符号?

在Coqide中,我希望证明状态不使用特定的符号(但仍然使用所有其他符号) 这可能吗?根据我在文档中的理解,这是不可能的。您可能可以使用打开/关闭作用域,但我不确定它是否会起作用,因为有明确规定,只要有可能,将使用符号进行打印。这里介绍了一些可能足够的技巧: 我想添加指向该答案的指针,因为这个问题首先出现在谷歌上。很好的尝试,但这些技巧不足以具体解决问题。

Coq 为什么不';难道不记得这些战术是按文件记录的那样起作用的吗?

在交互式证明中,我试图将表达式提取到新变量中,同时将等式作为新的证明项捕获 这一策略似乎就是为了这个目的而设计的。由于我喜欢为引入的名称指定明确的名称,因此我更喜欢使用以下变体: 记住术语作为ident eqn:ident 这表现为记住术语为ident,但也给出了生成的相等项的名称 但是,当我尝试它(或其他记住变体)时,我只得到以下错误: > remember (prefix ++ suffix) as the_environment eqn:H_prefix_suffix. >

与布里-富提悖论类似的Coq?

我刚从CMU HoTT讲座中了解到,尽管检查类型在Coq中返回类型:类型,但左侧和右侧的类型s由不同的数字隐式索引,因为如果它们相同,则会导致与布里阿里-富提悖论的类型理论类似。如果您试图实现这样一个悖论,Coq将拒绝编译 我对Coq脚本中的这个悖论很好奇,但找不到任何代码。一些讨论提到了B.Barras的“布隆迪富提悖论在coq中的形式化”,但与它的联系被打破了。这个悖论有Coq实现吗?快速查看后,也没有找到Barras的论文。然而,您可以在Coqtests套件中找到这种悖论的一些实例。我不知

在COQ中展开两个递归函数的证明

我已经开始学习Coq,并试图证明一件似乎相当简单的事情:如果一个列表包含x,那么该列表中x的实例数将>0 我定义了contains和count函数,如下所示: Fixpoint contains (n: nat) (l: list nat) : Prop := match l with | nil => False | h :: t => if beq_nat h n then True else contains n t end. Fixpoint count (

如何在Coq中创建元组并将其用作新的数据类型

我试图将以下ML代码作为Coq代码来编写:(此ML代码来自Ryheard和Burstall的《计算范畴理论》一书) 这就是我想到的: Definition setArrow := (Set, Set -> Set, Set). Definition setSource (arrow: setArrow ): Set := match arrow with |(a,b,c) => a end. 这就是出现的错误: Error: The term "setA

如何在coq中定义有限域

我试图在证明检查器coq中定义一个域。我该怎么做 我正在尝试做[0,10]中的V 我试着做了Definition V:=对于R中的所有V,0一个简单的方法可能是 Require Import Omega. Inductive V : Set := mkV : forall (v:nat), 0 <= v /\ v <= 10 -> V. Lemma member0 : V. Proof. apply (mkV 0). omega. Qed. Definition in

Coq 对变量应用减缩 我们假设我是一个证据,我有这样的假设: a : nat b : nat c : nat H : somePred a b

somePred的定义是: Definition somePred (p:nat) (q:nat) : Prop := forall (x : nat), P(x, p, q). 如何将H应用于c并获得p(c,a,b)?答案是: specialize H with c. 如何获取变量H:somePred a b?是不是应该是H:Prop?@AaditMShah,我试图证明类似于forall(a:nat)(b:nat)(c:nat)(somePred a b)->的东西,所以我用了简介a b

在Coq中展开证明项

我想知道是否有一种方法可以在当前上下文之外的某个级别(或者仅仅是原语)获得证明项(通过打印序列化或不序列化)。例如,执行以下命令 From mathcomp Require Import odd_order.PFsection14. Print Feit_Thompson. 导致 Feit_Thompson = fun (gT : fingroup.FinGroup.type) (G : fingroup.group_of (gT:=gT) (ssreflect.Pha

在使用程序执行递归函数时,Coq从if语句中丢失信息

我想在Coq中尽可能简单和“自然地”编写这个gcd的递归变量 Require Import Arith. Require Import Program. Program Fixpoint gcd (a b:nat) {measure b} := if 0 <? b then gcd b (a mod b) else a. Next Obligation. (* Here I need to prove that `a mod b < b` *) apply Nat.mo

Coq 在假设中应用依赖类型构造函数

考虑以下归纳定义: Inductive T (n : nat) : nat -> Prop := | c1 : T n n. 这项工作: Theorem a : T 1 1. Proof. apply c1. Qed. 但这并不是: Theorem b : T 1 1 -> True. Proof. intros H. apply c1 in H. 对apply的两个调用似乎对我来说都是等效的,但后者由于错误:没有假设的语句而失败。为什么?我怎样才能让它起作

Coq 什么是Parigot-Mendler编码?

某些Cedille源中使用了以下NAT编码: cNat : ★ cNat = ∀ X : ★ . X ➔ (∀ R : ★ . (R ➔ X) ➔ R ➔ X) ➔ X cZ : cNat cZ = Λ X . λ z . λ s . z cS : ∀ A : ★ . (A ➔ cNat) ➔ A ➔ cNat cS = Λ A . λ e . λ d . Λ X . λ z . λ s . s · A (λ a . e a · X z s) d 我想知道这是否是其他语言(Agda、Idr

Coq正向推理:应用多个假设

我有两个假设,我想用正向推理来应用一个定理,这两个定理都用到了 我的具体情况是我有假设 H0 : a + b = c + d H1 : e + f = g + h 我想应用标准库中的定理: f_equal2_mult : forall x1 y1 x2 y2 : nat, x1 = y1 -> x2 = y2 -> x1 * x2 = y1 * y2 现在我知道我可以手动给出x1、y1、x2、y2的值,但我希望Coq在与H0和H1统一时自动确定这些值。我发现我可以让它像

Coq泛型中的花括号

以下代码给出了一个错误: Inductive mylist {A : Set} : Set := | mylist_Nil | mylist_Cons : A -> mylist A -> mylist A. 错误是“集合”类型的“mylist A”不能应用于术语“A”:“集合”。 如果我将“{A:Set}”更改为(A:Set),那么它工作正常 花括号是什么意思?谢谢 通常,参数是用括号声明的。大括号用于隐式参数。隐式参数不像通常的那样传递给函数和类型声明;相反,Coq类型检查器试

Coq 逻辑:In_app_iff exercize

试图解决逻辑第一章中的In_app_iff练习,得出了这个怪物: (* Lemma used later *) Lemma list_nil_app : forall (A : Type) (l : list A), l ++ [] = l. Proof. intros A l. induction l as [| n l' IHl']. - simpl. reflexivity. - simpl. rewrite -> IHl'. reflexivity. Qed.

Coq 不带基数参数的类型不等式

如何让Coq证明句法类型不等式 否定单价 我读过的答案表明,如果你假设单价,那么证明类型不等式的唯一方法就是通过基数参数 我的理解是——如果Coq的逻辑与单价相一致,那么它也应该与单价的否定相一致。虽然我认为单价的否定实际上是一些同构类型是不相等的,但我相信应该可以表示没有同构类型(不相同的)是相等的 类型构造函数的不等式 实际上,我希望Coq将类型和类型构造函数视为归纳定义,并做一个典型的反转风格的参数来说明我的两个非常明显不同的类型是不相等的 能做到吗?这需要: 可用于具体类型,即无类型变量

如果一个归纳类型的两个构造函数表达式在Coq中相等,我可以根据它们相应的参数进行重写吗?

我有一个4元组归纳类型,如下所示: Inductive my_tuple := | abcd : byte -> nat -> byte -> nat -> my_tuple. 在我的背景下,我有以下几点: H : abcd b1 n1 b2 n2 = abcd b1' n1' b2' n2' 考虑到归纳类型的所有构造函数都是内射的和不相交的(也在讨论中),我想知道是否可以得出相应的参数是相等的(即,b1=b1',n1=n1',b2=b2',和n2=n2')然后使

Coq infotheo%B是真的

我用一个证明(Coq版本8.13.1,使用infotheo)击中了墙,其中上下文假设是目标,只是附加了一个“%B”。我知道这表明“是真的”,但如何进行证明 (unfold is_true不能删除“%B”,重写H和应用H不起作用) 非常感谢您的建议。%B表示这是在不同的范围内解析的。等号在H和目标中的意思有所不同。它是==vs=btw 您可以关闭注释以查看这两个术语的真正含义 很可能==弱于=。谢谢您的回答。 通过以下方法解决了该问题: move/eqP in H. apply H

Coq 在使用介绍模式时,是否可能保留原始假设

我有一个涉及相依对(sigT)的定理。其目标如下所示: -------------------------------------------- forall x : {x : G | P x}, mult1 sub_e x = x 当我运行intros[x Px]。时,以下内容被添加到上下文中: x : G Px : P x x : G Px : P x x_pair := exist P x Px : {x : G | P x} 是否可以将依赖对的变量作为一个整体保留?我必须运行set

Coq中的泛量化假设

我想改变下表中的假设H mL : Map mR : Map H : forall (k : RecType) (e : String.string), MapsTo k e (filter (is_vis_cookie l) mL) <-> MapsTo k e (filter (is_vis_cookie l) mR) ------------------------------------------------------- Goal mL:Map

Coq 如何自动生成";“好”;存在假设分解时的名称

我有一个存在假设,比如: H : exists (a : A) (b : B) (c : C), P a b c 我想将其分解为: a : A b : B c : C H0 : P a b c 策略分解[ex]H;清除H就是这样做的,只是变量的名称变为x,x0和x1,而不是a,b,c。有没有办法分解这个假设,自动生成“好”的名字(就像intros为所有(a:a)(b:b)(c:c),P a b c)的目标所采用的方法一样?可以手动给出名字 Goal forall (t : Type) (p

Coq自动简化类似于伊莎贝尔?

在Isabelle中,可以用“simp”属性标记形式为p=Q的事实(如定理)。然后,当证明事物时,“simp”和“auto”策略将使用这些事实将P的出现转换为Q Coq有类似的机制吗?您应该看看有关的文档,我认为这就是您要寻找的 我知道您可以将一些提示数据库提供给auto(使用hint Resolveiirc),但我不确定您是否可以使用autorewrite将自定义提示数据库提供给autorewrite:使用hint Rewrite。

查找定义和符号,如++;在Coq中

我们如何获得这些符号的定义/类型,如列表的“+”,或列表的“+” 我尝试过:Search++,Search++,Search(+++), 搜索关于…和 检查(+,检查“++”,检查(++) 但是,它们都不起作用 SearchAbout“++”确实显示了一些信息,但没有显示“++”的定义 Locate "++". 查找符号 然后您可以打印/检查所表示的实际术语。除了前面的答案之外,您还可以使用展开“+”展开其定义,而无需先定位它 例如: Coq < Goal forall A (l : l

在Coq中使用半环

这是一个简单的Coq语法新手问题。:) 我试图定义半环上的简单多项式函数: Require Import Vector. Import VectorNotations. Require Import Ring_theory. Section Polynomial_def. Variable Asring : Type. Variable (asr_0 asr_1 : Asring) (asr_add asr_mul: Asring->Asring->As

如何为Coq中的变量指定一个自然数?

如何将自然数分配给寄存器(寄存器由自然数表示) 例如,如何将自然数n加载到寄存器k? 如何比较两个自然数并分配给寄存器 我的想法是用n,k作为自然数来定义归纳类型,但我不确定构造器应该是什么样子 我在做一些事情,比如: Inductive assign (n, k : nat) Type := | load k => k | load k n => 一种方法是将所有寄存器的状态表示为从寄存器号到存储的自然数的函数。我们可以定义按自然数索引的寄存器类型,如下所示: Inductiv

Coq nat到bool不等式的一个简单(r)证明

在做的练习中,我需要一个推导,如下面的定理not_eq_nat_beq_nat_false所示。在与各种战术和标准定理斗争了一段时间后,我放弃了,并决定使用下面的定理 然而,我仍然觉得应该有一种更简单的方法来证明这一点。例如,它的双eq_nat__beq_nat_true就简单得多 Require Export Arith. Require Export Arith.EqNat. Theorem ex_falso_quodlibet : forall (P:Prop), False ->

Coq中的非结构化证明?

一个人能用非结构化的方法证明一个存在定理吗?具体地说,我在考虑有无理数的证明,s.t.x^y是有理的。对于这个特殊的证明,你需要假设排除的中间公理。您可以从库中导入它: Require Import Coq.Logic.Classical_Prop. About classic. 或者自己以某种特定的形式添加它(更高级的使用,因为它需要一些小心)。尽管如此,标准库中的实数已经是经典的,因此您可以从中推导出这个原理

在没有扩展函数相等的情况下在Coq中重新启动lambdas?

我正在复习软件基础。给出了列表反向函数的两种定义 Fixpoint rev (l:natlist) : natlist := match l with | nil => nil | h :: t => rev t ++ [h] end. 还有一个尾部递归: Fixpoint rev_append {X} (l1 l2 : list X) : list X := match l1 with | [] => l2 | x :: l1' =>

具有继承(:>;)的结构如何在Coq中工作?

我很难理解示例中(18.9)的机制(以及Coq中的强制) 在一篇关于MathClass的文章中,有一个例子是半环和交换幺半群之间具有继承(:>)的结构: Class SemiRing A {e: Equiv} {plus: RingPlus A} {mult: RingMult A} {zero: RingZero A} {one: RingOne A}: Prop := { semiring_mult_monoid:> CommutativeMonoid A (op:=mult

Coq环境的智能化改造

Ltac用于,和。它也可以用于Coq环境的“智能”修改吗?以下是两次失败的尝试: Variable Phy: Set. Fail Let pp (x:Type) := ltac: (match type of x with | Set => constr: (Reset Phy) | _ => idtac end). (*Cannot infer an internal placeholder of type "Type" in environment:

为什么倒置策略不';在以下Coq证明中不起作用?

调用反转H之前的环境: Require Import FMapAVL. Require Import OrderedTypeEx. Module M := FMapAVL.Make(Nat_as_OT). Fixpoint cc (n: nat) (c: M.t nat):bool := match M.find n c with | None => false | Some e => true end. Lemma l: forall (n: nat) (k:n

Coq 变数战术

假设我想有一个策略,一次清除多个假设,做一些类似于清除多个H1、H2、H3的事情。。我试着用成对的方式来做,如下所示: Ltac clear_multiple arg := match arg with | (?f, ?s) => clear s; clear_multiple f | ?f => clear f end. 但是,问题是我必须用括号来表示Prod: Variable A: Prop. Goal A -> A -> A -> True. intro

文章的coq编码同伦类型理论和Voevodsky';s单价基金会

我最近在读阿尔瓦罗·佩拉约,迈克尔·A·沃伦的文章。有一个配套文件。我用最新的coq verion 8.8.0编译了它,但遇到了一个错误。有人能帮我吗?提前感谢。此代码旨在使用自定义补丁版本的Coq 8.4或Coq 8.3构建,该版本禁用了universe checking;我记得当时和丹·格雷森或弗拉基米尔谈过,他们提到使用了这样一个补丁版本的Coq。(还要注意的是,该文件是2012年8月发布的,并且说Coq 8.4是在那个月发布的。)很不幸,你引用的文章似乎没有提到Coq的任何版本 在任何情

如何用Coq中的参数表示选择条件

我有以下代码: Definition trans := nat -> nat -> Prop. Definition ifelse (b : nat -> nat -> bool) (P Q : trans) : trans := fun s1 s2 => if b s1 s2 then P s1 s2 else Q s1 s2. ifelse表示如果布尔条件为真,则选择命题p s1 s2,否则建立命题Q s1 s2。布尔条件还取决于参数s1和s2 我想证明

将函数应用于Coq假设中等式的两侧

我的问题与下面的链接中的问题非常相似,但是是基于假设而不是目标 假设我有以下定义: Definition make_couple (a:nat) (b:nat) := (a, b). 用下面的引理来证明: a, b : nat H : (a, b) = make_couple a b ------------------------------- (some goal to prove) 我想提出以下假设: new_H : fst (a, b) = fst (make_couple a b

Coq 如何销毁表达式的值?

我正在学习Coq,并试图证明下一个看似简单的性质。 基本上,我需要考虑所有的情况下 EQB X y 。 但是我通常使用的destruct和inclusion策略在这里失败了 Fixpoint eqb (x:nat) (y: nat) :bool := match x,y with | 0, 0 => true | S xx, S yy => eqb xx yy | _,_ => false end. Definition bool_to_nat (b:bool) :nat :

Coq 如何证明平等是不可能的

(其中TApp为建造商) 在Idris中,这可以用\Refl=>不可能的来证明,但我还没有在Coq中写任何证明 有没有一个简单的方法来证明它?你可以通过归纳法a来证明它。。其思想是,Tipe的归纳原理编码了其值大小有限的事实,而TApp a b=a假设允许您构造一个无限值,但这些都是原始事实的间接结果,因此您需要为此付出一些努力。Coq的一个扩展来自动推导和使用这样的发生检查引理肯定是可能的 1 subgoal a, b : Tipe H : TApp a b = a _____________

Coq 如何处理需要相互递归的定理?

我遇到了一个需要相互递归才能解决的问题。我无法在Coq中实现这一点,但我怀疑在Agda中可能实现这一点,并使用两个相互递归的函数证明了这一点。我不确定我应该怎么做才能把这个解决方案带回Coq,谷歌搜索这个问题还没有找到任何解决方案 我的选择是什么 为了进一步激发这个问题,我想将Agda证明翻译成Coq。它证明了树行走和扁平计算器之间的函数等式 证明要求从堆栈中移除和添加到堆栈以相互递归的方式相互调用 open import Data.Product open import Data.Nat op

Coq Setoid重写要求平凡态射?

当我在目标U==U上调用setoid\U rewrite(kron\U 1\r U)时,我得到以下错误⊗ I 1(其中==为材料等效物和⊗是kron): 我试着证明Morphisms.Proper(mat_equiv===>flip impl)(mat_equiv U),这很简单-它源自于mat_equiv是一个等价关系(我已经声明过了) 你知道会发生什么事,我怎么解决吗 (相关的声明态射是从==和=到=的kron,以及从=到的混合态iff。后者在这里不明确,但我在前面的证明中使用了它,通常我可

(A->;B)/\(B->;C)>;(A->;C)在Coq中?

我通过《软件基础》一书学习Coq,在证明以下引理(我需要证明其他定理)时遇到困难 这就是我被卡住的地方。我不能对命题进行解构,虽然我可以在E1中应用E2,但它会生成两个子目标(我不明白为什么),第二个子目标在逻辑上是不正确的。请帮忙。此外,我只知道以下策略: 单纯形,自反性,对称性,破坏性,归纳,应用,替换。。in、exfalso、discriminate、injection、split、left、right、intros、unfold、assert、rewrite 问题2:另一个问题有点类似。

Coq 我可以介绍声音构造器等价吗?

假设我有一个归纳的类型 Inductive foo := | a : foo | b : foo | c : foo. 但我真正想要的是用c来“识别”b——也就是说,我希望能够将它们视为书写同一事物的两种不同方式——并且能够将其中一种重写为另一种 我可以把它作为一条公理来介绍: Axiom b_equiv_c : forall P : foo -> Prop, P b <-> P c. 然后让我来定义一个命题是否定义得很好 Definition wd_wrt_e

Coq 证明函数如何证明?

如果有人好心地向我解释在以下简单情况下如何使用证明函数,这将有助于我理解“程序/证明”的并行性: Theorem ex1: forall n:nat, 7*5 < n -> 6*6 <= n. Proof. intros. assumption. Qed. 证明功能: ex1 = fun (n : nat) (H : 7 * 5 < n) => H : forall n : nat, 7 * 5 < n -> 6 * 6 <=

关于Coq上我的归纳型的平凡定理

我定义了依赖类型和平凡引理,如下所示 Require Import Coq.Reals.Reals. Inductive Euc :nat -> Type:= |RO : Euc 0 |Rn : forall {n:nat}, R -> Euc n -> Euc (S n). Lemma ROEuc : forall t:(Euc 0), t = RO. Proof. intros. Admitted. 我不知道如何证明这一点。 Euc 0不是归纳类型,因此我不能使用de

Coq 为什么基于构造语言的微积分如此频繁地使用setoid?

人们发现SETOID广泛应用于Agda、Coq等语言中。。。事实上,像Lean这样的语言认为它们可以帮助避免“Setoid地狱”。首先使用setoid的原因是什么? 基于HoTT(如cubical Agda)的扩展类型理论是否减少了对setoid的需求?理想情况下,人们肯定希望能够将任意等价关系视为莱布尼兹等式(eq),从而能够在任意上下文中重写。这意味着通过等价关系定义类型的商 我不是这方面的专家,但我也一直在想同样的问题,我认为对setoid的依赖源于这样一个事实,即商在类型理论中仍然是一个

在Coq中写自然数的符号有困难

为什么Coq不接受这一点 Notation "[ d1 , .. , d2 ]" := (addition (multiply ( .. d1 .. ) ten) d2). 需要遵守相当严格的规则。要重复的模式必须出现两次(这就是Coq知道要重复什么的方式):一次在孔周围使用d2,一次在终止表达式周围使用d1。您只使用了一次图案,在孔周围使用了d2。您需要另一次迭代,大约是一些zero(比如列表符号中的nil) 如果不希望引入零,可以要求括号内至少有两位数字(而不是上面的一位),并将其用作终止

Coq Can';不要在归纳谓词上使用倒装

我被一个关于归纳谓词的简单证明难住了。我必须证明自然值0不是正的,其中自然值是位的列表,0是任何只有位为0的列表 H1: pos Empt ____________ (1/1) Nat 第章似乎建议我使用反转,但我收到了一条错误消息 Require Import Coq.Program.Program. Inductive Bit: Type := | Zer: Bit | One: Bit. Inductive List (type1: Type): Type := | Em

Coq sumbool和sum之间的差异

对于任何ab:Prop,sumbool ab和sumbool ab是同构的,如下所示: Definition from_sumbool (A B : Prop) (x : sumbool A B) : sum A B := match x with | left l => inl l | right r => inr r end. Definition to_sumbool (A B : Prop) (x : sum A B) : sumbool A B :=

如何用前面的引理适当简化coq目标?

为什么我的证明的最后一行没有删除一个继任者,而不是添加一个。 注意:我在教室外做这些练习,我不允许人们用它来欺骗硬件,我只是不知道还有什么地方可以问。 来自皮尔斯的战术章节 Theorem plus_n_n_injective : forall n m, n + n = m + m -> n = m. Proof. intros n. induction n as [| n']. intros. simpl in H. destruct m. ref

Coq 我们如何指定战术的执行时间

我想运用一种战术好几次。 例如,我想执行两次apply-lemma1,但不喜欢像apply-lemma1那样编写。应用引理1。有没有一个命令可以让我只应用两次apply-lemma1.?do2-apply-lemma1. 有一整页是关于战术组合以及如何创建新战术的:

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