- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是一个初学者,我被 Coq 关于 nat 列表的证明困住了。
我有一个 list
reg of nat
和一个函数 clear_regs,它将每个值更改为 0 并保持第三个值(索引 2)不变。
我想证明forall regs, clear_regs regs = clear_regs (clear_regs regs)
。
我目前有两个功能,但我不知道一个是否比另一个更好。
(1) 第一个是用辅助递归函数定义的,该函数采用(降序)索引并检查它是否是第三个值。如果是这种情况,它会保留其值,否则会生成 0。
(2) 第二个将 (fun x => 0)
映射到 reg 并用 (nth 2 reg 0)
更新第三个值。我正在使用 let
指令来保持它的值。
我尝试了归纳之类的方法,但它似乎并没有将证明引向正确的路径。我真的不知道我应该如何处理这个问题。有人可以帮助我吗?
最佳答案
我有两条评论,首先,您关于“注册 2 号”的说法似乎有点特别。为什么是2?如果数字或寄存器为 1 会怎样?
试图证明这种过于具体的引理通常会使 Coq 中的证明复杂化。您最好尝试证明一个更一般的引理,例如“对于 n 寄存器机器,将 k < n 寄存器设置两次是幂等的。”该结果的证明在库中为 set_set_nth
。您可以将设置与“置零”寄存器操作结合起来。我做了你所说的证明,你可以在这里比较任意 2 如何使大小推理复杂化:
From mathcomp
Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Implicit Type (reg : seq nat).
(* You could also use take/drop to perform surgery *)
Definition clear_regs reg :=
set_nth 0 (nseq (size reg) 0) 2 (nth 0 reg 2).
Definition idem A (f : A -> A) := forall x, f (f x) = f x.
Lemma clear_regs_idem : idem clear_regs.
Proof.
(* We reduce equality of lists to equality of their elements, `eq_from_nth` *)
move=> reg; apply: (@eq_from_nth _ 0).
by rewrite !size_set_nth !size_nseq maxnA maxnn.
(* Now we need to use the fact that nth (set s x) = x, plus a bit of case reasoning *)
move=> i i_sz; rewrite !nth_set_nth /=; case: eqP => [//|].
by rewrite !nth_nseq; case: ifP; case: ifP.
Qed.
请注意,证明是无归纳的,因为所有需要的归纳都封装在更高级别的 seq 引理中!我猜你可能很难通过单一归纳来证明这个引理,因为你可能需要建立一个非常复杂的归纳假设。因此,最好组合几个较小的。
另一种可能更好的方法是为您的寄存器使用更强的表示。特别是,我选择使用 mathcomp 具有的一种很好的数据类型,称为“有限支持的函数”,即来自有限数据类型的映射。我们用映射 'I_n.+1 -> nat
表示 n 个寄存器,其中 'I_n
是小于 n 的自然数的类型。即使在您的临时案例中,您也可以看到它运行良好:
From mathcomp
Require Import choice fintype finfun.
Section Regs.
Variable k : nat.
Definition reg := {ffun 'I_k.+1 -> nat}.
Implicit Type (r : reg).
Definition clearr r : reg :=
[ffun idx => if idx == (inord 2) then r (inord 2) else 0].
Lemma clearr_idem : idem clearr.
Proof. by move=> x; apply/ffunP=> j; rewrite !ffunE eqxx. Qed.
ffunP
引理是映射可扩展性:两个映射是相等的,当且仅当它们映射到相同的元素,其余是常规的(eqxx 将重写 x == x
为 真
。
这里有可运行代码:https://x80.org/collacoq/omemesamoy.coq让我知道任何问题。
问候,E.
关于coq - 清除列表但只有一个元素的函数的幂等性证明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37723304/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!