传统上,计算逻辑的大部分工作要么是命题逻辑,此时使用 SAT(布尔可满足性)求解器;要么是一阶逻辑,此时使用一阶定理证明器。
近年来,SMT(可满足性模理论)求解器取得了很多进展,基本上将命题逻辑与算术等理论结合起来;SRI国际公司的约翰•拉什比甚至称它们是一种颠覆性技术。
在一阶逻辑中可以处理的最重要的实际问题中,哪些问题仍无法通过 SMT 处理?尤其在软件验证领域中,会出现哪些不能由 SMT 处理的问题?
传统上,计算逻辑的大部分工作要么是命题逻辑,此时使用 SAT(布尔可满足性)求解器;要么是一阶逻辑,此时使用一阶定理证明器。
近年来,SMT(可满足性模理论)求解器取得了很多进展,基本上将命题逻辑与算术等理论结合起来;SRI国际公司的约翰•拉什比甚至称它们是一种颠覆性技术。
在一阶逻辑中可以处理的最重要的实际问题中,哪些问题仍无法通过 SMT 处理?尤其在软件验证领域中,会出现哪些不能由 SMT 处理的问题?
void run(int64_t a,int64_t b)
{
a * b == <some large semiprime>;
assert (false);
}
run()
函数中,我认为你可能是想要 assert(a*b != <some large number>);
或者 if (a*b == <some large number>) assert(false);
。a*b
不是一个左值,不能被赋值。如果这就是你的意思,那么 SMT 求解器不能轻易地证明 assert(false);
会发生:它首先必须证明这个大数是合数。无论如何,你可能需要编辑答案来修正 run()
的定义。 - D.W.