我有一组符号变量:
int a, b, c, d, e;
一组未知函数,受到许多公理的约束:
f1(a, b) = f2(c, b)
f1(d, e) = f1(e, d)
f3(b, c, e) = f1(b, e)
c = f1(a, b)
b = d
此处函数f1
,f2
,f3
未知,但已修复。所以这不是uninterpreted functions
的理论。
我想证明以下断言的有效性:
c = f2(f1(a, b), b)
f3(d, f2(c, b), e) = f1(e, b)
使用基于上述公理等同的替代。
是否存在一种理论,对于这样的定理,只能使用所提供的等式来尝试将答案结合起来,而不是对函数进行解释?
如果是这样,理论的名称是什么,以及SMT求解器支持它的是什么?
它可以与其他理论混合使用,比如线性算法吗?
答案 0 :(得分:3)
这仍然是未解释的函数,因为如果存在满足公理的函数,那么这将被置于未解释函数的理论中。类似地,如果不存在这样的函数,那么在未解释的函数中这是不可靠的。因此,当且仅当未解释函数中的问题可以满足时,您所描绘的内容才是令人满意的,因此这两种理论是同构的,即相同。
鉴于您试图根据公理证明某些定理是有效的,因此求解器如何表示可满足的结果并不重要,因为sat结果对应于无效的模型。为了使用SMT求解器证明你的定理,你应该断言你的公理,断言定理的否定,然后寻找不可满足的结果。有关可满足性和有效性之间关系的更详细说明,请参阅this question。
为了使用Z3证明您的第一个定理,以下内容在SMT-LIB 2中足够了:
(declare-fun a () Int)
(declare-fun b () Int)
(declare-fun c () Int)
(declare-fun f1 (Int Int) Int)
(declare-fun f2 (Int Int) Int)
(assert (= (f1 a b) (f2 c b)))
(assert (= c (f1 a b)))
(assert (not (= c (f2 (f1 a b) b))))
(check-sat)