我一直在探索 SMT 求解器和 SMT-LIB 标准,它提供了一种声明性语言,用于根据逻辑公式和约束定义问题。我的理解是,SMT 求解器本质上是“解决该语言中指定的约束”。
这看起来与约束编程非常相似,其中定义了约束,系统找到满足它们的解决方案,而无需显式编码求解过程。然而,我注意到人们通常不会将 SMT-LIB 作为约束编程范例的一部分。至少从我读过的文章和论文来看。
SMT-LIB 语言是否符合约束编程范式,或者是否有不同的分类? SMT-LIB 和传统约束编程语言之间有主要区别吗?
总的来说,SMTLib 并不是真正想要成为一种编程语言。也就是说,最终用户不应直接使用 SMTLib 进行编程。它没有适合最终用户编程的常见编程语言之类的结构。
但是,它旨在作为需要基于 SAT/SMT 求解器功能的其他工具使用的通用语言。
从这个意义上说,我认为 SMTLib 不是一种约束编程语言。它只是提供了一种以各种求解器支持的方式表达约束的格式。 (z3、yikes、MathSAT、CVC5 等)实际的约束编程语言(或其他程序/库)可以利用通用的 SMTLib 语言,以便它们可以利用 SMT 求解器来解决自己领域中的约束。
当然,这是基于意见的。但我的看法是,SMT-Lib 是一种中间表示形式,它提供了从任意程序/编程语言 RTS 到 SMT 求解器的桥梁;与约束编程语言本身相反。 (但确实人们用它来达到这种效果,效果非常好。)