- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Y) (s : Stream X) : Stream Y := Cons-6ren">
Require Import Streams.
CoFixpoint map {X Y : Type} (f : X -> Y) (s : Stream X) : Stream Y :=
Cons (f (hd s)) (map f (tl s)).
CoFixpoint interleave {X : Type} (s : Stream X * Stream X) : Stream X := Cons (hd (fst s)) (Cons (hd (snd s)) (interleave (tl (fst s), tl (snd s)))).
Lemma map_interleave : forall {X Y : Type} (f : X -> Y) (s1 s2 : Stream X), map f (interleave (s1, s2)) = interleave (map f s1, map f s2).
Proof.
Fail cofix. (* error *)
Abort.
Ltac call to "cofix" failed.
Error: All methods must construct elements in coinductive types.
map
和
interleave
是直接的核心递归函数,用于构建共导类型的值。有什么问题?
最佳答案
问题源于=
符号代表 eq
,这是一种感应类型,而不是共感应类型。
相反,您可以显示流 map f (interleave (s1, s2))
和 interleave (map f s1, map f s2)
外延相等。这是 Coq 引用手册的摘录 ( §1.3.3 )
In order to prove the extensionally equality of two streams
s1
ands2
we have to construct an infinite proof of equality, that is, an infinite object of typeEqSt s1 s2
.
eq
至
EqSt
我们可以证明引理:
Lemma map_interleave : forall {X Y : Type} (f : X -> Y) (s1 s2 : Stream X),
EqSt (map f (interleave (s1, s2))) (interleave (map f s1, map f s2)).
Proof.
cofix.
intros X Y f s1 s2.
do 2 (apply eqst; [reflexivity |]).
case s1 as [h1 s1], s2 as [h2 s2].
change (tl (tl (map f (interleave (Cons h1 s1, Cons h2 s2))))) with
(map f (interleave (s1, s2))).
change (tl (tl (interleave (map f (Cons h1 s1), map f (Cons h2 s2))))) with
(interleave (map f s1, map f s2)).
apply map_interleave.
Qed.
关于coq - Ltac 调用 "cofix"失败。错误 : All methods must construct elements in coinductive types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44611655/
我想写一个带有可选变量名的策略。原始策略如下所示: Require Import Classical. Ltac save := let H := fresh in apply NNPP;
我正在做一些关于在 Coq 中形式化简单类型的 lambda 演算的练习,并且想使用 Ltac 自动化我的证明。在证明进步定理时: Theorem progress : forall t T,
我有一个包含对一些引理的调用的目标 foo在比赛的分支内。该调用使用变量 R 作为其参数之一。分行本地: | SomeConstr => fun R => .... (foo a b c R) ...
我如何调用 rewrite在 ltac 中只重写一次?我认为 coq 的文档提到了一些关于 rewrite at 的内容。但我还没有能够在实践中实际使用它,也没有例子。 这是我正在尝试做的一个例子:
是否有一种方法可以定义一个“本地”Ltac 表达式,我可以用它来证明引理但在外部不可见? Lemma Foo ... Proof. Ltac ll := ... destrict t.
在尝试创建一个循环可变长度参数列表的 Ltac 定义时,我在 Coq 8.4pl2 上遇到了以下意外行为。谁能给我解释一下吗? Ltac ltac_loop X := match X with
是否有一种方法可以定义一个“本地”Ltac 表达式,我可以用它来证明引理但在外部不可见? Lemma Foo ... Proof. Ltac ll := ... destrict t.
我正在寻找一种方法来通过它的名字来匹配它。像这样: Ltac mytactic h_name := let h := hyp_from_name h_name in match h with
我想在 coq 中制定一个 Ltac 策略,它需要 1 个或 3 个参数。我读过 ltac_No_arg在 LibTactics 模块,但如果我理解正确,我将不得不调用我的策略: Coq idtac
在 Ltac 中,依赖归纳对我来说似乎不同。并不是。 以下工作正常: Require Import Coq.Program.Equality. Goal forall (x:unit) (y:unit
我想在某些假设存在而另一个假设不存在的情况下应用规则。我如何检查是否存在这种情况? 例如: Variable X Y : Prop. Axiom A: X -> Y. Axiom B: X -> Z.
我在看QuickChick项目的时候遇到了Require Import Ltac.这句话我不知道这是做什么的以及 Ltac 在哪里模块是。我找到了一个文件 plugins/ltac/Ltac.v ,但
Ltac checkForall H := let T := type of H in match T with | forall x, ?P x => idtac | _ =
Require Import Streams. CoFixpoint map {X Y : Type} (f : X -> Y) (s : Stream X) : Stream Y := Cons
我是一名优秀的程序员,十分优秀!