- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 SBV (使用 Z3 后端)在 Haskell 中创建一些理论证明。我想检查一下是否为 x
和 y
在给定的约束条件下(如 x + y = y + x
,其中 +
是“加号运算符”,而不是加法),其他一些术语是有效的。我想定义关于 +
的公理表达式(如关联性、身份等),然后检查进一步的等式,如检查 a + (b + c) == (a + c) + b
是有效的正式a
, b
和 c
.
我试图使用类似的东西来完成它:
main = do
let x = forall "x"
let y = forall "y"
out <- prove $ (x .== x)
print "end"
.==
符号值的运算符。这是缺少的功能还是错误的用法?我们能以某种方式使用 SBV 做到这一点吗?
最佳答案
通过使用未解释的排序和函数,这种推理确实是可能的。但是请注意,对此类结构的推理通常需要量化的公理,而 SMT 求解器通常不太擅长使用量词进行推理。
话虽如此,这就是我将如何使用 SBV。
首先,一些样板代码以获得未解释的类型T
:
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Generics
import Data.SBV
-- Uninterpreted type T
data T = TBase () deriving (Eq, Ord, Data, Typeable, Read, Show)
instance SymWord T
instance HasKind T
type ST = SBV T
T
及其象征性的对应物
ST
.让我们声明
plus
和
zero
,再次只是具有正确类型的未解释常量:
-- Uninterpreted addition
plus :: ST -> ST -> ST
plus = uninterpret "plus"
-- Uninterpreted zero
zero :: ST
zero = uninterpret "zero"
T
, 和一个函数
plus
, 和一个常数
zero
;明确地未被解释。也就是说,SMT 求解器除了它们具有给定类型之外不做任何假设。
0+x = x
:
bad = prove $ \x -> zero `plus` x .== x
*Main> bad
Falsifiable. Counter-example:
s0 = T!val!0 :: T
T!val!0
是
Z3
具体 react ;其他求解器可以返回其他东西。它本质上是
T
类型的居民的内部标识符。 ;除此之外,我们对此一无所知。这当然不是非常有用,因为您并不真正知道它为
plus
建立了什么样的关联。和
zero
,但这是意料之中的。
plus
是可交换的。第二,
zero
添加在右边不会做任何事情。这些是通过
addAxiom
完成的。来电。不幸的是,您必须使用 SMTLib 语法编写公理,因为 SBV(至少目前)不支持使用 Haskell 编写的公理。另请注意,我们切换到使用
Symbolic
单子(monad)在这里:
good = prove $ do
addAxiom "plus-zero-axioms"
[ "(assert (forall ((x T) (y T)) (= (plus x y) (plus y x))))"
, "(assert (forall ((x T)) (= (plus x zero) x)))"
]
x <- free "x"
return $ zero `plus` x .== x
x+y = y+x
和
x+0 = x
, 并要求它证明
0+x = x
.以这种方式编写公理看起来非常丑陋,因为您必须使用 SMTLib 语法,但这是当前的情况。现在我们有:
*Main> good
Q.E.D.
unknown
.这完全取决于您使用的求解器,以及要证明的属性有多难。
关于haskell - 使用 SBV 和 Haskell 证明符号理论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31296186/
使用 SBV 库,我试图满足状态符号列表上的条件: data State = Intro | Start | Content | Comma | Dot mkSymbolicEnumeration '
我的数据类型如下 data X = X {foo :: SInteger, bar :: SInteger} 我想证明例如 forAll_ $ \x -> foo x + bar x .== bar
我有这个定理(不确定这个词是否正确),并且我想得到所有的解决方案。 pairCube limit = do m Symbolic SBool pairCube limit = do
我的数据类型如下 data X = X {foo :: SInteger, bar :: SInteger} 我想证明例如 forAll_ $ \x -> foo x + bar x .== bar
我正在使用 SBV (使用 Z3 后端)在 Haskell 中创建一些理论证明。我想检查一下是否为 x和 y在给定的约束条件下(如 x + y = y + x ,其中 + 是“加号运算符”,而不是加法
假设一棵树,其中节点可能存在也可能不存在,我想生成一个公式,其中: 每个节点都有一个 bool 变量(表示它是否存在), 根(如果空闲)(可能存在也可能不存在),并且 只有当其父节点存在时,节点才能存
以下代码(使用 SBV): {-# LANGUAGE ScopedTypeVariables #-} import Data.SBV main :: IO () main = do res =
我看到很多使用 SBV 库的示例,如下所示: f :: IO SatResult f = sat $ do x IO SatResult f i = sat $ do
为了学习 Z3,我尝试使用 Haskell 绑定(bind) sbv 解决我最喜欢的代码出现问题之一(一个特别困难的问题,2018 day 23, part 2)。 .前面代码中的剧透... modu
在 my last question我问我如何解析一个命题表达式,然后在 SBV 库的帮助下找到公式的所有模型。我使用 hatt 库来解析 bool 表达式。 不幸的是,SBV 似乎不适合相当快速的
我想解析 String它描述了一个命题公式,然后使用 SAT 求解器找到该命题公式的所有模型。 现在我可以用 hatt 解析一个命题公式包裹;见testParse下面的功能。 我还可以使用 SBV 库
我是一名优秀的程序员,十分优秀!