Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 通用列表的长度函数_List_Function_Generics_Z3_Axiom - Fatal编程技术网

List 通用列表的长度函数

List 通用列表的长度函数,list,function,generics,z3,axiom,List,Function,Generics,Z3,Axiom,演示如何为Z3的内置列表公理化长度函数。但是,该函数是特定于排序的(此处为Int),不适用于布尔列表或自定义排序 ; declare len as an uninterpreted function (declare-fun len ((List Int)) Int) ; assert defining equations for len as an axiom (assert (forall ((xs (List Int))) (ite (= nil xs) (= 0 (len

演示如何为Z3的内置列表公理化长度函数。但是,该函数是特定于排序的(此处为Int),不适用于布尔列表或自定义排序

; declare len as an uninterpreted function
(declare-fun len ((List Int)) Int)

; assert defining equations for len as an axiom
(assert (forall ((xs (List Int)))
  (ite (= nil xs)
    (= 0 (len xs))
    (= (+ 1 (len (tail xs))) (len xs)))))

编码排序泛型列表函数的最聪明的方法是什么?(如果我没记错的话,函数本身不能是泛型的)。

SMT2.0格式或Z3不支持SMT2.0脚本中的参数公理。一种替代方法是使用编程API。您可以创建用于为给定排序创建
len
公理的函数。下面是一个关于如何使用pythonapi实现的示例


你可以用一种。
len
函数是在用户定义的排序
T
的通用列表上定义的。只有第一个
define sort
链接到
Int
类型

(define-sort T () Int)
(define-sort MyList() (List T))

(declare-const listlen Int)
(declare-const a MyList)
(declare-const b MyList)
(declare-const c MyList)
(declare-const d MyList)
(declare-const e MyList)

(define-fun-rec len((l MyList)) Int
    (ite
        (= l nil)
        0
        (+ (len (tail l)) 1)
    )
)
(assert (= a nil))
(assert (= b (insert 2 a)))
(assert (= c (insert 8 b)))
(assert (= d (insert 6 c)))
(assert (= e (insert 10 d)))

(assert (= listlen (len e)))

(check-sat)
(get-model)

看起来我必须比我想象的更早地从stdio切换到编程API。。。谢谢还有:有必要用模式来保护这些定义方程吗?正如我通常使用量化公理所做的那样。此外,该指南还指出,定义伪宏的量词由模型查找器自动检测。我假设这需要:mbqi为真(在我的例子中不是这样)。你能详细说明一下吗?如果我们不提供模式,Z3将为我们计算它们。
Len
公理不是伪宏,因为它是一个“递归”定义。选项:mbqi默认为true。这反过来是否意味着所有非递归定义都是伪宏?另外,伪宏对Z3的行为有什么影响?如果我停用:mbqi,伪宏是否仍被特殊处理?是的,所有非递归定义都被
:mbqi
引擎视为宏。一个问题是
:mbqi
可能没有机会运行。Z3仅在构建满足所有无量词约束的“候选解释”时才执行此引擎。如果要确保在搜索开始之前展开所有定义,可以添加选项
(设置选项:macro finder true)
(define-sort T () Int)
(define-sort MyList() (List T))

(declare-const listlen Int)
(declare-const a MyList)
(declare-const b MyList)
(declare-const c MyList)
(declare-const d MyList)
(declare-const e MyList)

(define-fun-rec len((l MyList)) Int
    (ite
        (= l nil)
        0
        (+ (len (tail l)) 1)
    )
)
(assert (= a nil))
(assert (= b (insert 2 a)))
(assert (= c (insert 8 b)))
(assert (= d (insert 6 c)))
(assert (= e (insert 10 d)))

(assert (= listlen (len e)))

(check-sat)
(get-model)