标签: coq

Coq:如何将一个假设应用于另一个假设

假设我在上下文中有两个假设,a_b : A -> B并且a : A.我应该能够申请a_ba获得进一步的假设,b : B.

也就是说,给定以下状态:

1 subgoal
A : Prop
B : Prop
C : Prop
a_b : A -> B
a : A
______________________________________(1/1)
C
Run Code Online (Sandbox Code Playgroud)

应该有一些策略,foo (a_b a)将其转换为以下状态:

1 subgoal
A : Prop
B : Prop
C : Prop
a_b : A -> B
a : A
b : B
______________________________________(1/1)
C
Run Code Online (Sandbox Code Playgroud)

但我不知道是什么foo.

我能做的一件事是:

 assert B as b.
 apply a_b. …
Run Code Online (Sandbox Code Playgroud)

coq

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

如何在Coq中使用归纳型案例

我想用这种destruct策略来证明案件的陈述.我在线阅读了几个例子,我很困惑.有人能更好地解释一下吗?

这是一个小例子(有其他方法可以解决它,但尝试使用destruct):

 Inductive three := zero 
                  | one 
                  | two.
 Lemma has2b2: forall a:three, a<>zero /\ a<>one -> a=two.
Run Code Online (Sandbox Code Playgroud)

现在一些在线示例建议执行以下操作:

intros. destruct a.
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到:

3 subgoals H : zero <> zero /\ zero <> one
______________________________________(1/3) 
zero = two

______________________________________(2/3) 
one = two

______________________________________(3/3) 
two = two
Run Code Online (Sandbox Code Playgroud)

所以,我想证明前两种情况是不可能的.但机器将它们列为子目标,并希望我证明它们......这是不可能的.

摘要:如何准确丢弃不可能的案例?

我看过一些使用的例子,inversion但我不明白这个程序.

最后,如果我的引理依赖于几种归纳类型并且我仍想覆盖所有情况,会发生什么?

logic coq

9
推荐指数
2
解决办法
3642
查看次数

Emacs下Coq/Proof General中关键字和运算符的Unicode字形

此问题与在Emacs中的Proof General中配置Coq模式有关.

我正在尝试让Emacs使用相应的Unicode字形自动替换Coq中的关键字和符号.我设法定义fun为希腊小写lambdaλ,forall作为通用量词符号∀等.我没有问题定义单词的符号.

问题是,当我尝试定义操作符=>,->,<->等他们的Unicode符号⇒→↔,他们不是在勒柯克相应的Unicode字形所取代.但是,*scratch*当我测试它们时,它们会在缓冲区中被替换.我使用相同的机制将Unicode glyps与Coq表示法匹配:

(defun define-glyph (string char-info)
  (font-lock-add-keywords
   nil
   `((,(format "\\<%s\\>" string)
      (0 (progn
       (compose-region
        (match-beginning 0) (match-end 0)
        ,(apply #'make-char char-info))
       nil))))
   ))
Run Code Online (Sandbox Code Playgroud)

我怀疑问题是Coq模式将某些标点符号标记为特殊标记,因此Emacs忽略了我的代码以用Unicode字形替换它们,但我不确定.有人可以帮我解释一下吗?

unicode emacs elisp coq proof-general

9
推荐指数
1
解决办法
932
查看次数

在Coq中定义Ackermann时出错

我试图在Coq中定义Ackermann-Peters函数,我收到一条我不明白的错误消息.正如你所看到的,我把a, bAckermann 的论据打包成一对ab; 我提供了一个定义参数的排序函数的排序.然后我使用Function表单来定义Ackermann本身,为它提供ab参数的排序函数.

Require Import Recdef.    
Definition ack_ordering (ab1 ab2 : nat * nat) :=
    match (ab1, ab2) with
    |((a1, b1), (a2, b2)) => 
       (a1 > a2) \/ ((a1 = a2) /\ (b1 > b2))   
    end.
Function ack (ab : nat * nat) {wf ack_ordering} : nat :=
match ab with
| (0, b) => b + 1
| (a, 0) => ack (a-1, 1)
| (a, b) => ack (a-1, …
Run Code Online (Sandbox Code Playgroud)

coq ackermann totality

9
推荐指数
1
解决办法
1336
查看次数

证明可逆列表是Coq中的回文

这是我对回文的归纳定义:

Inductive pal { X : Type } : list X -> Prop :=
  | pal0 : pal []
  | pal1 : forall ( x : X ), pal [x]
  | pal2 : forall ( x : X ) ( l : list X ), pal l -> pal ( x :: l ++ [x] ).
Run Code Online (Sandbox Code Playgroud)

我想从Software Foundations中证明这个定理:

Theorem rev_eq_pal : forall ( X : Type ) ( l : list X ),
  l = rev l -> …
Run Code Online (Sandbox Code Playgroud)

palindrome theorem-proving coq logical-foundations

9
推荐指数
1
解决办法
957
查看次数

Coq在使用重写策略时找不到子项

我正在尝试compile_correct从依赖类型的认证编程的第一章做一个修改过的证明.在我的版本中,我试图利用progDenote折叠的事实,并在证明主要引理的证据中使用较弱的归纳假设compile_correct.

与本书相同的代码是:

Require Import Bool Arith List.
Set Implicit Arguments.

Inductive binop : Set := Plus | Times.

Inductive exp : Set :=
  | Const : nat -> exp
  | Binop : binop -> exp -> exp -> exp.

Definition binopDenote (b : binop) : nat -> nat -> nat :=
  match b with
    | Plus => plus
    | Times => mult
  end.

Fixpoint expDenote (e : exp) : nat :=
  match …
Run Code Online (Sandbox Code Playgroud)

theorem-proving coq

9
推荐指数
1
解决办法
995
查看次数

程序修复点的Coq简化

有喜欢的战术什么simplProgram FixpointS'

特别是,如何证明以下琐碎的陈述?

Program Fixpoint bla (n:nat) {measure n} :=
match n with
| 0 => 0
| S n' => S (bla n')
end.

Lemma obvious: forall n, bla n = n. 
induction n. reflexivity.
(* I'm stuck here. For a normal fixpoint, I could for instance use 
simpl. rewrite IHn. reflexivity. But here, I couldn't find a tactic 
transforming bla (S n) to S (bla n).*)
Run Code Online (Sandbox Code Playgroud)

显然,Program Fixpoint这个玩具示例没有必要,但我在一个更复杂的设置中面临同样的问题,我需要证明Program Fixpoint手动终止.

theorem-proving coq totality

9
推荐指数
1
解决办法
698
查看次数

Idris类型系统属性

理论上可以将任何Coq证明转换为Idris还是有任何限制?更抽象的问题:Idris类型系统在lambda多维数据集上的位置是什么?

这些问题的原因在于我试图了解Idris类型系统如何(和如果)与Coq类型系统相媲美.

coq dependent-type idris

9
推荐指数
0
解决办法
260
查看次数

Coq的解析器是如何实现的?

我对Coq解析器的实现方式感到非常惊讶.例如

https://www.cis.upenn.edu/~bcpierce/sf/current/Imp.html#lab321

通过给出notation命令并且后续解析器能够解析任何表达式,解析器似乎可以接受任何lexeme.所以这意味着语法必须是上下文敏感的.但这非常灵活,绝对超出了我的理解范围.

关于这种解析器在理论上如何可行的任何指针?它应该如何工作?任何材料或知识都可行.我只是试着了解一下这种类型的解析器.谢谢.

请不要让我自己阅读Coq的来源.我想检查一般的想法,但不是具体的实现.

parsing coq

9
推荐指数
2
解决办法
670
查看次数

什么是Parigot Mendler编码?

在一些Cedille源中使用以下Nats编码:

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 (? …
Run Code Online (Sandbox Code Playgroud)

coq agda isabelle idris

9
推荐指数
0
解决办法
301
查看次数