我有两个元素f:X->bool和X:X
如何为y定义g:X->bool这样的gx=true和gy=fyx、 根据您对我的评论的回答,我认为您无法定义“函数”g,因为您需要一种有建设性的方法来区分x与x类型的其他实例。然而,您可以定义两者之间的关系,如果您获得可判定性,可以将其转换为函数。
比如:
Parameter X : Type.
Parameter f : X -> bool.
Parameter x : X.
Inductive gRel : X -> bool ->
我只是Coq的初学者,我一直在尝试证明一些关于自然数的基本定理。我已经做了一些,不是很优雅,但完成的比较少。但是我完全坚持要完成这个定理:
Theorem add_increase: (forall a b: nat, a > 0 -> a + b > b).
Proof.
intros A.
intros B.
intros H.
case B.
将此输入,我得到以下输出:
2 subgoals
A, B : nat
H : A > 0
_______
如何证明平等性
3 * S (i + j) + 1 = S (3 * i + 1) + S (3 * j + 1)`
在Coq
为了用Coq证明我的归纳假设,我需要证明这些边是相等的(它们显然是相等的)
但是,如果我删除了S,例如,左侧,则得到自然数3。但是,我不知道如何将其分解为1+1+1
另外,坐着摆弄Nat.add\u assoc和Nat.add\u comm非常耗时,让我发疯
对于初学者来说,必须有一些“简单”的方法,如何使用“基本”策略来证明这一点?您可以使用一种自动算术策略:
Re
我有一个重写lambda术语的小系统。它具有通常的(三)确定性按值调用重写规则。我没有在这里列出它们
重写被建模为从一个术语到另一个的步骤。我还有可到达项之间的StarStep关系,后者可以通过零个或多个重写步骤从第一个生成
现在我想显示重写终止(使用值或卡住)。我已经剥离了细节,因为我认为它们在这里并不重要,但如果需要,我可以添加更多细节
以下是代码(或浏览器中的CollaCoq):
所以我想展示给大家看
如果不是“从所有可到达的状态,它是可能的”
另一个步骤“然后存在一个状态t',可从t
这
标签: Coq
frama-ccoqidewhy3
我使用frama-C WP并希望调试我的ACSL注释(以理解为什么验证程序会说我“不知道”)。
我有一些绿色或橙色的结果。我打开why3ide并查看生成的脚本。然后,我从列表中选择一个理论/目标,并能够启动Alt Ergo或Coq IDEs。我想在COQIDE中使用生成的代码。我看到了一些公理
然后,例如:
intros a a_1 i_3 i_2 i_1 i t_2 t_1 t t_8 t_7 t_6 t_5 t_4 t_3 a_4 a_3 a_2 x
x_1 x_2 x_3 h1 h2 h3
我有以下代码:
Require Import Znumtheory.
Require Import Zdiv.
Require Import ZArith.
Import Z.
Definition modulo (a b n : Z) : Prop := (n | (a - b)).
Notation "( a == b [ n ])" := (modulo a b n).
这是我试图证明的一个引理:
Lemma modulo_plus_eq : forall a b c m n : Z
我已经设法证明了
Theorem modulo_inv : forall m n : Z, rel_prime m n -> exists x : Z, (m * x == 1 [n]). Admitted.
我的问题是如何完成以下证明(可能使用modulo_inv定理?)
这是我试过的,但我不知道是否正确
Proof.
intros a b.
exists ((a * n) * (n ^ (-1) mod m) + (b * m) * (m ^ (-1) mod n))
Coq标准库有两种单元类型。一个True在Prop中键入,并具有单个构造函数I:True。另一个单元在集合中键入,并且具有单个构造函数tt:unit。我想知道I和tttt可以代表术语的名称的起源是什么Tree@GonenI您是否有任何参考资料支持您的版本?@AntonTrunov这是我在阅读定义4“Coq中的校对模式搜索”中的“给定一个术语t,其对应的术语树Tt”后的最佳猜测@GonenI对不起,但是定义4和单位类型之间没有联系。tt/ff出现在一些关于lambda演算的早期论文中,例如:我想说
Coq中的Gallina语言是否有一个预定义的运算符来帮助避免像Haskell的$或OCaml的@这样的括号
如果没有,是否有一个人们使用符号定义的常规符号?我没有测试这个,但它应该适用于很多上下文:
Notation "f @@ x" := (f x) (at level 10, x at level 100).
其要点是,我们将参数表达式置于最高级别100,这意味着解析器开始将参数表达式(x)作为独立表达式进行解析
第10级是函数应用程序的级别,因此您不希望低于该级别,
我正在证明关于在列表中查找的定理。我一直在努力证明,如果你真的发现了什么,那么它就是真的。什么样的引理或策略有助于证明这类定理?我的意思是,在这种情况下,清单上的归纳法似乎是不够的。但这个定理仍然是正确的
(*FIND P = OPTION_MAP (SND :num # α -> α ) ∘ INDEX_FIND (0 :num) P*)
Require Import List.
Require Import Nat.
Fixpoint INDEX_FIND {a:Type} (i:n
这是一个愚蠢的初学者问题,但我如何证明这个定理呢
Open Scope Z.
Theorem test : forall x y:Z, (x > 0 -> y = 1) \/ (x <= 0 -> y = 2) -> y >= 1.
Proof.
intros.
destruct x.
destruct H.
(* stuck *)
Qed.
Theorem test : forall x y:Z, (x > 0 -> y = 1
我试图为二进制自然数(位列表)定义前置函数。我想将我的函数的输入限制为经过修剪(没有前导零)且为正的数字(因此,我不必担心零的前导)
以下是运算符pred的定义:
Program Fixpoint pred (nat1: Nat) (H1: is_trim nat1 = True) (H2: is_pos nat1 H1 = True): Nat :=
match nat1 with
| Empt => _
| Fill Zer nat2 => Fill One (pre
我被一个问题困扰了一段时间,为此我衍生了一个较小的独立示例:
Axiom f : nat -> Set.
Goal forall (n : nat) (e : n = n) (x : f n),
match e in _ = _n return f _n -> Prop with
| Logic.eq_refl => fun v : f n => v = x
end x.
现在,如果您试图销毁e,则会收到以下错误消息:
Error: Abstracting
标签: Coq
algebraic-data-types
我试图用Coq建立一个cobordism的归纳类型,这样可以证明cobordism的一些性质(1-群胚和2-群胚)。我使用以下Coq代码:
Unset Automatic Introduction.
Inductive Topo : Set := t | nt.
Definition F (i j : Topo) :=
match i, j with
| t, t => t
| t, nt => nt
| nt, t => nt
| nt, nt =>
给出一个自然数列表类型的明确定义,以及一个函数last,它接受最后一个元素或返回默认值,我试图证明以下引理:
Lemma last_ignores_first : forall l : natlist, forall def n : nat,
length l > 0 ->
last def (n :: l) = last def l.
现在,我想证明它,因为l不是空的,所以对于一些h和t,它必须能够以h::t的形式写入,因此证明将遵循last的定义。但是我如何在Coq中使
我有一个证明,下面还有三个次级目标。证明是关于用一种简单的算术语言对plus 0(optimize\u 0plus)进行优化的正确性aexp是“算术表达式”aeval是“算术计算”
,其中,optimize\u 0plus为:
Fixpoint optimize_0plus (a:aexp) : aexp :=
match a with
| ANum n =>
ANum n
| APlus (ANum 0) e2 =>
optimize_0plus
我在这里与Coq一起研究我定义的两种类型之间的关系。第一个类似于nat的有限子集,只有三个元素:
Inductive N3 := zero | one | two.
第二种是sigma类型,元素满足命题{x:nat | xxx存在0 erefl
|一=>存在1 erefl
|两个=>存在2 erefl
结束。
引理eq_lt3_lt3(x:小于3):eq x(N3_到lt3(lt3_到N3 x))。
证明。
申请者:val_inj;大小写:x=>Px]。
Qed。
val_inj的语句有点复
我想让函数f比较类型ty的两个术语,但它没有编译,我看到这个错误:
术语x=y具有类型Prop,它不是(共)归纳类型
您需要证明等式对于ty(可以使用自动完成)是可判定的,然后在中使用该定义,如果。。。然后否则…语句。具体地说:
Inductive ty: Set :=
| I
| O.
Definition f (x: ty) (y: ty): nat :=
if x = y then 0 else 1.
感应性:设置:=
|我
|O。
定义ty_eq_dec:forall(xy:ty
我在Coq中有一个数据类型snapshot=(nat、state、bool)。我想编写一个函数beq_snap来比较两个快照并返回一个bool类型
Inductive id : Set :=
| Id : nat -> id.
Definition state := id -> nat.
Definition snapshot := nat * state * bool.
您的状态类型同构于nat->nat,并且您无法编写在Coq中比较此类函数的函数。这背后的直觉是考虑这样的
正如我所说的,我有一个假设
e0:(val=?n)=真
我必须证明val=n
Inductive is_found : nat -> abr -> bool -> Prop :=
|is_not_found_nil : forall (n : nat), (is_found n nil false)
|is_found_node_eq : forall (n val : nat) (fg fd : abr), val = n -> (is_found n (Node va
标签: Coq
proofrational-number
我正在试验Coq的整数和有理数标准库。到目前为止,我的证明非常耗时,而且看起来很糟糕。
我想我错过了一些重要的证明技巧。这样简单的引理不需要很长时间就能证明。有什么提示吗
以下是一个例子:
Require Import ZArith.
Require Import QArith.
Open Scope Q_scope.
Theorem q_less: forall x y z, (0 <= x <= y)%Z -> x # z <= y # z.
Proof. intr
标签: Coq
theorem-provingcoinduction
我有一个conat的定义,它可以表示有限值和无限值,一个从nat的转换,一个无限的定义,以及一个互模拟关系:
CoInductive conat : Set := O' | S' (n : conat).
Fixpoint toCo (n : nat) : conat := match n with
| O => O'
| S n' => S' (toCo n') end.
CoFixpoint inf : conat := S' inf.
CoInductive bi
我试图证明这一点:
Lemma eq_eq: forall (U: Type) (p: U) (eqv: p = p), eq_refl = eqv.
但似乎没有办法做到这一点。问题在于类型p=p是同一术语上的等式,然后试图匹配其实例。如果不是这样的话,那么很容易证明具有单个构造函数的类型的项等于该构造函数
Lemma eq_tt: forall (U: Type) (x: unit), tt = x.
Proof
fun (U: Type) (x: unit) =>
mat
我有一个非空的自然数列表。想要定义一个函数来查找列表中两个自然数(n1和n2)的出现情况。不太清楚您想要做什么-标题与描述不太匹配。“计数”和“查找”不是一回事。与Coq合作的第一步是开始使用精确的措辞
我想您可以使用函数count\u occfrom()两次,或者编写一个类似的函数来进行两次比较
有了额外的信息,这应该是可行的:
Require Import List.
Require Import PeanoNat.
Import ListNotations.
Open Scope nat
我是Coq的新手,有一个关于销毁策略的快速问题。假设我有一个count函数,它计算自然数列表中给定自然数的出现次数:
Fixpoint count (v : nat) (xs : natlist) : nat :=
match xs with
| nil => 0
| h :: t =>
match beq_nat h v with
| true => 1 + count v xs
| false => co
有没有可能给一个不适用于一般情况的陈述举个反例?比如,all-quantor不分布在连接词“or”上。首先,你会如何陈述
Parameter X : Set.
Parameter P : X -> Prop.
Parameter Q : X -> Prop.
(* This holds in general *)
Theorem forall_distributes_over_and
: (forall x:X, P x /\ Q x) -> ((forall x:X,
当我运行下面的Coq脚本时(原始脚本的简化):
Inductive w(g:nat):nat->Prop:=
|z:WG0。
引理x:
forall(i j:nat),w i j->(forall k:nat,k w m n。
证明。
介绍m n H。
在H中应用x。
我在最后一行收到以下错误消息:
错误:找不到变量k的实例
谁能解释一下为什么会发生这种情况,以及我必须做些什么才能得到所有k:nat,k因为你的引理x包含一个内部的通用量化(最后的所有k部分),
Coq无法猜测您要使用哪个自然数
考虑到我对所有n m都有,有没有办法做到这一点:
intros n m. generalize dependent n.
但是,在一个步骤中,仅对m应用intros(或一种替代策略)您可能想要沿着这些路线的东西(但为了能够将策略应用于多排序望远镜,需要一个异构列表):
不幸的是,基本的Coq策略语言并不适合这种记账步骤。我个人更喜欢用这些,因为它们更经济。比较
intros n m. generalize dependent n.
与SSR等效
move=> n m; move: n.
假设我想证明一个关于一个对象的定理,这个定理很难解释,比如说ABCDEFGHIJKLMNOPQRSTUVWXYZ,那么这个未修正的定理是
Theorem verbose :
prop_1 ABCDEFGHIJKLMNOPQRSTUVWXYZ
-> prop_2 ABCDEFGHIJKLMNOPQRSTUVWXYZ
-> prop_3 ABCDEFGHIJKLMNOPQRSTUVWXYZ
-> prop_4 ABCDEFGHIJKLMNOPQRSTUVWXYZ
-> pro
标签: Coq
inductioncoq-tactic
我刚刚遇到了Coq归纳法在阅读一篇文章的校样时丢弃有关构造术语的信息的问题
作者使用了类似于:
remember (WHILE b DO c END) as cw eqn:Heqcw.
在实际归纳之前重写假设H。我真的不喜欢引入一个微不足道的等式,因为它看起来像是黑魔法
这里的一些搜索显示,实际上记住技巧是必要的。然而,一个答案指出,新的依赖归纳法可以用来避免记住技巧。这很好,但是依赖归纳法本身现在似乎有点神奇
我很难理解依赖归纳法是如何工作的。给出了一个需要相关感应的示例:
Lemma le
我是Coq的新手,这项任务应该很简单:
forall x: nat, forall y: nat,
x == y = true -> x = y
这是更大任务中的一小部分,但我一直坚持着。我知道反问题更容易解决。这表明这种问题很少见
罗德里戈评论后更新
通过对x进行归纳,然后对y
引理显而易见:forall x:nat,forall y:nat,
等式x y=true->x=y。
证明。
简介xyh。
感应x为[|x']。
(*情况x=0*)
破坏y。
(*情况y=0*)
自反性。(*
我刚刚看到有人用一种不熟悉的语法在Coq中定义了归纳类型,如下所示:
Inductive nat_tree : Type :=
| NatLeaf
| NatNode of color & nat_tree & nat & nat_tree.
我使用的语法如下所示:
有人能解释一下新的语法吗
顺便说一句,这是一个SSreflect教程。我想知道这是否是ssr的添加 是的,你是对的:这个语法是由Ssreflect定义的。它们都被定义为声明匿名参数的语法糖:of T和&Tm
假设我有一个像a+(b+(c+d))的和,我想把它转换成a+b+c+d来应用引理
使用Nat.add\u assoc手动执行此操作非常繁琐。有更聪明的方法吗?我会使用的“简单但不好”的方法是用(a+b+c+d)替换(a+(b+(c+d)))到现在为止,欧米茄你可以使用重复战术,它重复一些战术,直到无法再应用:
repeat rewrite Nat.add_assoc.
或更简洁的版本:
rewrite !Nat.add_assoc.
它的工作原理与使用repeat的变体相同
这种方法的缺点是
list\u rec功能具有以下类型:
list_rec
: forall (A : Type) (P : list A -> Set),
P nil ->
(forall (a : A) (l : list A), P l -> P (a :: l)%list) ->
forall l : list A, P l
在我给出的所有示例中,p只是一个常量函数,它忽略输入列表并返回相同的类型。例如,P可能是fun\uu:list A=>nat或fun\u
我试图证明以下关于自然序的玩具定理:
Inductive Le: nat -> nat -> Prop :=
| le_n: forall n, Le n n
| le_S: forall n m, Le n m -> Le n (S m).
Theorem le_Sn_m: forall n m,
Le (S n) m -> Le n m.
在纸上,这是关于Le(sn)m的一个简单归纳。特别是,le_n的基本情况并不重要
但是,在Coq中,以归纳法开始我
标签: Coq
coq-tacticcoinduction
定义一个新类型foo给了我一个递归原则foo\u rect,它优雅地抽象了fix。是否可以通过某种方式“翻转箭头”来定义共导等价物(对cofix进行抽象?这是不可能的,因为Coq以非模块化的方式检查cofix点的防护条件。幸运的是,解决这个问题的方法是,只要你用一种特定的方式表达你的定义,你就可以做你想做的事情
这里有一个关于Paco库的很好的教程:Giménez和Castéran在Coq中的“Park原理”,本质上是通常归纳模式的镜像。它也出现在Adam Chlipala关于依赖类型的认证编程
标签: Coq
coq-tacticcoq-extractioncompcert
EvalOp的定义如下:
这个定义的奇怪之处在于coqdoc--html将Eval和Op识别为两个独立的标记:
<span class="id" title="keyword">Eval</span><span class="id" title="var">Op</span>
EvalOp
为什么COQ允许中间没有分隔符(空格)的两个令牌?或者这是coqdoc的一个bug?谢谢你的帮助
为什么COQ允许中间没有分隔符(空格)的两个令牌?或者这是
标签: Coq
dependent-typetheorem-proving
我已经证明了一个等价性,并且将\u分布在\u或:
Theorem and_distributes_over_or : forall P Q R : Prop,
P /\ (Q \/ R) <-> (P /\ Q) \/ (P /\ R).
(对于我正在处理的上下文,我正在进行。不过,请不要告诉我该练习的解决方案!)
我试着用重写并在我的目标上分配fx0=y/\(x=x0\/在x0xs中)),而Coq的记法机制将它很好地打印为存在的x0,。基本的rewrite策略不能在函数内部进
Coq接受以下关于U的归纳定义,因为它可以看出U在M.T U->U中的出现是严格正的
Module M.
Definition T (A : Type) : Type := unit -> A.
End M.
Module N.
Inductive U : Type :=
| c : M.T U -> U.
End N.
另一方面,Coq不接受以下U的归纳定义,因为根据M.T的定义,它可能出现非严格正的情况
Module Type S.
Parameter T : Ty
为了理解一般的递归函数定义是如何工作的,以及它们是如何符合Coq的结构递归约束的,我尝试在Peano自然数上重新实现它。我想定义递归的nat->nat函数,这些函数可以使用任何先前的值,而不仅仅是先前的值。以下是我所做的:
Definition nat_strong_induction_set
(* erased at extraction, type specification *)
(P : nat -> Set)
我在浏览时看到了以下简单代码:
Inductive ev : nat -> Prop :=
| ev_0 : ev 0
| ev_SS : forall n : nat, ev n -> ev (S (S n)).
但是,当在证明ev 4为真的情况下使用apply ev SS.策略时:
Theorem ev_4 : ev 4.
Proof. (* goal: ev 4*)
apply ev_SS. (* goal changed to: ev 2, why??? *)
a
标签: Coq
logical-foundations
试图解决eqb_trans I遇到了问题:
Theorem eqb_trans : forall n m p,
n =? m = true ->
m =? p = true ->
n =? p = true.
显然,我们应该使用eqb_true来解决它:
Theorem eqb_true : forall n m,
n =? m = true -> n = m.
--------------------------------------------
Pr
我正在使用coq中的一个定义,它需要从一个定理中产生一些东西,但不能在定义中进行破坏
Theorem sp : forall (X : Type) (T : X -> Prop)..... , exists (a : X), T a.
Definition yield_sp : (X : Type) (T : X -> Prop) (H : sp X T .....)..... : X.
当我试图破坏H时,coq警告说
归纳定义ex不允许对排序类型进行案例分析
我想知道这样做的原因
我想知道所有a:nat,01?;重写(ltn_add2r 1 0)。也可以。甚至ltn\u add2r\u0。谢谢!Arthur和Bubbler的答案都很有效,也很有帮助;重写addn1。
我对折叠长度的定义如下:
Inductive list (X: Type) : Type :=
| nil : list X
| cons : X -> list X -> list X.
Arguments nil {X}.
Arguments cons {X} _ _.
Notation "x :: y" := (cons x y)
(at level 60, right associativity).
Notation "[
有没有办法在Coq中定义子类型关系
我读过关于子集类型的文章,其中谓词用于确定子类型中的内容,但这不是我的目标。我只想定义一个理论,其中有一个类型(U)和另一个类型(I),它是(U)的子类型 Coq中没有真正的子类型(除了宇宙子类型,这可能不是您想要的)。最接近的替代方法是使用强制,这是Coq类型检查器在需要一种类型的元素但找到另一种类型的元素时自动插入的函数。例如,考虑从布尔值到自然数的下列强制:
Definition nat_of_bool (b : bool) : nat :=
if
标签: Coq
agdainductionparametric-polymorphism
对于感应类型nat,生成的感应原理在其语句中使用构造函数O和S:
Inductive nat : Set := O : nat | S : nat -> nat
nat_ind
: forall P : nat -> Prop,
P 0 ->
(forall n : nat, P n -> P (S n)) -> forall n : nat, P n
但是对于le,生成的语句不使用构造函数le\u n和le\u S:
Inductive le
我正在尝试编写以下函数:
Ltac restore_dims :=
repeat match goal with
| [ |- context[@Mmult ?m ?n ?o ?A ?B]] => let Matrix m' n' := type of A in
let Matrix n'' o' := type of B in
我想在四个自然数列表中找出最大的元素。元素按顺序排列(从1到list1中的n,1到list2中的n-1,1到list3中的n+4,1到list4中的n-2),我也有它们的长度。我比较了两个列表以找到长度更大的列表,但在比较前两个列表与第三个和第四个列表的结果时遇到了一个问题
Definition sort (l1 l2 : list nat) : nat :=
if leb (length l1) (length l2) then
length l2
else if
有办法解决Coq中的变量吗?鉴于:
From Coq Require Import Reals.Reals.
Definition f_of_x (x : R) : R := x + 1.
Definition f_of_y (y : R) : R := y + 2.
我想表达
Definition x_of_y (y : R) : R :=
类似于求解x in f_of_x=f_of_y。我希望使用战术语言来洗牌术语。我最终希望得到正确的可用定义y+1.我想使用我的定义:
Compu
上一页 1 2 3 4 5 6 7 8 9 ...
下一页 最后一页 共 42 页