- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Z3 中进行建模,交换数组中的两个元素会创建一个排列。
交换两个元素可以非常自然地建模:
(declare-sort Obj)
; a0 is original array, a2 is array after swap
(declare-const a0 (Array Int Obj))
(declare-const a1 (Array Int Obj))
(declare-const a2 (Array Int Obj))
(declare-const i Int)
(declare-const j Int)
(assert (= a1 (store a0 i (select a0 j))))
(assert (= a2 (store a1 j (select a0 i))))
但是我如何建模“a2 是 a0 的排列”并检查这是一个有效的语句?
在类似的问题 ( Equal lists are permutations of one another. Why does Z3 answer 'unknown'? ) 中,作者提供了一个 permutation
函数,用于检查两个数组是否是彼此的排列。然而,这是两个问题。首先,该函数可以将两个数组视为排列,例如一个数组包含对象 x
两次,而另一个数组仅包含 x
一次。其次,Z3 甚至无法解决涉及此函数的非常简单的断言(因此出现了问题)。
在答案中,有人建议使用序列来模拟问题。这个答案中的排列函数还存在一个问题,如果数组可以多次包含一个对象,那么它是错误的。另外,对我来说,用序列来表达两个元素的交换模型似乎非常不自然。
最佳答案
用于证明两个数组或序列的模排列相等性的两种常见解决方案(在软件验证中)是 1. 将序列抽象为多重集,并证明它们的相等性,以及 2. 维护排列见证,即映射的函数每个元素从其新索引到其原始索引(另请参阅 this encoding of a sorting algorithm ,或者,对于无所畏惧的, this encoding of the quickselect algorithm )。
下面是您的原始编码,以及维护排列见证的代码pwi。每次修改(交换)原始数组后,见证都会更新,这样对于每个索引 k,它总是为您提供可以修改的元素的 原始 数组索引。 现在可以在索引k处找到。初始见证pw0
是身份函数。
(set-option :auto_config false)
(set-option :smt.mbqi false)
(declare-sort Obj)
; a0 is original array, a2 is array after swap
(declare-const a0 (Array Int Obj))
(declare-const a1 (Array Int Obj))
(declare-const a2 (Array Int Obj))
(declare-const i Int)
(declare-const j Int)
; Permutation witness
(declare-const pw0 (Array Int Int))
(declare-const pw1 (Array Int Int))
(declare-const pw2 (Array Int Int))
; The initial permutation witness is the identity function
(assert (forall ((k Int)) (= (select pw0 k) k)))
; (check-sat) ; Sanity check (must not return UNSAT)
(push)
; Check that the initial permutation witness is the identity function
(assert (not (forall ((k Int)) (= (select a0 k) (select a0 (select pw0 k))))))
(check-sat) ; UNSAT unexpected
(pop)
; Swap two elements of the array
(assert (= a1 (store a0 i (select a0 j))))
(assert (= a2 (store a1 j (select a0 i))))
; Update the permutation witness correspondingly
(assert (= pw1 (store pw0 i (select pw0 j))))
(assert (= pw2 (store pw1 j (select pw0 i))))
(push)
; Check that pw2 indeed witnesses the permutation of a2 w.r.t. a0
(assert (not (forall ((k Int)) (= (select a2 k) (select a0 (select pw2 k))))))
(check-sat) ; UNSAT unexpected
(pop)
; (check-sat) ; Sanity check (must not return UNSAT)
(declare-const a3 (Array Int Obj))
(declare-const a4 (Array Int Obj))
(declare-const pw3 (Array Int Int))
(declare-const pw4 (Array Int Int))
(push)
; Another swap ...
(assert (= a3 (store a2 j (select a2 (+ i 1)))))
(assert (= a4 (store a3 (+ i 1) (select a2 j))))
; ... but we forgot to update the permutation witness
(assert (= pw4 pw2))
(assert (not (forall ((k Int)) (= (select a4 k) (select a0 (select pw4 k))))))
(check-sat) ; Must not return UNSAT
(pop)
(push)
; A swap gone wrong ...
(assert (= a3 (store a2 j (select a2 (+ i 1)))))
(assert (= a4 (store a3 (+ i 1) (select a3 j)))) ; Last occurrence of a3 should be a2 (fix --> UNSAT)
; ... but the permutation witness is updated correctly
(assert (= pw3 (store pw2 j (select pw2 (+ i 1)))))
(assert (= pw4 (store pw3 (+ i 1) (select pw2 j))))
(assert (not (forall ((k Int)) (= (select a4 k) (select a0 (select pw4 k))))))
(check-sat) ; Must not return UNSAT
(pop)
关于z3 - 在 Z3 中建模 "swapping two elements in an array creates permutation",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37379700/
Numpy documentation在 np.random.permutation建议所有新代码使用 np.random.default_rng()来自随机生成器包。我在文档中看到,Random G
是否有任何已知的算法如何有效地生成具有附加限制的任何随机多集排列。 例子: 我有多个项目,例如:{1,1,1,2,2,3,3,3} ,以及一组限制性的集合,例如 { {3} , {1,2} , {1,
您将如何生成列表 b(1,6,8,3,9,5) 的所有可能排列包括不同长度的?例子: List a = [1,2,3] generateperms(a) 1,2,3 3,1,2 3,2,1 1,3,2
我不确定如何在限制范围内解决这个问题。 将“单词”视为大写字母 A-Z 的任何序列(不仅限于“字典单词”)。对于至少有两个不同字母的单词,还有其他单词由相同的字母组成但顺序不同(例如,STATIONA
题目地址:https://leetcode.com/problems/permutations/description/ 题目描述 Given a collection of distinct n
一行中有 n 个项目。我们必须在不能选择两个连续项目的限制下找到可以选择项目的方式数。 我试图用递归关系来做,但无法达到任何。请帮我解决问题。 最佳答案 在网上搜索后,我得到了上述问题的解决方案。 假
创建列表或集合的排列非常简单。我需要将函数应用于列表中所有元素的所有子集的每个元素,按照它们出现的顺序。例如: apply f [x,y] = { [x,y], [f x, y], [x, f y],
我遇到了一个看似简单的问题,有人可以帮忙吗? 我有两个列表 a和 b .我可以将列表的元素称为 a[i][j]其中 0
我正在将一个程序从 matlab 翻译成 Python。 matlab代码使用permute方法: B = PERMUTE(A,ORDER) rearranges the dimensions of
谜题 穷举一个数组中各个元素的排列 策略 减而治之、递归 JavaScript解 复制代码 代码如下:
题目地址:https://leetcode.com/problems/next-permutation/description/ 题目描述 Implement next permutation,
从我关于"Using SIMD AVX SSE for tree traversal" ive的另一个问题中,我得到了这个试图进行基准测试的代码。之前我没有对SIMD做任何事情,所以我对这种排列方式有
这段代码为我提供了长度为 x 的 n 值的所有可能组合,总和为 n。 function GETall_distri_pres($n_valeurs, $x_entrees, $combi_presen
如果我想找到列表的排列,我知道排列的数量由多项系数给出。例如,“MISSISSIPPI”有 11 个字母,“S”出现 4 次,“I”出现 4 次,“P”出现两次,“M”出现一次。因此“MISSISSI
我有一个伪代码,我已经将其翻译成java代码,但是每当我运行该代码时,我都会得到一个空的数组列表,但它应该给我一个随机的整数列表。这是伪代码: Algorithm 1. RandPerm(N) Inp
我想计算适合弗里德曼检验的分块设计的所有排列。考虑以下示例: thedata p dim(p) [1] 1295 12 R> head(p) [,1] [,2] [,3] [,4]
这与其说是编程问题,不如说是数学问题,但我认为这里的很多人都非常擅长数学! :) 我的问题是:给定一个 9 x 9 的网格(81 个单元格),其中必须包含数字 1 到 9,每个数字恰好出现 9 次,可
我有这个变量:message = "Hello World"我构建了一个对其进行洗牌的函数: def encrypt3(message,key): random.seed(key) l
以下程序使用 itertools.permutations 从列表中构造一个 URL。 def url_construct_function(): for i in range(1, len(
我有 36 个人和 6 张 table 。我想围绕每张 table 组成 6 个小组。然后再组成 6 个其他组,再组成 6 个其他组……直到每个人都遇到每个人,但没有人遇到两次。 到目前为止,我想出了
我是一名优秀的程序员,十分优秀!