什么样的地图[f]
What is the sort of map[f]
假设我有一个 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 索引的数组中获取另一种索引的数组,例如整数?
适用通常的排序匹配规则。也就是说,要map
一个数组上的函数f : A -> B
,数组必须有它的范围类型A
,它会把它变成B
,保留类型它的域。
关于您的示例:无论您的 T
是什么,如果将 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
的意思)。它只更改范围类型。
假设我有一个 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 索引的数组中获取另一种索引的数组,例如整数?
适用通常的排序匹配规则。也就是说,要map
一个数组上的函数f : A -> B
,数组必须有它的范围类型A
,它会把它变成B
,保留类型它的域。
关于您的示例:无论您的 T
是什么,如果将 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
的意思)。它只更改范围类型。