- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Coq 的新手,但对于我的项目,我必须在 Coq 中使用联合查找数据结构。 Coq 中是否有 union-find(不相交集)数据结构的实现?
如果没有,有人可以提供实现或一些想法吗?它不必非常有效。 (不需要进行路径压缩或所有花哨的优化)我只需要一个可以容纳任意数据类型的数据结构(或者 nat 如果它太难了)并执行:union 和找到。
提前致谢
最佳答案
如果您只需要一个数学模型,而不关心实际性能,我会选择最直接的模型:函数映射(有限偏函数),其中每个元素都可以选择链接到另一个元素合并。
注意:在这个答案的其余部分,作为 union-find 的标准,我将假设元素只是自然数。如果您想要其他类型的元素,只需使用另一个将所有元素绑定(bind)到唯一编号的映射即可。
然后您将定义一个函数 find : UnionFind → nat → nat
返回给定元素的规范代表,尽可能长时间地跟踪链接。请注意,该函数将使用递归,其终止参数并非微不足道。要做到这一点,我认为最简单的方法是保持一个数字只链接到一个较小的数字的不变性(即如果 i
链接到 j
,那么 i > j
).然后递归终止,因为当跟随链接时,当前元素是递减的自然数。
定义函数 union : UnionFind → nat → nat → UnionFind
更简单:union m i j
简单地返回一个更新后的映射 max i' j'
链接到 min i' j'
,其中 i' = find m i
和 j' = find m j
。
[关于性能的旁注:保持不变量意味着您不能根据它们的等级充分选择一对分区中的哪一个合并到另一个;但是,如果需要,您仍然可以实现路径压缩!]
至于 map 究竟使用哪种数据结构:有几种可用。standard library (查看标题 FSets)有几个实现(FMapList、FMapPositive 等)满足接口(interface) FMapInterface .stdpp 库有 gmap .
同样,如果性能不是问题,只需选择最简单的编码,或者更重要的是,选择使您的证明最简单的编码。我想的只是一个自然数列表。列表的位置是倒序的元素。列表的值是偏移量,即为了到达链接的目标而向前跳过的位置数。
j
的元素 i
(i > j
),偏移量是 i − j
.凭借我最好的伪 ASCII 艺术技能,这是一张 map ,其中链接为 { 6↦2, 4↦2, 3↦0, 2↦1 },规范代表为 { 5, 1, 0 } :
6 5 4 3 2 1 0 element
↓ ↓ ↓ ↓ ↓ ↓ ↓
/‾‾‾‾‾‾‾‾‾↘
[ 4 ; 0 ; 2 ; 3 ; 1 ; 0 ; 0 ] map
\ \____↗↗ \_↗
\___________/
动机是上面讨论的不变量然后在结构上被强制执行。因此,希望 find
实际上可以通过结构归纳(在列表的结构上)来定义,并且可以免费终止。
它描述了 ML 中高效联合查找数据结构的实现,从用户的角度来看是持久的,但在内部使用变异。你可能更感兴趣的是,他们在 Coq 中证明了它是正确的,这意味着他们有一个联合查找的 Coq 模型。然而,这个模型反射(reflect)了他们试图证明正确的命令式程序的内存存储。我不确定它是否适用于您的问题。
关于data-structures - 如何在 Coq 中实现联合查找(不相交集)数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66630519/
我正在尝试理解 Coq 定理: Theorem thm0 : UseCl Pos (PredVP (UsePN john_PN) walk_V) -> UseCl Pos
编辑 Require Import Bool List ZArith. Variable A: Type. Inductive error := | Todo. Induc
我试图在 Coq 中证明以下引理: Lemma not_eq_S2: forall m n, S m <> S n -> m <> n. 这似乎很容易,但我不知道如何完成证明。有人可以帮帮我吗? 谢谢
我想查看我的证明中使用的所有公理。 获取此类信息的最简单方法是什么? 我将使用哪些命令、脚本或工具? 我对所有公理或所有使用过的公理感兴趣。 最佳答案 你应该使用 Print Assumptions
我想以某种方式限制在归纳定义中允许什么样的输入构造函数。说我想说定义二进制数如下: Inductive bin : Type := | O : bin | D : bin -> bin |
Coq 标准库中是否有对自然数进行欧几里德除法的函数?我一直无法找到一个。如果没有,那么从数学上讲,是否有理由不应该有一个? 我想要这个的原因是因为我试图将一个列表分成两个较小的列表。我希望一个列表的
我在将参数传递给 coq 中的产品类型时遇到问题。我有一个看起来像这样的定义, Definition bar (a:Type) := a->Type. 我需要定义一个函数,它接收“a”和“ba
这是本在线类(class)中出现的证明https://softwarefoundations.cis.upenn.edu/plf-current/StlcProp.html#lab222 . Proo
在命题和谓词演算中证明了数十个引理后(有些比其他的更具挑战性,但通常仍然可以在 intro-apply-destruct 自动驾驶仪上证明)我从 ~forall 开始打了一个并立即被捕获。显然,我缺乏
我正在学习命题逻辑和推理规则。析取三段论规则指出,如果我们的前提中有(P 或 Q),并且也有(非 P);然后我们可以到达Q。 我一生都无法弄清楚如何在 Coq 中做到这一点。假设我有: H : A \
从 Coq 引用手册 (8.5p1) 来看,我的印象是 revert是 intro 的倒数,但 generalize 也是如此在某种程度上。例如,revert和 generalize dependen
假设我知道某些自然数是好的。我知道 1 很好,如果 n 很好,那么 3n 就是,如果 n 很好,那么 n+5 就是,这些只是构造好数字的方法。在我看来,这在 Coq 中的充分形式化是 Inductiv
通常在 Coq 中,我发现自己在做以下事情:我有证明目标,例如: some_constructor a c d = some_constructor b c d 而我真的只需要证明a = b因为无论如
我希望能够为不同的归纳定义定义相同的 Coq 符号,并根据参数的类型区分这些符号。 这是一个最小的例子: Inductive type : Type := | TBool : type. Induct
有没有办法对 Coq 的类型类使用递归?例如,在为列表定义显示时,如果您想调用 show递归列表函数,那么你将不得不使用这样的固定点: Require Import Strings.String. R
假设我有一个解决某种引理的奇特策略: Ltac solveFancy := some_preparation; repeat (first [important_step1 | importa
我是 Coq 的新手。我注意到可以使用在 Coq 中定义空集 Inductive Empty_set : Set :=. 是否也可以将函数从空集定义为另一个通用集/类型? 如果是这样怎么办? 最佳答案
有人能给我一个 Coq 中存在实例化和存在泛化的简单例子吗?当我想证明exists x, P ,其中 P是一些 Prop使用 x ,我经常想命名x (如 x0 或类似的),并操纵 P。这可以是 Coq
我见过很多在功能上相互重叠的 Coq 策略。 例如,当您在假设中有确切的结论时,您可以使用 assumption , apply , exact , trivial ,也许还有其他人。其他示例包括 d
我需要使用标准库中称为 Coq.Arith.PeanoNat ( https://coq.inria.fr/library/Coq.Arith.PeanoNat.html ) 的部分。 我尝试过导入整
我是一名优秀的程序员,十分优秀!