Arrays Z3当记录类型中有多个数组时,数组模型中的额外条件(ite子句)
当一条记录包含多个相同类型的命名数组时,我在z3中遇到了一些意外行为:Arrays Z3当记录类型中有多个数组时,数组模型中的额外条件(ite子句),arrays,record,z3,smt,Arrays,Record,Z3,Smt,当一条记录包含多个相同类型的命名数组时,我在z3中遇到了一些意外行为: (declare-datatypes () ((Record_lengths (Record_lengths (array (Array Int Int)))))) (declare-datatypes () ((ROI (ROI (array (Array Int Int)))))) (declare-datatypes () ((Record (Record (lengths Record_lengths) (roi R
(declare-datatypes () ((Record_lengths (Record_lengths (array (Array Int Int))))))
(declare-datatypes () ((ROI (ROI (array (Array Int Int))))))
(declare-datatypes () ((Record (Record (lengths Record_lengths) (roi ROI)))))
(declare-fun rec () Record)
(assert (= (select (array (lengths rec)) 1) 0))
(get-model)
我希望会有一个解决方案,其中rec.length[1]=0,所有其他的都是默认值或随机值。但是,length
选择器总是有一个额外的ite子句:
(model
(define-fun rec () Record
(Record (Record_lengths (_ as-array k!1)) (ROI (_ as-array k!0))))
(define-fun k!0 ((x!0 Int)) Int
(ite (= x!0 2) 4
4))
(define-fun k!1 ((x!0 Int)) Int
(ite (= x!0 1) 0
(ite (= x!0 2) 3 ;this is unexpected
0)))
)
这些额外子句的数量似乎与记录中相同数组类型的数量存在某种关系。
如本例所示:Record\u length
和ROI
具有相同的类型,如果我向Record
添加更多的ROI
类型,则额外子句计数也会增加
下面是该示例的永久链接:
SMT解算器不保证生成的模型在任何意义上都是“最小”的。当然,只要它们生成的模型满足所有约束条件 话虽如此,您可以对部分模型使用该选项,并获得“较小”的示例。我在引号中加上了较小的数字,因为这里没有最小值的概念;除其他事项外,解算器考虑模型的部分内容以及可以跳过的内容可能因启发式方法而异。您可以添加:
(set-option :model.partial true)
查看脚本的顶部,以了解这将产生什么影响。model.partial选项没有多大帮助。。这个额外条件及其具体值从何而来?它是否与数组定理有关,或者在模型创建过程中,解算器以这种方式变换术语?