标签: coq

在Coq中构建类层次结构?

我可以使用类型类型在Coq中天真地构建代数结构的层次结构.我在查找Coq语法和类型类语义方面遇到了一些麻烦.但是,我相信以下是半群,幺半群和交换幺半群的正确实现:

Class Semigroup {A : Type} (op : A -> A -> A) : Type := {
  op_associative : forall x y z : A, op x (op y z) = op (op x y) z
}.

Class Monoid `(M : Semigroup) (id : A) : Type := {
  id_ident_left  : forall x : A, op id x = x;
  id_ident_right : forall x : A, op x id = x
}.  

Class AbelianMonoid `(M : Monoid) : Type := …
Run Code Online (Sandbox Code Playgroud)

scope functional-programming typeclass coq

10
推荐指数
1
解决办法
1010
查看次数

无法找到变量的实例

上下文:我正在从事软件基础的练习.

Theorem neg_move : forall x y : bool,
  x = negb y -> negb x = y.
Proof. Admitted.

Theorem evenb_n__oddb_Sn : forall n : nat,
  evenb n = negb (evenb (S n)).
Proof.
  intros n. induction n as [| n'].
  Case "n = 0".
    simpl. reflexivity.
  Case "n = S n'".
    rewrite -> neg_move.
Run Code Online (Sandbox Code Playgroud)

在最后一行之前,我的子目标是这样的:

evenb (S n') = negb (evenb (S (S n')))
Run Code Online (Sandbox Code Playgroud)

我想将其转化为:

negb (evenb (S n')) = evenb (S (S n'))
Run Code Online (Sandbox Code Playgroud)

rewrite -> …

coq

10
推荐指数
1
解决办法
1931
查看次数

Coq中的"详细"汽车

我正在学习Coq和我正在学习的书,(CPDT)大量使用auto证明.

因为我正在学习,所以我认为确切地看到auto引擎盖下的内容可能会有所帮助(早期越少越好).有没有办法强制它显示它用于计算证据的确切策略或技术?

如果没有,是否有一个地方详细说明了什么auto呢?

coq verbose

10
推荐指数
1
解决办法
1356
查看次数

Coq中一致的套装配方?

我是Coq的新手,并试图根据我的研究开发一个框架.我的工作非常沉重,而且由于Coq似乎对待集合而我编码很困难.

TypeSet,他们称之为"排序",我可以用它们来定义一个新的集合:

Variable X: Type.
Run Code Online (Sandbox Code Playgroud)

然后有一个库编码(子)设置为' Ensembles ',它们是从一些Type到另一个的函数Prop.换句话说,它们是对a的谓词Type:

Variable Y: Ensemble X.
Run Code Online (Sandbox Code Playgroud)

Ensemble感觉更像是适当的数学集合.此外,它们是由许多其他图书馆建立的.我已经尝试过关注它们:定义一个通用集U: Set,然后将自己限制在(子)EnsembleU.但不是.Ensembles不能用作其他变量的类型,也不能用于定义新的子集:

Variable y: Y.           (* Error *)
Variable Z: Ensemble Y.  (* Error *)
Run Code Online (Sandbox Code Playgroud)

现在,我知道有几种方法可以解决这个问题.问题" 子集参数 "提供了两个.两者都使用强制.第一个坚持Sets.第二个基本上使用Ensembles(虽然不是名字).但两者都需要相当多的机器才能完成如此简单的事情.

问题:一致(优雅)处理集的推荐方法是什么?

示例:以下是我想要做的示例:假设设置DD.定义一对dm =(D,<),其中DDD的有限子集,而<D上的严格偏序.

我敢肯定,通过强制修改或其他结构,我可以完成它; 但不是特别易读; 并没有很好的直觉,如何进一步操纵结构.例如,以下类型检查:

Record OrderedSet {DD: Set} : Type := …
Run Code Online (Sandbox Code Playgroud)

set subset coq

10
推荐指数
1
解决办法
1304
查看次数

Coq:Prop与类型中的设置(n)

我想考虑以下三个(相关的?)Coq定义.

Inductive nat1: Prop :=
  | z1 : nat1
  | s1 : nat1 -> nat1.

Inductive nat2 : Set := 
  | z2 : nat2
  | s2 : nat2 -> nat2.

Inductive nat3 : Type :=
  | z3 : nat3
  | s3 : nat3 -> nat3.
Run Code Online (Sandbox Code Playgroud)

这三种类型都给出了归纳原则来证明一个命题.

nat1_ind
     : forall P : Prop, P -> (nat1 -> P -> P) -> nat1 -> P

nat2_ind
     : forall P : nat2 -> Prop,
       P z2 -> (forall n : nat2, P n …
Run Code Online (Sandbox Code Playgroud)

types functional-programming coq

10
推荐指数
1
解决办法
1595
查看次数

使用由定义明确的归纳定义的递归函数进行计算

当我用来Function在Coq中定义非结构递归函数时,在询问特定计算时,结果对象的行为很奇怪.实际上,Eval compute in ...指令不是直接给出结果,而是返回相当长的(通常为170 000行)表达式.似乎Coq无法评估所有内容,因此返回一个简化(但很长)的表达式而不仅仅是一个值.

这个问题似乎来自我证明所产生义务的方式Function.首先,我认为问题来自我使用的不透明术语,并且我将所有的引理转换为透明常量.那么,有没有办法列出一个术语中出现的不透明术语?或者任何其他方式将不透明的引理变成透明的引理?

然后我说,问题来自于所使用的订单有充分根据的证据.但我得到了奇怪的结果.

例如,我log2通过重复应用来定义自然数div2.这是定义:

Function log2 n {wf lt n} :=
  match n with
  | 0 => 0
  | 1 => 0
  | n => S (log2 (Nat.div2 n))
  end.
Run Code Online (Sandbox Code Playgroud)

我有两个证明义务.第一个检查n尊重lt递归调用中的关系,并且可以很容易地证明.

forall n n0 n1 : nat, n0 = S n1 -> n = S (S n1) -> Nat.div2 (S (S n1)) < S (S n1)

intros. apply Nat.lt_div2. apply le_n_S. apply …
Run Code Online (Sandbox Code Playgroud)

coq

10
推荐指数
1
解决办法
825
查看次数

在coq中逐步简化?

有没有办法一次简化一步?

假设您f1 (f2 x)可以通过单一依次简化这两者simpl,是否可以简化f2 x作为第一步,检查中间结果然后简化f1

以例如定理为例:

Theorem pred_length : forall n : nat, forall l : list nat,
  pred (length (n :: l)) = length l.
Proof.
  intros.
  simpl.
  reflexivity.
Qed.
Run Code Online (Sandbox Code Playgroud)

simpl战术简化Nat.pred (length (n :: l))length l.有没有办法将其分解为两步简化,即:

Nat.pred (length (n :: l)) --> Nat.pred (S (length l)) --> length l
Run Code Online (Sandbox Code Playgroud)

coq

10
推荐指数
2
解决办法
676
查看次数

Coq/Proof General中的Agda编程?

与Agda不同,Coq倾向于将证明与功能分开.Coq提供的策略非常适合编写校样,但我想知道是否有办法复制一些Agda模式功能.

具体来说,我想:

  • 一些相当于Agda ?或Haskell的_,我可以在编写时省略函数的一部分,并且(希望)让Coq告诉我需要放在那里的类型
  • 相当于Agda模式下的Cc Cr(reify),?用一个函数填充一个块,它将?为所需的参数创建新块
  • 当我match在函数中执行时,让Coq自动写入扩展可能的分支(如Agda模式中的Cc Ca)

这是可能的,在CoqIde或Proof General中?

coq agda dependent-type proof-general coqide

10
推荐指数
2
解决办法
969
查看次数

Why are the real numbers axiomatized in Coq?

I was wondering whether Coq defined the real numbers as Cauchy sequences or Dedekind cuts, so I checked Coq.Reals.Raxioms and... none of these two. The real numbers are axiomatized, along with their operations (as Parameters and Axioms). Why is it so?

Also, the real numbers tightly rely on the notion of subset, since one of their defining properties is that is every upper bounded subset has a least upper bound. The Axiom completeness encodes those subsets as Prop …

coq real-number

10
推荐指数
1
解决办法
359
查看次数

我可以告诉Coq从n到n + 2进行归纳吗?

我试图看看是否可以evenb n = true <-> exists k, n = double khttps://softwarefoundations.cis.upenn.edu/lf-current/Logic.html证明,而不涉及奇数.我尝试过以下内容:

Theorem evenb_double_k : forall n,
  evenb n = true -> exists k, n = double k.
Proof.
  intros n H. induction n as [|n' IHn'].
  - exists 0. reflexivity.
  - (* stuck *)
Run Code Online (Sandbox Code Playgroud)

但显然感应一次只能起作用一个自然数,exists k : nat, S n' = double k显然不可证明.

n' : nat
H : evenb (S n') = true
IHn' : evenb n' = true -> exists k : nat, …
Run Code Online (Sandbox Code Playgroud)

coq induction

10
推荐指数
2
解决办法
229
查看次数