- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们这里的问题是表明
在测试中使用 Kleene 代数。
在 b 的值由 p 保留的情况下,我们有交换条件 bp = pb;两个程序之间的等价性简化为等式
在 b 的值不被 p 保留的情况下,我们有交换性条件 pc = cp;两个程序之间的等价性简化为等式
我正在尝试使用以下 SMT-LIB 代码证明第一个等式
(declare-sort S)
(declare-fun sum (S S) S)
(declare-fun mult (S S) S)
(declare-fun neg (S) S)
(assert (forall ((x S) (y S) (z S)) (= (mult x (sum y z)) (sum (mult x y) (mult y z))) ) )
(assert (forall ((x S) (y S) (z S)) (= (mult (sum y z) x) (sum (mult y x) (mult z x))) ) )
(assert (forall ((x S) (y S) (z S)) (= (mult x (mult y z)) (mult (mult x y) z)) ))
(check-sat)
(push)
(declare-fun b () S)
(declare-fun p () S)
(declare-fun q () S)
(declare-fun r () S)
(assert (= (mult b p) (mult p b)) )
(check-sat)
(pop)
但我正在获取超时
;也就是说Z3不能满足交换条件bp = pb。请在线运行此示例here .
Z3 无法证明这些方程,但 Mathematica 和 Reduce 可以。 Z3 没有定理证明器那么强大。你同意吗?
最佳答案
使用 Z3 和以下 SMT-LIB 代码证明了第一个方程
(declare-sort S)
(declare-fun e () S)
(declare-fun O () S)
(declare-fun mult (S S) S)
(declare-fun sum (S S) S)
(declare-fun leq (S S) Bool)
(declare-fun negation (S) S)
(declare-fun test (S) Bool)
(assert (forall ((x S) (y S)) (= (sum x y) (sum y x ))))
(assert (forall ((x S) (y S) (z S)) (= (sum (sum x y) z) (sum x (sum y z)))))
(assert (forall ((x S)) (= (sum O x) x)))
(assert (forall ((x S)) (= (sum x x) x)))
(assert (forall ((x S) (y S) (z S)) (= (mult (mult x y) z) (mult x (mult y z)))))
(assert (forall ((x S)) (= (mult e x) x)))
(assert (forall ((x S)) (= (mult x e) x)))
(assert (forall ((x S) (y S) (z S)) (= (mult x (sum y z) ) (sum (mult x y) (mult x z)))))
(assert (forall ((x S) (y S) (z S)) (= (mult (sum x y) z ) (sum (mult x z) (mult y z)))))
(assert (forall ((x S)) (= (mult x O) O)))
(assert (forall ((x S)) (= (mult O x) O)))
(assert (forall ((x S) (y S)) (= (leq x y) (= (sum x y) y))))
(assert (forall ((x S) (y S)) (=> (and (test x) (test y) ) (= (mult x y) (mult y x))) ) )
(assert (forall ((x S)) (=> (test x) (= (sum x (negation x)) e) )))
(assert (forall ((x S)) (=> (test x) (= (mult x (negation x)) O) )))
(check-sat)
(push)
;; bpq + b`pr = p(bq + b`r)
(declare-fun b () S)
(declare-fun p () S)
(declare-fun q () S)
(declare-fun r () S)
(assert (=> (test b) (= (mult p b) (mult b p)) ))
(assert (=> (test b) (= (mult p (negation b)) (mult (negation b) p))))
(check-sat)
(assert (not (=> (test b) (= (sum (mult b (mult p q)) (mult (negation b) (mult p r) ))
(mult p (sum (mult b q) (mult (negation b) r))))) ) )
(check-sat)
(pop)
(echo "Proved: bpq + b`pr = p(bq + b`r)")
输出是
sat
sat
unsat
Proved: bpq + b`pr = p(bq + b`r)
请在线运行此证明here
关于Z3 无法通过测试证明两个使用 Kleene 代数的简单程序之间的等价性,但 Mathematica 和 Reduce 能够,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25108435/
假设我们有两种语言 L1 和 L2,下面的条件是否被认为是错误的? (L1L2)* = L1*L2* 我假设这是因为说: 条件左侧: L1 = {a,b} L2 = {c,d} C = L1.L2 C
我正在尝试在 Agda 中形式化正则表达式 (RE) 的某些属性。我一直坚持 Kleene 星操作的幂等性证明。 我已经证明了这一点 xs xs xs RegExp _o_ : (e e
我一直在努力理解关于关闭两个联合表达式的一个关键属性。基本上我需要知道 Kleene star 是如何工作的。 I.E 如果正则表达式 R = (0+1)* 表达式的计算结果是否必须类似于 00011
我正在寻找提供解决此问题的算法的引用资料: 问题:给定一个有限字母表 Σ 和一个有限语言 L ⊆ Σ* ,判断 L* 是否是一个自由幺半群。 同样,问题是在给定一组有限的字符串的情况下,确定这些字符串
刚开始欣赏正则表达式,我正在 regexone.com 上练习我的问题给出了关于 kleene "*"的解释。我自己想出了一个答案” [a-c]* 但是解决方法是: aa+b*c+ or a*b*c*
这看起来很简单,也许我遗漏了一些明显的东西。我想返回具有模式 (.*) 的字符串中的所有可变长度子字符串。不过,我发现我在 Firefox 控制台中出现了非常奇怪的行为: "666677888".ma
我正在学习自动机。你能帮我理解带 Kleene 闭包的自动机是如何工作的吗?假设我有字母 a、b、c,我需要找到以 Kleene 星号结尾的文本 - 例如 ab*bac - 它如何工作? 最佳答案 问
大多数来源,例如 http://www.cs.may.ie/staff/jpower/Courses/Previous/parsing/node5.html ,建议用 4 个节点构建 Kleene 闭
我最近开始使用 Racket 模式匹配系统,并遇到了一个我无法理解的问题。 如果我这样做: (match (list 1 2 3 4 5 6 7 8 9 10 11 12) [(list _
我试图为某人回答正则表达式问题,但遇到了一些让我摸不着头脑的事情。给出以下代码... public static void main(String[] args) throws IOException
(aa)*会有区别吗和 (a*a*) ? 有分配属性吗? 最佳答案 Kleene 星不分布。 (ab)*与 (a*b*) 非常不同. 在您的具体示例中,(aa)*将匹配两组 a s(因此,它只匹配 a
在过去的几周里,我学到了很多关于这方面的知识,但还不够。下面的代码可以编译运行,但是 TEST_ADAPT 中的代码不完整,我不确定如何建立连接。 对象是解析成一个没有variant依赖的plane
我有一个语法,它应该匹配字符序列后跟一个字符,该字符是第一个字符的子集。例如, boost::spirit::qi::rule grammar = *char_('a', 'z') >> char_(
我是 boost::spirit 的新手,正在尝试使用 x3 编写一个简单的解析器。我收到一个无法解释的错误。出于某种原因,我收到有关 boost::spirit::x3::unused_type 的
我想解析特殊的结构,把剩下的扔掉。但我不想使用 skipper 。 我想获得这些构造的 vector ,所以我使用 Kleene Star 解析器作为主要规则。但是,每当有东西被丢弃时,一个默认构造的
我想解析特殊的结构,把剩下的扔掉。但我不想使用 skipper 。 我想获得这些构造的 vector ,所以我使用 Kleene Star 解析器作为主要规则。但是,每当有东西被丢弃时,一个默认构造的
我们这里的问题是表明 在测试中使用 Kleene 代数。 在 b 的值由 p 保留的情况下,我们有交换条件 bp = pb;两个程序之间的等价性简化为等式 在 b 的值不被 p 保留的情况下,我们有交
特别是,这可以用 Javascript 实现吗? >> "Version 1.2.3.4".match(/\S+ (\d+)(\.\d+)*/) ["Version 1.2.3.4", "1", ".
这是一段非常简单的代码,它使用 boost::spirit::karma 以 graphviz 点语言生成格式化输出: #include #include #include #include
我是一名优秀的程序员,十分优秀!