道歉,如果这是一个愚蠢的问题 - 我对使用Z3(以及一般的SMT)很陌生 - 但我有点难过。
假设我有两个SMT2输入语言的文件,略有不同,总结为:
(define-fun T ((i Int)) Bool (... - too long to paste completely, but does define $prop)
(assert (T 0))
(declare-fun assum1 () Bool)
(assert (=> assum1 (not (and ($prop 0)))))
(check-sat assum1)
现在,其中一个(更简单的一个)返回“sat”,具有更复杂的非线性数学的变体返回“unknown”。
我认为更复杂的变体可以使用非线性求解器来解决,例如qfnra-nlsat(或者其他策略),但是尝试使用check-sat-using:
(check-sat-using qfnra-nlsat assum1)
返回:
(error "line 246 column 29: invalid command argument, keyword expected")
但是,没有明确命名函数assum1
(check-sat-using qfnra-nlsat)
跑,但给我一个“未知”的结果。
所以,我的问题是 - 如何选择我的求解器并将其专门应用于函数“assum1”?
感谢您的帮助。
答案 0 :(得分:1)
check-sat和check-sat-using的参数不一样。 check-sat采用一系列假设(布尔文字),check-sat-using期望一个应用于当前目标的策略(如'apply'命令),它不需要假设。 apply和check-sat-using之间的区别在于后者应用策略,然后检查结果是空目标还是false
目标。 (有关Z3中目标和策略的更多信息,请参阅strategies tutorial。)
对于这个特定的例子,我认为在应用qfnra-nlsat之前将assum1
置于目标中是最容易的(这意味着如果任何假设发生变化,你将不得不构建一个新的目标)。 / p>
如果问题出在QF_NRA中,默认情况下也会应用nlsat策略,但可能需要明确
(set-logic QF_NRA)
在文件的开头,以确保它已被应用。