所以我在子目标中有一个错误的假设。这是不同构造函数之间的相等。如何完成子目标
H: List.Not_Empty Bit.Bit Bit.Zero (List.Empty Bit.Bit) = List.Empty Bit.Bit
这看起来不像我从标准库中习惯的Coq列表,因此如果不知道List.Not_Empty和List.Empty的定义,就很难帮助您。如果我猜对了List.Empty代表nil和List.Not_Empty代表cons,那么这只是表明这两个构造函数不相等的问题。例如,您可
我有一个函数f返回一对。然后我证明了关于它的一些结果。
在我的引理中,我第一次尝试得到每个组件是使用let(x,y):=fz In。但是,尝试使用这些引理似乎很麻烦apply不能直接工作,我必须使用pose-proof或其变体在假设中添加引理,然后析构函数f z才能使用它。有没有办法在引理中顺利地使用let-in?还是因为使用起来很痛苦而被劝阻
为了完成我的问题,下面是我写的关于f的引理的其他尝试。我试着直接使用fst(fz)和snd(fz),但我也发现它很麻烦。最后,我从所有xy,(x,y)=
我想在Coq中定义时间延迟的语法如下:
Inductive tcs : Type :=
| delay : nat -> tcs
| atomic : nat-> tcs.
但构造函数延迟中不允许使用自然数0。我还发现使用子集类型来定义语法。然而,子集类型的引入导致了定义语义的更多复杂性。有没有一种简单的方法来定义这样的sytax?在您的特殊情况下,我认为最简单的事情是更改延迟构造函数中数字的解释:注意nat通过后继函数同构于{n:nat | n>0}。因此,只要在匹配表达式中使用
我可以看到Coq定义引理的不同语法。例如,Lemma plus\u n\u O:forall n:nat,n=n+0。和Lemma plus\u n\u O n:n=n+0。都定义了任何数字的零和等于该数字。这些定义有何不同?或者,这是Coq的一个新特性,即从定义中删除所有量词。这两个定义本质上是等价的。一般来说,任何形式的陈述
Lemma foo x y z : P.
Proof.
(* ... *)
相当于
Lemma foo : forall x y z, P.
Proof.
intro
根据定义:
Definition cast (a b:Type) (p:a = b) (x:a) : b :=
match p with
| eq_refl _ => x
end.
我希望下面的引理是可以证明的:
Lemma cast_cast_is_id : forall (a b:Type) (x:a) (p:a = b) (q:b = a),
cast b a q (cast a b p x) = x.
然而,我似乎无法证明这一点。我可以成功地解
我想建立一种类型层次结构:
B is of type A ( B::A )
C and D are of type of B (C,D ::B)
E and F are of type of C (E,F ::C)
我问过这是否可以直接在Isabelle中实现,但你看到的答案是否定的。是否可以直接在Agda或Coq中编码
PS:假设A..F都是抽象的,并且在每种类型上定义了一些函数)
谢谢如果我正确理解了你的问题,你想要看起来像的东西。当我们声明类型构造函数时,我们提到了两
我在形式化以下形式的定义时遇到困难:定义一个整数,使某些属性保持不变
假设我正式定义了财产:
Definition IsGood (x : Z) : Prop := ...
现在我需要对表单进行定义:
Definition Good : Z := ...
假设我证明了具有该属性的整数存在且唯一:
Lemma Lemma_GoodExistsUnique : exists! (x : Z), IsGood x.
使用IsGood和Lemma\u GoodExistsUnique是否有一种定义
我试图用Coq证明以下引理:
Lemma not_eq_S2: forall m n, S m <> S n -> m <> n.
引理not_eq_S2:forall mn,sm sn->mn。
这似乎很容易,但我不知道如何完成证明。有人能帮我吗
谢谢。这真的很简单(但是否定让人有点困惑)
引理not_eq_S2:forall mn,sm sn->mn。
证明。
不要展开。(*|-…->False*)
简介m n H C.(*…,H:S m=S n->Fals
我对Coq中的证据和Prop等感到困惑。我们如何证明(n=n)=(m=m)
我的意图是要表明这在某种程度上是True=True。但这是正确的表述吗
到目前为止,我尝试的是:
Theorem test: forall m n:nat, (n = n) = (m = m).
Proof. intros. simpl.
但是simple.什么都不做,而且自反性也不做。这只是一个例子,一般来说,如果可能的话,我需要为任何类型的X证明这一点。如果不假设额外的公理,就不可能证明你的要求;cf..n=n和m
我有一个用Coq术语语言编写的“枚举”函数(它叫什么?)。使用此函数有点烦人,因为它要求在使用枚举函数时显式提供A(列表中元素的类型l)。是否有一种方法可以避免将a作为参数显式传递
(* [a, b] -> [(0,a), (1,b)] *)
Fixpoint enumerate (A : Type) (l : list A) : list (nat * A) :=
let empty : (list (nat * A)) := nil in
let incr_pair xy :=
我正在尝试自动决定ASCII字符是否为空白。这是我目前拥有的
Require Import Ascii String.
Scheme Equality for ascii.
Definition IsWhitespace (c : ascii) := (c = "009"%char) \/ (c = "032"%char).
Definition isWhitespace (c : ascii) : {IsWhitespace c} + {not (IsWhitespace c)}.
Pr
我想使用一个提示数据库,其中包含set引入的变量。比如说,
Example foo : forall n : nat, n + n = n + n.
Proof.
intro.
set (m := n + n).
Hint Unfold m.
但是,科克说:
错误:在当前环境中找不到引用m
有没有办法做到这一点,还是不可能
我使用的是Coq 8.7。不可能像您建议的那样执行此操作,因为使用Qed完成foo后,局部变量m将超出范围,但提示会直接进入某个全局数据库
但是,您可以使用节机
当使用TypeClass时,Coq有时会出现分歧。当这种情况在Proof General下发生时,Emacs也挂起
我知道的最好的恢复方法是中断emacs(C-g)并重新启动Coq(C-C-x)。但是,这并不是简单地终止Coq进程,而是让我处于一种模式,Emacs再次被挂起,在相当长的一段时间内显示“收回缓冲区…”(有时是如此之长,以至于我放弃了,只是开始了一个全新的Emacs!)
为什么?
有更好的办法吗?(还有:当这种情况发生时,是否有一个简单的第一步来观察什么是首先发散的?我不知道这是否真
标签: Coq
proofdeterministicformal-verificationpartial-ordering
我曾定义过一种归纳数据类型t,并在其上定义了一个偏序le(c.f.le\u refl,le\u trans,以及le\u antisym)。在le_C的情况下,顺序具有这种特殊性,即在归纳假设中参数的顺序被交换
正因为如此,我没有成功地证明这种排序关系是确定性的(c.f.le_dec)。有问题的子目标如下
1 subgoal
t1 : t
IHt1 : forall t2 : t, {le t1 t2} + {~ le t1 t2}
t2 : t
________________________
我试图证明这一点:
Fixpoint max(a: nat)(b:nat): nat :=
if a <=? b then b
else a.
Example ex: forall n:nat, n = max n n.
Proof.
intros.
(...)
固定点最大值(a:nat)(b:nat):nat:=
如果一个存在一个固定点,即使函数不是递归的,这就是fix的来源。使用定义
fix仅当结构递减参数(此处为n,第一个)以构造函数开头时,才会减少。因此,如果你的函数真的是递归的
我对可能是假的引理感兴趣:
Lemma decideOr : forall (P Q : Prop),
(P \/ Q) -> {P} + {Q}.
这意味着我们可以通过算法来确定排序Prop中的或的任何证明。当然,Coq不允许我们在sortSet中对输入进行破坏以提取它。然而,P\/Q的证明是Coq接受打印的lambda术语,因此外部工具可以处理它
第一个问题:这个lambda项是否可以在Coq之外确定(假设该项不使用公理,只使用普通Coq)?可能是这样的,因为建构逻辑的规则要
当我写作时
“Print Qeq_trans.”在CoqIde中,我可以在消息窗口中看到许多“eq^~”表达式
例如,等式^~(Qnum z*QDen x*QDen y)%z
请告诉我这个术语的含义。我认为这是一种只将函数应用于第二个参数的方法。做一个
Locate "_ ^~ _".
获取定义。我认为这是一种仅将函数应用于其第二个参数的方法。做一个
Locate "_ ^~ _".
为了得到定义。的确,f^~x是funy=>fyx的确,f^~x是fu
我写了这个归纳谓词,并为其(强)规范提供了部分证明:
Inductive SumPairs : (nat*nat) -> list (nat*nat) -> Prop :=
| sp_base : SumPairs (0,0) nil
| sp_step : forall (l0:list (nat*nat)) (n0 n1: nat) (y:(nat*nat)), SumPairs (n0,n1) l0 -> SumPairs ((n0+(fst y)),(n1+(snd y
我在Coq中有以下定理:定理T:存在x:A,px。我希望能够在后续的证明中使用这个值。例如,我想说这样的话:“让o表示一个值,使得po。我知道o是通过定理T存在的。”
我该怎么做?
提前谢谢 从数学上讲,您需要为∃ 构造器。通用消除策略elim有效
elim T; intro o.
愚蠢的例子:
Parameter A : Prop.
Parameter P : A -> Prop.
Axiom T : exists x:A, P x.
Parameter G : Prop.
Axiom
我不太熟悉Coq中的模块或类型类,但基于我对它们的基本理解,我认为我在哪里应该使用它们存在问题
我想定义一个sum函数,用于添加多态列表t的所有元素。只有当列表的元素类型(t)对plus\u函数和plus\u id\u元素有一定的定义时,它才应该工作。我想写的sum的定义如下:
Fixpoint sum {t : Type} (l : list t) :=
match l with
| Nil => plus_id_element t
| Cons x xs => ((p
标签: Coq
prooftheorem-provingcoq-tactic
我试图理解在Coq中处理不等式的逻辑
当目标中存在时,执行简介相反。将目标更改为假,并将目标移动到假设,但切换为=。我想我理解它的声音。如果我有as目标AB,那么a=bas假设就会产生矛盾
然而,我不能在Coq做相反的事情。如果我把a=b作为目标,我就不能把False作为目标,把ab作为假设这个介绍是否合乎逻辑?是否仅仅因为不需要完成证明就不支持它?
当处于一个假设H中时,执行析构函数H.将删除该假设(我不能执行析构函数(H)eqn:H.),它会将任何目标切换到与H相同的目标,但将切换为=/c
从类型A到B的内射函数将不同的输入映射到不同的输出,但可能无法覆盖整个范围
e、 g
我想弄明白如何用Coq来表达这样的事情
我认为谈论这样一个对象的Coq方式应该是某种产品类型,其中一个元素是“原始”函数A->B本身,另一个是证明所述函数是内射的
我不知道如何用Coq的语法来表达这个。。。更具体地说,如何能够在同一“结构”中的类型定义中引用函数的名称,以及什么样的产品最合适
我试着把一些东西放在这里的Ellpise中,但无法捕获函数
Definition injection (A : Prop
我正在尝试使用此库中的引理eqbu sym:
我试过“需要导入Coq.Structures.Equalities.”和“需要导入BoolEqualityFacts”,但都没有让我使用引理eqbu-sym。Coq抱怨在当前环境中找不到引理。一般来说,当我从中的库中找到我想要使用的引理时,我在哪里找到要导入的正确模块,并且“Require import module Name”是使用它的正确方法?引理是在由BooleanEqualityType'类型的模块参数化的函子中定义的。要使用它,必须实例化
这个标题不言自明。
我想对列表使用标准的[]和+符号。但即使在进口后,它们也无法被识别。请参阅下面的代码
Require Import List.
Check [1].
这将导致以下错误消息:
Syntax error: [constr:lconstr] expected after 'Check' (in [vernac:query_command]).
因此,基本上,符号没有被认为是有效的构造函数。
相比之下,我可以使用Bool的|
我被难住了。请救救我 列表符号隐藏在两层模块中:
Re
标签: Coq
theorem-provingcoq-tacticreal-number
我是Coq的新手,我的主要兴趣是用它来做简单的实际分析问题。在第一个练习中,我成功地通过了一个证明,证明x^2+2x趋向于0,因为x趋向于0。请参阅下面的代码
这看起来相当笨拙,我想了解关于如何缩短此证明的任何一般性反馈,或者改进其可读性的良好实践。然而,我的主要问题是,是否有任何Coq策略用于自动化涉及实数的简单任务,如field和lra但更好
可能的示例1:是否有任何策略来证明来自Rbasic\u fun的函数的身份,例如绝对值?例如,我的证明有一半致力于证明| x*x |+| 2*x |=
我正在尝试实现一个函数extract,它将一个类似(f(gxy))的表达式与一个变量(例如y)结合在一起,并使用组合键生成一个函数y-->(f(gxy))。在这种情况下,结果应该是(S(kf)(gx))
从某种意义上说,我正在做一个从lambda术语到它的滑雪版本
我正试着做一个打字版,但我的日子不好过
设置
这些表达式中的类型由以下归纳类型表示
Inductive type : Type :=
| base_type : forall (n : nat), type
| arrow_t
约翰·梅杰的平等性具有以下重写引理:
Check JMeq_ind_r.
(*
JMeq_ind_r
: forall (A : Type) (x : A) (P : A -> Prop),
P x -> forall y : A, JMeq y x -> P y
*)
很容易这样概括:
Lemma JMeq_ind2_r
: forall (A:Type)(x:A)(P:forall C,C->Prop),
P A x
我有一个类似的代码
Definition even := {n : nat | exists k, n = k + k}.
Definition even_to_nat (e : even) : nat.
Admitted.
Coercion even_to_nat : even >-> nat.
Example Ex : forall n : even, exists k, k + k = n.
Admitted.
Example Ex2 : forall k, exist
在Coq中证明时,能够一次证明一个小部分是很好的,并且Coq可以帮助跟踪义务
Theorem ModusPonens: forall (A B : Prop), ((A -> B) /\ A) -> B.
Proof.
intros A B [H1 H2].
apply H1.
此时,我可以看到证明状态,以了解完成证明所需的内容:
context
H2: B
------
goal: B
但是,在编写Gallina时,我们是要一下子解决整个问题,还是要制作很多小助手函数?
我正在研究一位同事在Coq中嵌入模态逻辑,并试图为所述逻辑的公式定义一个自定义符号,就像《软件基础》一书的第2卷中介绍的那样。到目前为止,我有:
Declare Custom Entry modal.
Declare Scope modal_scope.
Notation "[! m !]" := m (at level 0, m custom modal at level 99) : modal_scope.
Notation " p -> q &q
我正在学习COQ,我被一个书本练习卡住了。这本书没有给我一个解决办法,所以我不知道该怎么办。不过我已经做了第一个。我必须将这些语句转换为谓词逻辑:
h0 : Everybody knows somebody
h1 : Nobody doesn't know anybody.
h2 : Everybody knows somebody
h3 : A footballer is known by everybody.
h4 : Footballers only kn
为什么Coq不接受这个引理作为提示
Lemma contr : forall p1 : Prop, False -> p1.
Proof. tauto. Qed.
Hint Resolve contr : Hints.
或者其他以Prop变量结尾的引理?查看文档中的提示解析:
然而,在我看来,这里的情况并非如此,因为唯一的乘积是p1以上,这确实出现在结论中
这里的问题似乎是你的结论完全没有形状。auto似乎通过将目标的形状与提示数据库的返回类型的形状相匹配来工作。在这里,它可能会因为你
我为编译器定义了几种归纳类型,我正在验证这种形式
Inductive types := Int | Char | Symbol | Bool.
Inductive val : types -> Type :=
| T : val Bool
| F : val Bool
| Num : nat -> val Int
...
Inductive exp : types -> Type :=
| If : forall {t}, val Bool -> exp t -
这是我在数学定理中使用的归纳类型
Inductive pc ( n : nat ) : Type :=
| pcs : forall ( m : nat ), m < n -> pc n
| pcm : pc n -> pc n -> pc n.
一个归纳定义的命题包含包含n x t表示树t至少包含一次x:pc n
Inductive contains ( n : nat ) ( x : pc n ) : pc_tree -> Prop :=
| co
假设我想证明p:A->(B/\C)。在介绍之后。拆分。,Coq生成两个子目标,其中我分别证明B和C,以A为前提。假设我已经证明了第一个子目标并进入了第二个子目标。是否有某种方法来引入先前已被证明的子目标,以便在上下文中使用B
一个显而易见的方法是将原始定理重构为P1:A->B和P2:A->C,但如果我可以跳过这一步,尤其是对于制作紧凑的自动证明,那就太好了。你可以在拆分之前断言B.,并证明它,然后split并使用假设证明B,然后使用B继续证明C
或者,您可以构建一个:
Theorem and_i
(这似乎有太多不相关的信息,所以我试图抽象掉细节。我不确定这仍然是同一个问题,但如果相同的解决方案对两者都有效,我将删除另一个问题。)
我试图解释一些自定义列表和谓词:
Inductive alphabet := A.
Definition sentence : Type := list alphabet.
Variable pred1 : sentence -> Prop.
Variable pred2 : sentence -> Prop.
Variable conclu
我有一个归纳定义,在计算后打印警告“忽略递归调用”。这个定义似乎很好用。然而,我仍然很好奇,为什么会给出这样的警告。下面是一个简单的例子
Inductive testor :=
| Constr1 : list testor -> testor
| Constr2 : testor -> testor.
我认为罪魁祸首是第一个构造函数中的列表testor。另一方面,如果没有第二个构造函数,则不会给出警告
Q:为什么会发出警告?这是否意味着对归纳定义施加了限制
我使用的是Coq 8.
我有一个重写引理的基础。其中一些由类型类参数化。当应用引理时,当Coq不能自动解析typeclass时,重写失败是很重要的。我发现获得这种行为的唯一方法是声明大多数隐式参数
Class T (t:Type) : Type.
Instance T1 : T nat.
Instance T2 : forall {A1 A2:Type} {t1:T A1} {t2:T A2}, T (A1*A2).
Definition f {A:Type} (x:A) := x.
Lemma f_eq : fo
我使用的是Coq 8.5pl1
举一个精心设计但又能说明问题的例子
(* fix so simpl will automatically unfold. *)
Definition double := fix f n := 2*n.
Theorem contrived n : double (2 + n) = 2 + double (1 + n).
现在,我只想把参数简化为两倍,
而不是它之外的任何部分。(例如,因为
其余部分已小心地放入正确的表格中。)
这将外部(2+…)转换为(S…)以及
标签: Coq
prooftheorem-proving
我得到了如下定理的解:
Require Import Coq.Lists.List.
Import ListNotations.
Inductive suffix {X : Type} : list X -> list X -> Prop :=
| suffix_end : forall xs,
suffix xs xs
| suffix_step : forall x xs ys,
suffix xs ys ->
我们有一个函数f
f : nat -> nat
如果我们将f应用于这样的模式匹配
f match n with
| O => O
| S n' => n'
end
我们怎样才能把它改写成这样
match n with
| O => f O
| S n' => f n'
end
我认为最简单的方法是使用案例策略
Lemma lift_match : forall (f : nat -> nat) (n : nat),
(f match
我试图用Coq证明一个简单引理,但我遇到了一些麻烦
排除不可行的情况。这是我的引理:
Theorem helper : forall (a b : bool),
((negb a) = (negb b)) -> (a = b).
Proof.
intros a b.
intros H.
destruct a.
- destruct b.
+ reflexivity.
+ (** this case is trivially true *)
由于假设H是
标签: Coq
logical-foundations
在玩诺斯托特练习时,我发现了另一种奇怪的行为。代码如下:
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) -> x <> h -> nostutter (x::
我如何在Coq中证明以下目标
Require Import Coq.Sets.Ensembles.
Goal (fun _ : nat => False) = Empty_set nat.
更新。我试过了
Proof.
apply functional_extensionality. intro n.
现在我有以下子目标:
1 subgoal
n : nat
______________________________________(1/1)
False = Empty_se
我需要在GitHub中使用不同于Coq标准库的库。但我不知道如何手动设置它,以便在CoqIDE中使用它
我需要在科奇德用这个。我已下载并将文件夹保存到我的计算机上,但当我打开CoqIDE并写入“需要导入StringEq”时,其中StringEq是库中Coq文件的名称,我收到错误消息“找不到库StringEq”
我有没有办法手动设置这个库,这样我就可以和CoqIDE一起使用它?(在库的GitHub页面上的自述文件中没有说明。)官方用法似乎是将kami添加到$COQPATH环境变量中
在Linux上
我现在正在学习使用Coq,我偶然发现了一个我似乎无法证明的定理。下面是定理和我目前的尝试
Fixpoint nateq (n m : nat) : bool :=
match n with
| O => match m with
| O => true
| S _ => false
end
| S n' => match m with
这只是我编的一个例子,我的问题是,如果我想通过反驳目标来证明它,假设(~eq_nat a c)是真的,然后通过在上下文中找到矛盾来证明,我应该如何实现?无法找到一种方法来做到这一点,任何关于我应该使用什么策略的提示?这需要双重否定消除(非目标->目标)才能起作用。如果你把它作为一个公理(比如说axiom dne:forall P:Prop,~~P->P),那么可以使用策略apply dne
准确地说,
1 subgoal
a, b, c : nat
H0 : eq_nat a b
H1 : eq
我想理解下面证明中的语法intros[|n]。
Lemma zero_or_succ :
forall n : nat, n = 0 \/ n = S (pred n).
Proof.
intros [|n].
- left. reflexivity.
- right. reflexivity.
Qed.
我的理解是,它修复了n,然后对其进行了案例分析。然而,我习惯于使用destruct进行案例分析。这是做那件事的捷径吗?我应该如何理解第一个分支为空的案例分析。
您在这里使用的
简而言之,我得到了错误:找不到绑定到逻辑路径匹配后缀和前缀LF的物理路径
我已经安装了Coq brew
我的以下文件位于~/Documents/Notes/PL/SF/LF/
\u CoqProject包含一行:-Q。低频
Basics.v包含第一章的代码
Makefile由命令生成coq\u Makefile-f\u CoqProject*.v-o Makefile
然后我通过makebasics.vo
现在我打开coqtop,并尝试从LF Require Export Basics运
我是Coq的新手。我想证明一个引理:
Require Import Reals.
Open Scope R_scope.
Definition fadd (f g:R->R) := fun x => f x + g x.
Notation "f +f g" := (fadd f g) (at level 61, left associativity).
(** f+f = g+g->f=g **)
Lemma fun_add: forall f g, f +
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 42 页