Z3 什么样的地图[f]
假设我有一个排序T,并且我声明了一个由T索引的数组,它上面的映射是什么 e、 gZ3 什么样的地图[f],z3,smt,Z3,Smt,假设我有一个排序T,并且我声明了一个由T索引的数组,它上面的映射是什么 e、 g 地图上的foo是什么类型的映射?b上的映射是什么?有没有办法搞乱索引类型,从T索引的数组中获取另一个排序索引的数组,例如Int?通常的排序匹配规则适用。也就是说,要映射数组上的函数f:a->B,数组必须具有其范围类型a,并且它将把它转换为aB,保留其域的类型 关于你的例子:不管你的T是什么,如果你映射foo,你只需要将Array T Int作为最终排序,如果你映射bar,则将Array T Bool作为结果。以下脚
地图上的foo是什么类型的映射?b上的映射是什么?有没有办法搞乱索引类型,从T索引的数组中获取另一个排序索引的数组,例如Int?通常的排序匹配规则适用。也就是说,要映射数组上的函数
f:a->B
,数组必须具有其范围类型a
,并且它将把它转换为aB
,保留其域的类型
关于你的例子:不管你的T
是什么,如果你映射foo
,你只需要将Array T Int
作为最终排序,如果你映射bar
,则将Array T Bool
作为结果。以下脚本类型检查没有任何问题:
(declare-datatypes ((T 0)) ((i Int)))
(declare-const a (Array T Int))
(declare-const b (Array Int Int))
(declare-fun foo (Int) Int)
(declare-fun bar (Int) Bool)
(define-fun e1 () (Array T Int) ((_ map foo) a))
(define-fun e2 () (Array T Bool) ((_ map bar) a))
(define-fun e3 () (Array Int Int) ((_ map foo) b))
(define-fun e4 () (Array Int Bool) ((_ map bar) b))
请注意,您不能通过在数组上映射函数来更改域的类型(我想这就是您所说的
索引
)。它只会更改范围类型。是的,我是这么想的,但在规格中找不到,谢谢您的时间
(declare-datatypes ((T 0)) ((i Int)))
(declare-const a (Array T Int))
(declare-const b (Array Int Int))
(declare-fun foo (Int) Int)
(declare-fun bar (Int) Bool)
(define-fun e1 () (Array T Int) ((_ map foo) a))
(define-fun e2 () (Array T Bool) ((_ map bar) a))
(define-fun e3 () (Array Int Int) ((_ map foo) b))
(define-fun e4 () (Array Int Bool) ((_ map bar) b))