我想使用仅变量模式来获得使用量化公理编码的某些理论的决策程序。更确切地说,我想强制执行这些公理中的某些变量,并使用相应排序的所有项进行实例化。这些变量仅出现在谓词符号下面,因此不存在创建匹配循环的危险。
例如,请考虑以下部分查询:
(declare-sort Loc 0)
(declare-sort Map 2)
(declare-fun read ((Map Loc Loc) Loc) Loc)
(declare-fun Btwn ((Map Loc Loc) Loc Loc Loc) Bool)
...
(assert (forall ((?f (Map Loc Loc)) (?x Loc) (?y Loc))
(or (not (= (read ?f ?x) ?x)) (not (Btwn ?f ?x ?y ?y)) (= ?x ?y))))
在公理中,我想为所有与?f
和变量?x
匹配的基础术语实例化变量read ?f ?x
和?y
。排序Loc
。
如果我将以下多模式添加到公理:
:pattern ((read ?f ?x) ?y)
然后Z3报告仅变量模式?y
的错误。如果我在模式中省略?y
,如下所示:
:pattern ((read ?f ?x))
然后Z3报告警告说并非所有变量都出现在模式中。似乎不可能压制这个警告。此外,在这种情况下,我不确定该模式是否实际产生预期的实例化。有没有一个解决方案能够为我提供我正在寻找的实例(没有警告)?
请注意,我感兴趣的理论不属于MBQI单独产生决策程序的任何片段(据我所知)。我可以预先部分地实例化公理,以获得EPR理论(这就是我现在所做的),但我更喜欢解决者为我做这个。
答案 0 :(得分:0)
基于模式的实例化引擎要求变量位于函数符号的范围内。否则,变量可以匹配任何适当类型的基础项,但这不能很好地工作,尤其是当实例化创建与变量相同类型的新术语时。 你在Z3中可以做的是指定一个使用两个谓词的多模式:((读?f?x)(Btwn?f?x?y?y))。您还可以指定原始问题中未出现的辅助谓词。 例如,谓词(已知?y)。您还必须添加公理来控制您想要知道的术语。然后你可以使用多模式((读?f?x)(已知?y))。当然,这通常会比第一个多模式创建更多的实例化。