【发布时间】:2013-11-05 03:36:58
【问题描述】:
我的目标是定义一个单射函数f: Int -> Term,其中Term 是某种新类型。参考了单射函数的the definition,我写了以下内容:
(declare-sort Term)
(declare-fun f (Int) Term)
(assert (forall ((x Int) (y Int))
(=> (= (f x) (f y)) (= x y))))
(check-sat)
这会导致超时。我怀疑这是因为求解器试图验证 Int 域中所有值的断言,这是无限的。
我还检查了上述模型是否适用于某些自定义排序而不是 Int:
(declare-sort Term)
(declare-sort A)
(declare-fun f (A) Term)
(assert (forall ((x A) (y A))
(=> (= (f x) (f y)) (= x y))))
(declare-const x A)
(declare-const y A)
(assert (and (not (= x y)) (= (f x) (f y))))
(check-sat)
(get-model)
第一个问题是如何实现Int排序而不是A的相同模型。求解器可以做到这一点吗?
我还在多模式部分的the tutorial 中找到了单射函数示例。我不太明白为什么 :pattern 注释有帮助。所以第二个问题是为什么使用:pattern,它给这个例子带来了什么特别的影响。
【问题讨论】:
标签: z3 smt constraint-programming