假设我有一个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索引的数组中获取以另一种索引的数组,例如诠释?
答案 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
的意思)。只会更改范围类型。