- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我试图证明一个关于递归函数的定理时(见下文),我最终得到了一个可约表达式
(fix picksome L H := match A with .... end) L1 H1 = RHS
match
表达,但 Coq 拒绝了。做
simpl
只是将右手边扩展成无法阅读的困惑。为什么 Coq 不能用
simpl; reflexivity
完成证明,以及应该如何指示 Coq 精确展开 redex,并完成证明?
pick
这需要一个
list nat
并取第一个
nat
叫
a
, 丢弃以下
a
列表中的项目,并在剩余的列表上递归。 IE。
pick [2;3;4;0;1;3])=[2; 0; 1]
Require Import Arith.
Require Import List.
Import ListNotations.
Fixpoint drop {T} n (l:list T) :=
match n,l with
| S n', cons _ l' => drop n' l'
| O, _ => l
| _, _ => nil
end.
Lemma drop_lemma_le : forall {T} n (l:list T), length (drop n l) <= (length l).
Proof.
intros; generalize n; induction l; intros; destruct n0; try reflexivity;
apply le_S; apply IHl.
Defined.
Lemma picksome_term: forall l l' (a :nat),
l = a::l' -> Acc lt (length l) -> Acc lt (length (drop a l')).
Proof.
intros; apply H0; rewrite H; simpl; apply le_lt_n_Sm; apply drop_lemma_le.
Defined.
Fixpoint picksome (l:list nat) (H : Acc lt (length l)) {struct H}: list nat :=
match l as m return l=m -> _ with
| nil => fun _ => nil
| cons a l' => fun Hl =>
cons a (picksome (drop a l')
(picksome_term _ _ _ Hl H))
end
(eq_refl _).
Definition pick (l:list nat) : list nat := picksome l (lt_wf (length l)).
Inductive zerolist : list nat -> Prop :=
| znil : zerolist nil
| hzlist : forall l, zerolist l -> zerolist (O::l).
H
:
Theorem pickzero': (forall k, pick (0::k) = 0::pick k) ->
forall l, zerolist l -> pick l = l.
Proof.
intros H l H0; induction H0; [ | rewrite H; rewrite IHzerolist]; reflexivity.
Qed.
(* but trying to prove the lemma *)
Lemma pickzero_lemma : forall k, pick (0::k) = 0::pick k.
induction k; try reflexivity.
unfold pick at 1.
unfold picksome.
a : nat
k : list nat
IHk : pick (0 :: k) = 0 :: pick k
============================
(fix picksome (l : list nat) (H : Acc lt (length l)) {struct H} :
list nat :=
match l as m return (l = m -> list nat) with
| [] => fun _ : l = [] => []
| a0 :: l' =>
fun Hl : l = a0 :: l' =>
a0 :: picksome (drop a0 l') (picksome_term l l' a0 Hl H)
end eq_refl) (0 :: a :: k) (lt_wf (length (0 :: a :: k))) =
0 :: pick (a :: k)
最佳答案
Coq 关于定点的归约规则非常简单:当且仅当定点应用于“构造”项时,您才能展开定点的一个步骤。例如 length (1 :: nil)
会减少,但在上下文中是 l = 1 :: nil
, length l
不会减少。您必须明确替换 l
按构造项1 :: nil
以减少追加。
在您的目标中,picksome
由 H
上的结构递归定义,可访问性证明。如果您尝试 simpl
,减少实际上发生,并在此参数不再“构造”时停止。在您的特定情况下,在 simpl
之后你最终会得到一个 (fix picksome ...) (drop a1 l'0) (nat_ind <big term>)
证明,并且 Coq 不能减少 picksome
了。
编辑:为了完成你的证明,我首先尝试证明:
Lemma picksome_unfold :
forall (hd:nat) (tl:list nat) (H:Acc lt (length (hd::tl))), picksome (hd::tl) H =
cons hd (picksome (drop hd tl) (picksome_term (hd::tl) tl hd (eq_refl (hd::tl)) H)).
H
,这很容易)。然而要完成
pickzero_lemma
引理,我需要证明可访问性证明的相等性,这可能需要证明无关紧要。我不确定,抱歉。
关于recursion - 如何让 Coq 评估特定的 redex(或者 - 在这种情况下它为什么拒绝?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27355075/
定义语义的常见方法是(例如): return v if [some other condition] otherwise, return error 例如,考虑 (define-language si
完全可以在不使用求值上下文的情况下为我的语言编写求值规则。我的语义完全是按值调用的,不允许在 lambda 内部向前推进该术语。尽管如此,我看到的所有资源都以某种方式使用了归约上下文。使用我缺少的上下
每次我在 PLT redex 中定义一种语言时,我都需要手动定义一个(避免捕获)替换函数。例如,此模型尚未完成,因为 subst 未定义: #lang racket/base (require red
我正致力于在类型系统的 Redex 中构建一个模型,该模型也具有规范的实现。我想使用 redex-check 来针对实际实现对我的模型进行模糊测试。 实现(带有适配器)可以采用我的抽象语法,所以我需要
我正在使用[regex]::matches($string, $pattern)在日志文件的两行之间搜索行。 我的文件(节选): -----end----- AAA BBB CCC -----star
我相信我对等递归和等递归类型都非常了解。因此,我一直在尝试使用 PLT Redex 中的等递归类型为 ISWIM 实现类型检查器。但是,对于我的一生,我无法弄清楚如何使类型等效起作用。其他一切都很好。
这是一个困扰我一段时间的问题,我想知道这里是否有人可以提供帮助。 我有一个名为 lambdaLVar 的语言的 PLT Redex 模型,它或多或少是一种花园式的无类型 lambda 演算,但扩展了一
我正在尝试为一种语言准备语义。某些推导可能会导致“卡住”状态。我想测试一下,哪个术语不能降低到“卡住”状态。是否可以使用 test-->E 之类的东西来表示它? 最佳答案 这是改编自 λv examp
当我试图证明一个关于递归函数的定理时(见下文),我最终得到了一个可约表达式 (fix picksome L H := match A with .... end) L1 H1 = RHS 我想扩展ma
我没有看到 facebook 给出任何关于为什么 redex 比使用 proguard 更好的统计数据。谁能列出优缺点?显然,redex 应该能让 Android 运行得更快。有一篇差文http://
P在Redis中用来表示毫秒。PSETEX 等命令用于设置以毫秒 (P) 为单位的到期时间。我找不到使用 P 的任何原因 - 谁能解释一下用于毫秒的字母 P 的词根是什么? 最佳答案 P 代表prec
我是一名优秀的程序员,十分优秀!