假设我想断言存在可数无限多个不同的x:x。我的第一个猜测是按照字面上可数无穷的定义,例如:
Definition aleph_null ( X : Type ) :=
exists ( R : nat -> X -> Prop ),
( forall ( n : nat ), exists ( x : X ), R n x )
/\ ( forall ( x : X ), exists ( n : nat ), R n x )
/\ ( forall ( n : nat ) ( x
标签: Coq
function-composition
我想定义一个函数compose,它将f:nat^^n-->nat与g1。。。gn:nat^^m-->nat这样
compose n m f g1 ... gn x1 ... xm
等于
f (g1 x1 ... xm) ... (gn x1 ... xm)
使用,为特殊情况定义它并不难:
Fixpoint compose_unary (m : nat) (g : nat -> nat) :
(nat ^^ m --> nat) -> (nat ^^ m --> n
它扩展到了通过将整个对象集分解为几个可用于重构原始对象集的不相交子集来进行推理的一般思想
考虑到我们并不总是有一个假设,那就是我们想要解构成的子集之一,coq中是如何捕捉到这个推理原则的
考虑以下示例进行演示:
forall n,Nat.偶数n=>pn.
在这里,我们可以自然地对Nat.偶n进行inversion,得到n=2*x(并且自动消除了错误的假设n=2*x+1)。但是,假设我们有以下情况:
forall n,pn
我怎么说:“让我们考虑,即使是N< /代码> S和奇数N< /代码> S。
我天真地希望所有H的检查都能成功,但事实并非如此
Adam Chlipala在其著作《使用依赖类型进行认证编程》中指出了依赖类型上模式匹配的限制:
问题是统一变量可能不包含局部绑定变量
这就是我在这里看到的行为的原因吗?H的类型是对于所有x,x,而不是对于所有x,x
Ltac checkForall H :=
let T := type of H in
match T with
| forall x, ?P x =>
idtac
| _ =>
fail
假设我在Coq中有以下定义:
Inductive Compare := Lt | Eq | Gt.
Fixpoint compare (x y : nat) : Compare :=
match x, y with
| 0, 0 => Eq
| 0, S _ => Lt
| S _, 0 => Gt
| S x', S y' => compare x' y'
end.
现在考虑这个引理:
Lemma foo : forall (x: nat
使用第一种方法非常困难,因为维护这样的代码非常困难。当有超过五个不同的函数,每个函数有4-5个参数时,编写会变得非常痛苦
第二种情况更方便。但是我仍然有很多关于let声明的额外行:
(* I have a section with many variables and definitions. *)
Section SectionWithDefs.
Context {A B C: Type}.
Variable arg1: A -> B.
Variabl
标签: Coq
parametric-polymorphismcoq-pluginfree-theorem
我如何用插件证明以下内容
如果不可能,那么该插件的用途是什么?该插件可以为任何类型生成参数声明。然后,您仍然需要将其声明为公理或假设,以实际使用它:
Declare ML Module "paramcoq".
Definition idt := forall A:Type, A -> A.
Parametricity idt arity 1.
(* ^^^ This command defines the constant idt_P. *)
Axiom param_idt : for
我对Coq中的列表有以下定义:
Variable A : Set.
Variable P : A -> Prop.
Hypothesis P_dec : forall x, {P x}+{~(P x)}.
Inductive plist : nat -> Set :=
pnil : plist O
| pcons : A -> forall n, plist n -> plist n
| pconsp : forall (a:A) n, plist n -
我有一个自然数列表和函数(maxvalue),它以natlist作为参数并返回nat,这是列表中最大的一个。为了说明由函数maxvalue确定的值大于或等于列表中的任何元素,我引入了命题,即在nl->n中,您的问题有点让人困惑
我的第一个猜测是,你陷入了定理maxValueList中:在nl->nI不能理解你想要证明的引理中,如果n在命题中扮演什么角色?我想写一个引理,这可能有助于证明nat列表是按降序排列的。我只有一个函数可以找到列表中最大的元素,为了证明列表是递减的,我应该写这个引理如果你需
我很高兴你在laibanaz重新表述了你的问题。
你的引理现在只是你在上一篇文章中提出的前一个引理的一个更强的版本
例如,知道所有值都等于/小于列表的最大值,因此,某些列表的第n个尾部的任何值也是:
Fixpoint index_value (i: nat) (j: nat) (l: list nat) : nat :=
match l with
| nil => 0
| cons h t => match (eqb i j) with
| true => h
| false
我正在用Coq证明一个引理
我的一个假设是:H0:~p->False对于某个命题p
我唯一剩下的子目标是p
有人会认为,有一种策略可以让我一步用H0证明p。然而,我似乎找不到它
这样的策略存在吗?如果存在,是哪种策略?你愿意接受排除中间派的公理吗?否则,您的目标通常是不可证明的。在Coq的逻辑中,~~p(这是你的H0)并不意味着p@Anton Trunov Ah。你看,@jornsharpe编辑了我的帖子,删除了一些关于我为什么发布这个问题的解释。我离开Coq已经8年了,虽然我已经回来一个月了。
标签: Coq
logical-foundations
这项任务
假设我们给Coq下了以下定义:
Inductive R2 : nat -> list nat -> Prop :=
| c1 : R2 0 []
| c2 : forall n l, R2 n l -> R2 (S n) (n :: l)
| c3 : forall n l, R2 (S n) l -> R2 n l.
下列哪个命题是可证明的
Example Example_R23 : not (R2 6 [3;2;1;0]).
Proof.
Qed.
我
伊莎贝尔是一种逻辑框架。你可以使用元理论介绍逻辑的公理和规则,并对它们进行推理。例如,您可以在Isabelle分布的IFOL.thy中看到直觉一阶逻辑的编码。以下是量词常量的声明:
typedecl o
judgment
Trueprop :: ‹o ⇒ prop› (‹(_)› 5)
axiomatization
All :: ‹('a ⇒ o) ⇒ o› (binder ‹∀› 10) and
Ex :: ‹('a ⇒ o) ⇒ o› (binder ‹∃› 10)
w
我如何证明尺寸\u prgm的终止?我试过了,但找不到一个有充分根据的关系来传递给Fix
Inductive Stmt : Set :=
| assign: Stmt
| if': (list Stmt) -> (list Stmt) -> Stmt.
Fixpoint size_prgm (p: list Stmt) : nat :=
match p with
| nil => 0
| s::t => size_prgm t +
我正在做一个证明,我现在被困在这里。我有一个假设如下:
T1E : tree1 = EmptyTree -> isEmpty (leftChild (Node tree1 tree2)) = true
我还有一个假设:
H2 : isEmpty (leftChild (Node tree1 tree2)) = true
我目前的次级目标是
tree1 = EmptyTree
看来我应该能做到
rewrite <- T1E
但当我尝试时,科克说
Error: Found no
我需要证明这个定理
Theorem expr_not_terminate:
~(forall (e : expr) (s : state),
exists (v : value),
evalExpr e s v).
Proof.
unfold not.
intros.
我一做“简介”,它就带来了“H:forall(e:expr)(s:state),在
我想看看我的证明所使用的所有公理。
获取此类信息的最简单方法是什么?
我应该使用哪些命令、脚本或工具?
我对所有公理或所有使用过的公理都感兴趣。您应该使用
Print Assumptions foobar.
白话命令,描述
我正在阅读Coq参考手册(8.5p1)关于
局部战术运用
不同的战术可以应用于不同的目标使用
以下表格:
[>expr1 |:| exprn]
表达式expri计算为vi,i=0。。。;n和所有
必须是战术。vi应用于第i个目标,for=1。。。;
N如果目标数不完全为n,则失败
所以我做了一个有两个目标的小测试,试图对每个目标应用两个简单的idtac策略,如下所示:
Goal forall P Q: Prop, P \/ Q -> Q \/ P.
intros. destruct H.
我是Coq的初学者,所以我的问题可能看起来是个愚蠢的问题,但我的问题是:
我定义了一个简单的模块,其中我定义了一个类型T和一个函数“my_custom_equal”:
正如你所看到的,这并不复杂,但我仍然坚持我的自定义单点证明,我总是需要证明“sx=y”和我的假设只是:
y : nat
H : my_custom_equal 0 (S y) = true
IHy : my_custom_equal 0 y = true -> 0 = y
__________________________
我正在用Coq做一个练习,试图证明一个列表是否等于它的反面,它是一个回文。以下是我如何定义回文:
Inductive pal {X : Type} : list X -> Prop :=
| emptypal : pal []
| singlpal : forall x, pal [x]
| inducpal : forall x l, pal l -> pal (x :: l ++ [x]).
这是一个定理:
Theorem palindrome3 : forall
因为我有
Definition f (s:Unit) : tt=tt := match s with tt => idpath end.
Definition g (p:tt=tt) : Unit := match p with idpath => tt end.
我想为所有(p:tt=tt),(f o g)p=p证明
我想使用霍特书中1.12.1中描述的路径归纳法来实现它
显然,对于p为idpath的情况,我们可以证明
assert( (f o g) idpath = idpat
如何从H证明False反转H只是复制它。该证明通过对d的归纳得出,并使用:
Goal forall (d : nat), d + 1 = d -> False.
Proof.
intros d H.
Abort.
基本情况是0=1,它通过反转导致False,从而结束该情况。归纳推理假设为d+1=d->False,目标为sd+1=sd->False。我们从eq\u add\u S知道x+1=y+1->x+y,因此我们重写了我们的目标并应用归纳假设
完整证明:
eq_add_
标签: Coq
algebraic-data-types
我试图用一个构造函数来定义一个数据类型,该构造函数接受一个列表,并包含关于这个列表的命题
这很好:
Require Import Coq.Lists.List.
Import ListNotations.
Inductive Foo := MkFoo : list Foo -> Foo.
这也是:
Inductive Foo := MkFoo : forall (l : list Foo), Foo.
但这失败了
Inductive Foo := MkFoo : forall
标签: Coq
cartesian-productset-theory
我在Coq.sets.emble中为集合使用emble类型。这个库定义了并集和交集,但我找不到笛卡尔积的任何构造
具体来说,我正在寻找一个构造函数,它接受集合U和集合V,并返回一个集合(U*V),其中包含所有有序对的集合(U,V),其中U∈ U和v∈ V
明确地称之为笛卡尔的东西会很棒。或者,也许有某种方法可以使用普通的产品类型来嵌入相同的想法
我试图构造这样一个引理:
Lemma cartesian_inclusion : forall A B C D : Ensemble U,
In
Isabelle将其内核证明能力建立在分辨率和高阶统一的基础上
Coq核是如何证明定理的
问题从阅读保尔森的“一般定理证明器的基础”开始:
作为类型的命题可能会占用过多的空间;那么,对于高阶逻辑,什么将取代休伊特的统一程序呢
在大多数证明程序中有两种技术:“证明”部分(负责构建证明,因为这对用户来说太单调了)和“检查”部分(负责验证证明格式正确且与给定的定理语句匹配)。在Isabelle和Coq中,内核只负责“检查”部分
在Coq的情况下,命题作为类型范式确实用于检查证明。换句话说,证明是归纳构
我想知道是否有一些介绍模式可以介绍
A/\B/\Cas
H1: A /\ B
H2: C
我知道简介[h1h2]将产生
H1: A
H2: B /\ C
但无法确定如何为另一个方向配置括号。
这是一个微不足道的例子;但我有一个更复杂的连接和析取的组合,我更喜欢从右到左分解
谢谢,Coq中的\u/\\u//code>符号是一个右关联二进制运算符,因此a/\B/\C实际上代表a/\(B/\C)。如果你想构建一些A/\B你应该首先完全分解/\(intros[HA[HB HC].,你可以任意嵌套模式
我想定义向量之间的相等
我想到的定义是“两个向量相等,当且仅当它们的类型和所有元素相等”
所以,我想证明我的定义没有矛盾
Require Import Psatz.
Require Import Coq.Vectors.Vector.
Definition kLess : forall (k P:nat), (P - k) < (S P).
intros. lia.
Defined.
Lemma aaa {n A}(v1 v2:t A (S n)): (forall k:nat, nt
我想定义一系列类型powersetower:Type->nat->Type,以便:
PowersetTower A 0=A
powersetowera(n+1)=合奏(powersetoweran)(即,powersetoweran->Prop)
可能吗?一个想法是
Inductive PowersetTower : Type -> nat -> Type :=
| base : forall (A : Type), PowersetTower A 0
| step : forall
我对Coq非常陌生,我正在尝试定义一个“通用”指标函数,如下所示:
Function indicator (x : nat) : bool :=
match x with
| O => false
| _ => true
end.
Function indicator `(S : Semiring) (x : K) : bool :=
match x with
| ident => false
| _ => true
en
在证明过程中,我遇到了一种情况,即当前目标/子目标在同一定理的后期阶段被证明是有用的
是否有一种策略可以将当前目标“保存”为引理,就好像当前目标是asserted一样
当然,我可以复制并粘贴到assert目标,或者在当前定理之前编写一个单独的引理。但我只是好奇是否存在捷径
谢谢。据我所知,Coq中没有此类功能,CoqIDE和ProofGeneral似乎都没有提供此类功能。如果您使用的是Proof General,则可以安装提供此功能的扩展。它由C-C-a C-x键序列绑定
这应该是一个直截了当的事情来证明,但我一直被卡住。非常感谢您的帮助
Require Import Arith.
Fixpoint At n (l:list nat) :=
match n with
| 0 => match l with nil => None | cons x _ => Some x end
| S n' => match l with nil => None | cons _ l' => At n' l'
假设以下特定场景
我们对平等有一个定义:
Inductive eqwal {A : Type} (x : A) : A -> Prop :=
eqw_refl : eqwal x x.
和peano nats:
Inductive nawt : Prop :=
| zewro : nawt
| sawc : nawt -> nawt.
我们在NAT上定义了加法:
Fixpoint plaws (m n : nawt) : nawt :=
matc
已导入Reals库
Require Import Reals.
如何定义3.14或10.1等常量,并将其用于函数定义或计算?您可以这样定义常量:
Definition a := 10 + /10.
Definition b := 3 + 14/100.
但是,请注意,标准库以公理化的方式定义real。
你可以找到主要的定义。请注意,这些定义是作为参数s给出的,它是Axiom的同义词。
例如,R0和R1代表实数0和1,Rplus和Rmult代表加法和乘法,但这些定义不是归纳数据类型和函数,因为
我正在尝试使用Coq中的以下函数实现一个函数,以建立一个包含n个元素的Braun树,但Coq给了我一个错误,它无法猜测fix的递减参数:
Fixpoint copy (x : V) (n : nat) : BraunTree :=
let
fix copy2 (a : V) (i : nat) : (BraunTree * BraunTree) :=
match i with
| 0 => (T a E E,E)
| _ => match Nat.od
标签: Coq
theorem-provingcoq-tacticinduction
我正致力于在of中证明以下定理
式中,le的定义(即。,≤)是:
Inductive le : nat → nat → Prop :=
| le_n n : le n n
| le_S n m (H : le n m) : le n (S m).
Notation "m ≤ n" := (le m n).
在归纳HS之前,背景以及目标如下:
n, m : nat
HS : S n <= S m
______________________________________(1/1)
标签: Coq
dependent-typetheorem-provingtype-theory
Coq中类型和集合之间是否存在相等或不相等关系
我正在学习Coq的类型系统,并了解Set的类型是type{Set+1},而type{k}的类型是type{k+1}。我试图证明Type=Set,然后试图证明Type-Set,但两种情况下我都失败了
我从
Lemma set_is_type : Type = Set.
Proof.
reflexivity.
这会给出一条错误消息,说明无法将“Set”与“Type@{Top.74}”统一起来
然后我试着
Lemma set_is_not_type
标签: Coq
proofcoq-tacticinduction
我是大学一个名为“语言的类型系统”的课程的讲师,教授上个月在黑板上用下面的例子进行了类型理论的归纳证明
讲座:
假设存在归纳定义的自然数(出于某种原因,他坚持称它们为术语),并且我们有一个递归定义的大于函数。我们可以证明,对于它持有的每一个n(如n>n)
我准备了以下Coq代码,用于在类中实现此功能:
Inductive term : Set :=
| zero
| suc (t : term)
.
Fixpoint greaterThan (t t' : term) {struct
假设我有两个关系R1和R2。如果我需要通过对术语r1a(r2bc)进行归纳来解决问题,我需要首先执行记住r2bc,否则我将丢失R1的第二个参数等于r2bc的信息。是否有一种归纳法的变体不需要我来处理这个问题?答案是否定的
归纳法的工作方式是,它用归纳谓词构造函数中出现在同一位置的值替换每个参数的每个实例。为了简化这一过程,记住策略将复合表达式(r2bc)替换为一个变量。如果你的目标中出现了(r2bc),你有时可以避免这种情况,但这种情况很少见。答案是否定的
归纳法的工作方式是,它用归纳谓词构造函
将展开def。折叠def。是否曾在Coq证明中取得任何成就
换言之:这两种战术运用的顺序会有区别吗
def展开。折叠def。cbn.
cbn.
当然展开定义内联定义,并执行一些基本缩减,例如,如果定义在内联之前应用于任何对象
Definition hold {T} (x : T) : Prop := True.
Goal (not False -> hold not).
unfold not.
(* inline not: (fun A : Prop => A -> Fals
我不熟悉Coq中的归纳谓词。我已经学习了如何定义简单的归纳谓词,如“偶数”(如adam.chlipala.net/cpdt/html/predicates.html)或“last”(如中所示)
现在我想尝试一些稍微复杂一点的东西:将加法定义为归纳谓词,但我被卡住了。我做了以下工作:
Inductive N : Type :=
| z : N (* zero *)
| s : N -> N. (* successor *)
Inductive Add: N -> N ->
我为coq中nat_列表的所有子集定义了一个递归函数
Fixpoint subsets (a: list nat) : (list (list nat)) :=
match a with
|[] => [[]]
|h::t => subsets t ++ map (app [h]) (subsets t)
end.
我想证明这一点
forall (a:list nat), In [] (subsets a).
我试着参加一个a。基本情况是直截了当的。然而,在归纳法的例子
我正在处理nats的元组(特别是三元组,nat*nat*nat),并希望找到一种按字典顺序比较元组的方法。与此相当的东西:
Inductive lt3 : nat*nat*nat -> nat*nat*nat -> Prop :=
| lt3_1 : forall n1 n2 n3 m1 m2 m3, n1 < m1 -> lt3 (n1,n2,n3) (m1,m2,m3)
| lt3_2 : forall n1 n2 n3 m2 m3, n2 < m2 -&
我是Coq的新手。我对下面的证据感到困惑:
Lemma nth_eq : forall {A} (l1 l2 : list A),
length l1 = length l2 ->
(forall d k, nth k l1 d = nth k l2 d) ->l1 = l2.
Proof.
intros.
结果表明:
1 subgoal
A : Type
l1, l2 : list A
H : length l1 = length l2
H0 : forall (d : A)
假设我有以下设置:
Inductive exp: Set :=
| CE: nat -> exp.
Inductive adt: exp -> Prop :=
| CA: forall e, adt e.
Coercion nat_to_exp := CE.
Ltac my_tactic := match goal with
| [ |- adt (CE ?N) ] => apply (CA (CE N))
end.
我尝试用自定义策略证明一个简单的定理:
Theore
它是否认为如果我可以为每个特定的n决定一个命题pn,那么我也可以决定是否为所有n,pn?感觉它应该可以通过对n的归纳来实现,但我如何在Coq中证明这一点呢
Lemma dec_forall:
forall (P : nat->Prop),
(forall n, decidable (P n)) ->
decidable (forall i, P i).
这不应该是可行的。如果所有i,pi的为真,那么唯一确认的方法就是无限次运行可判定(pn)。任何终止决策程序只能
我想有一个Ltac策略,它可以完成析取通勤的工作。主要是,如果我在假设H中的某个地方有一个子项P\/Q,Ltac Com H会将Q\/P作为另一个假设添加到上下文中
我试着通过一个公理来提供交换性规则,并应用它;但它只适用于简单的假设,例如在R->(P\/Q)中失败;当它应该添加到上下文R->(Q\/P)时,您可以使用setoid重写库,该库允许您使用非相等的关系进行重写。以下代码片段显示了如何在假设中用B\/A替换A\/B:
Require Import Setoid.
Variables
标签: Coq
logical-foundations
Poly模块中有4个与教堂数字相关的练习:
Definition cnat := forall X : Type, (X -> X) -> X -> X.
据我所知,cnat是一个函数,它接受一个函数f(x),它的参数x,并返回这个参数的值:f(x)
然后有4个用教堂符号表示的0、1、2和3的例子
但如何解决这个问题呢?我理解我们必须再次应用该函数。cnat返回的值将作为参数。但是如何编码呢?使用递归
Definition succ (n : cnat) : cnat
(
我使用的是Coq版本8.8.1,就我个人而言,我不明白为什么它不会评估以下计算的值
Require Import Coq.Lists.List.
Import Coq.Lists.List.ListNotations.
Require Import Coq.Classes.EquivDec.
Require Import Coq.Init.Nat.
Require Import Coq.Arith.EqNat.
Require Import Coq.Lists.ListSet.
Require
我正在学习《计算类型理论和交互式定理证明与Coq》,以及
其中一个练习是让我写类型的术语:
forall (p:bool -> Prop) (x:bool), (x = true -> p true) -> (x = false -> p false) -> p x
我尝试了显而易见的方法:
Fail Definition L7 : forall (p:bool -> Prop) (x:bool), (x = true -> p true) ->
Coq似乎假设了爆炸原理(PEP)
由无构造函数的数据类型定义生成的归纳原则为PEP:
这一原则似乎对于证明析取三段论之类的东西是必要的:
Lemma disj_syll : forall (A B: Prop), A \/ B -> (not B) -> A.
Proof.
intros.
destruct H.
- (* prove A from A *) assumption.
- (* prove A from B and ~B *) contradiction.
Qed.
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 42 页