【问题标题】:Having assertions inside definitions in SMT在 SMT 中的定义中包含断言
【发布时间】:2019-11-02 01:58:10
【问题描述】:

我想捕获 fac 中的断言。

int f( x )
{
     if( x == 1) return 1;
     else{
         assert( x > 0 );
         return 2;         
         }
}

int g (x)
{  assert( x > 5 );
   return f(x-1) + f(x-2);
}

我想要一个 smt2 代码。 我可以通过剥离参数并使用唯一名称使其全局化(也在 f 内重命名)来做到这一点,然后每次使用不同的函数名称执行 3 次。如下所示:

( declare-const x1 Int )
(define-fun f1 () Int 
            ( ite ( x1 > 0) 1 2 )
) 
(assert (> x1 0))

( declare-const x2 Int )
(define-fun f2 () Int 
            ( ite ( x2 > 0) 1 2 )
) 
(assert (> x2 0))

( declare-const x3 Int )
(define-fun g1 () Int 
            ( + f1 f2 )
) 
(assert (> x3 5))

我不想这样。有没有其他方法可以做到这一点而不重复?

编辑 我的目的是找到违反断言的值。

【问题讨论】:

  • 你想要这些断言的语义是什么?找出是否可以使用可能违反它们的参数调用它们,或者将最终证明限制为仅满足它们的值?虽然这两个问题听起来很相似,但它们对于您最终如何建模这个结构很重要。
  • 谢谢,我想要的是后者。
  • @JagadeepSai 编辑后 "accepted" 答案不再回答您的问题。要么不接受答案,所以我可以自行删除它,或者打开一个新问题。
  • @PatrickTrentin 我认为您的回答完全可以接受;应该保持被接受!
  • 太棒了..您尝试做的事情既不容易,如果您手工完成也不会扩展。由于您似乎对 C 程序感兴趣,请查看klee.github.io,它将使用符号模拟自动为您检查这些asserts。 (它将使用 z3 作为底层引擎。)您可以仔细阅读他们的文档以了解如何大规模执行此操作。

标签: z3 smt


【解决方案1】:

据我所知,不可能在函数定义中嵌入断言。

我会尝试做的是将预期行为、输入假设和输出保证(如果有的话)分开。

示例:

(define-fun f ((x Int)) Int
      (ite (= x 1) 1 2)
)

(define-fun f-helper ((x Int)) Bool
      (< 0 x)
)

(define-fun g ((x Int)) Int
    (+ (f (- x 1)) (f (- x 2)))
)

(define-fun g-helper ((x Int)) Bool
    (and (< 5 x)
         (f-helper (- x 1))
         (f-helper (- x 2))
    )
)

(declare-const x Int)
(declare-const y Int)

(assert (and (= y (g x))
             (g-helper x)
))

(check-sat)
(get-model)

在这个例子中,我们使用f 来模拟原始函数f 的行为,并使用f-helper 来模拟f 的假设。使用online Z3 tool的输出如下:

sat
(model 
  (define-fun x () Int
    6)
  (define-fun y () Int
    4)
)

我的结论是,一旦在正面和负面的上下文中使用fg,这种方法可能会变得棘手。在这种情况下,应该特别注意断言的极性是正确的.预期的结果。

【讨论】:

  • 如果您对assert 感兴趣,这是一种很好的建模方式,意思是:“只考虑满足我假设的路径。”另一种方法可能是:找到违反我的asserts 的输入。两者都是有效的问题,从原始问题中不清楚是哪一个。对前者来说很好的解决方案。另一种方法可能是将结果“配对”:即将g 转换为返回结果和布尔值的函数;然后您可以很好地组合这些并断言所有“有效”谓词必须为真。
  • @alias 这些其实是非常好的观察和建议!实际上足以创建第二个更好的答案:)
  • 感谢您指出@alias。我的主要动机是找到违反断言的输入。
  • @Patrick 在积极和消极的上下文中使用是什么意思。还有关于极性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 2010-11-29
相关资源
最近更新 更多