我发现了一个问题,如下面的简单SMT-LIB程序所示。
SMT-LIB代码:
(declare-fun isDigit (Int) Bool)
(assert (forall ((x Int))
(=> (isDigit x)
(and (>= x 0) (< x 10))
)
)
)
(assert (forall ((x Int))
(=> (and (>= x 12) (< x 15))
(exists ((y Int))
(and (>= y 1) (< y 6)
(isHost (- x y))
)
)
)
)
)
(check-sat)
(get-model)
这会发出以下警告:
WARNING: failed to find a pattern for quantifier (quantifier id: k!18)
sat
........
........
我想知道警告信息。我知道我错过了什么,但我无法理解。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
Z3使用不同的引擎来处理量词(参见Z3 guide)。其中一个引擎基于模式匹配(E-Matching)。 Z3试图推断每个量化公式的模式。如果找不到,则发出警告消息。用户还可以为每个量词提供模式。该指南说明了如何做到这一点。标识k!18
是Z3创建的默认标识。它基于行号(在您的情况下为第18行)。您还可以为量词提供自己的ID。该警告只是告诉用户E匹配引擎将无法处理指定的量词。