Z3 什么样的地图[f]

Z3 什么样的地图[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作为结果。以下脚

假设我有一个排序T,并且我声明了一个由T索引的数组,它上面的映射是什么

e、 g


地图上的foo是什么类型的映射?b上的映射是什么?有没有办法搞乱索引类型,从T索引的数组中获取另一个排序索引的数组,例如Int?

通常的排序匹配规则适用。也就是说,要映射数组上的函数
f:a->B
,数组必须具有其范围类型
a
,并且它将把它转换为a
B
,保留其域的类型

关于你的例子:不管你的
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))