这是一个递归函数all_zero
,用于检查自然数列表中的所有成员是否为零:
Require Import Lists.List.
Require Import Basics.
Fixpoint all_zero ( l : list nat ) : bool :=
match l with
| nil => true
| n :: l' => andb ( beq_nat n 0 ) ( all_zero l' )
end.
Run Code Online (Sandbox Code Playgroud)
现在,假设我有以下目标
true = all_zero (n :: l')
Run Code Online (Sandbox Code Playgroud)
我想用这个unfold
策略将其转化为
true = andb ( beq_nat n 0 ) ( all_zero l' )
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不能用一个简单的方法来做,unfold all_zero
因为战术会急切地找到并替换所有的实例all_zero
,包括一次展开形式的实例,它变成一团糟.有没有办法避免这种情况并只展开一次递归函数?
我知道我可以通过证明临时等价来获得相同的结果assert (...) as X
,但效率很低.我想知道是否有一种简单的方法可以做到这一点unfold
.
这是我对回文的归纳定义:
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) CPDT的第三章简要讨论了为什么在Coq中禁止负归纳类型.如果我们有
Inductive term : Set :=
| App : term -> term -> term
| Abs : (term -> term) -> term.
Run Code Online (Sandbox Code Playgroud)
然后我们可以轻松定义一个函数
Definition uhoh (t : term) : term :=
match t with
| Abs f => f t
| _ => t
end.
Run Code Online (Sandbox Code Playgroud)
因此该术语uhoh (Abs uhoh)
将是非终止的,"我们将能够证明每个定理".
我理解非终止部分,但我不知道如何用它来证明任何东西.如何False
使用term
上面定义的证明?
这是pc
我在数学定理中使用的归纳类型.
Inductive pc ( n : nat ) : Type :=
| pcs : forall ( m : nat ), m < n -> pc n
| pcm : pc n -> pc n -> pc n.
Run Code Online (Sandbox Code Playgroud)
另一种归纳类型pc_tree
,它基本上是一个包含一个或多个pc
s 的二叉树.pcts
是包含单个叶节点的构造pc
,并且pctm
是一个包含多个内部节点构造pc
秒.
Inductive pc_tree : Type :=
| pcts : forall ( n : nat ), pc n -> pc_tree
| pctm : pc_tree -> pc_tree -> pc_tree.
Run Code Online (Sandbox Code Playgroud)
并且是一个归纳定义的命题 …
我试图在Prolog中编码基本的逻辑推理,我想定义一些自定义运算符来简化表示法.如果我能|-
为⊢ 打字,那将会很方便.所以我试过了
:- op(1150, xfy, [ '|-' ]).
gamma |- a.
Gamma |- or(A,_) :- Gamma |- A.
Gamma |- or(_,A) :- Gamma |- A.
Run Code Online (Sandbox Code Playgroud)
但是当我尝试查询时gamma |- or(a,X)
,我收到错误消息
ERROR: '<meta-call>'/1: Undefined procedure: gamma/0
而不是true
我期望的.
问题似乎是定义的运算符包括垂直条形字符.如果我将知识库修改为
:- op(1150, xfy, [ imp ]).
gamma imp a.
Gamma imp or(A,_) :- Gamma imp A.
Gamma imp or(_,A) :- Gamma imp A.
Run Code Online (Sandbox Code Playgroud)
然后Prolog在回答查询时没有问题gamma imp or(a,X)
.垂直条是保留字符,我不允许在定义中使用吗?或者有什么方法可以解决这个问题?
据我所知,在Vim中定义特定于文件类型的行为的推荐方法是使用.vim
files和filetype plugin
option..html
例如,要添加文件设置,我会添加filetype plugin on
我的.vimrc
并添加设置~/.vim/ftplugin/html.vim
.
然而,我能找到的这种方法的所有例子都是关于流行的现有文件类型,如.html
或.sql
.相同的修复程序是否适用于自定义文件类型?假设我想使用带扩展名的新文件类型.newft
.如果我~/.vim/ftplugin/newft.vim
使用这种新类型和加载的设置创建somefile.newft
,Vim会自动检测其类型和加载newft.vim
吗?
我问这个是因为这正是我正在做的事情,到目前为止它还没有奏效.我想知道这是一个错误还是Vim的预期行为.
在大多数编程语言中,'c'
是一个字符,"c"
也是一个长度为 1 的字符串。但是 Coq(根据其标准 ascii 和字符串库)使用"c"
这两者作为表示法,这需要不断使用 来Open Scope
明确所指的是哪一个。如何避免这种情况并以通常的方式用单引号指定字符?如果有一个解决方案仅部分覆盖标准库,更改表示法但回收其余部分,那就太好了。
假设R
某种类型存在否定关系A
.
Variable A : Type.
Variable R : A -> A -> A -> A -> A -> A -> A -> A -> A -> A -> Prop.
Run Code Online (Sandbox Code Playgroud)
X
并且Y
是略微不同的命题,它们都断言R
持有超过10个类型的术语A
.
Inductive X : Prop :=
| X_intro : forall a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,
R a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 -> X.
Record Y : Prop :=
{ a0 …
Run Code Online (Sandbox Code Playgroud) 假设我有一个假设和上下文中的H : forall ( x : X ), P x
变量。x : X
我想进行通用实例化并获得新的假设H' : P x
。最无痛的方法是什么?显然apply H in x
不起作用。assert ( P x )
其次是apply H
dos,但是如果很复杂的话可能会变得非常混乱P
。
有一个类似的问题似乎有些相关。但不确定它是否可以应用在这里。
coq ×7
character ×1
file-type ×1
notation ×1
operators ×1
palindrome ×1
plugins ×1
prolog ×1
quantifiers ×1
recursion ×1
string ×1
swi-prolog ×1
unfold ×1
vim ×1