什么样的地图[f]

时间:2018-10-27 16:27:54

标签: z3 smt

假设我有一个Sort T,并且声明了一个用T索引的数组,那么在它上面进行映射的方式是什么?

例如

(declare-datatypes ()
  ((T ....))) ; some index, may be finite or infinite (as in Int)
(declare-const a (Array T Int))
(declare-const b (Array Int Int))
(define-fun foo ((x Int)) Int)
(define-fun bar ((y Int)) Bool)

在a上映射foo的方式是什么?以及在b上映射foo的方式?有没有办法弄乱索引类型并从以T索引的数组中获取以另一种索引的数组,例如诠释?

1 个答案:

答案 0 :(得分:1)

通常使用排序匹配规则。也就是说,要在数组上map使用函数f : A -> B,该数组必须具有其范围类型A,并将其转换为B,并保留该类型的域。

关于您的示例:无论您的T是什么,只要映射Array T Int并将结果foo映射为Array T Bool作为最终排序如果您映射bar。以下脚本进行了类型检查,没有任何问题:

(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))

请注意,您不能通过在数组上映射函数来更改域的类型(这是我假设的index的意思)。只会更改范围类型。