我正在修补CVC4对集合和关系的支持,并希望能够使用product
运算符来构建两个集合的笛卡尔积。但是,此运算符仅适用于关系。
这是输入到CVC4的示例输入:
(set-logic ALL_SUPPORTED)
(declare-sort S1 0)
(declare-sort S2 0)
(declare-fun es1 () (Set S1))
(declare-fun es2 () (Set S2))
(declare-fun es1s2 () (Set (Tuple S1 S2)))
(assert (= es1s2 (product es1 es2)))
这将导致以下错误消息:
(error " Relational operator operates on non-relations (sets of tuples)")
然后我发现CVC4期望product
运算符适用于元组集。以下内容已成功处理:
(set-logic ALL_SUPPORTED)
(declare-sort S1 0)
(declare-sort S2 0)
(declare-fun e1 () (Set (Tuple S1)))
(declare-fun e2 () (Set (Tuple S2)))
(declare-fun es1s2 () (Set (Tuple S1 S2)))
(assert (= es1s2 (product e1 e2)))
CVC4在这里可以将一个集合视为包含该集合元素的1元组集合。
答案 0 :(得分:0)
这就是CVC4中语法的工作方式。我正在使用它进行工作,我们专门处理集合论。对于具有有限关系的集合上的大多数操作,CVC4期望有元组。
此链接可能会有所帮助:https://cvc4.github.io/sets-and-relations 因此,使用有限集的运算通常可以在没有元组的情况下进行运算,而有限关系需要元组。
此外,我发现本文有助于理解CVC4中set的实现背后的理论:https://homepage.cs.uiowa.edu/~tinelli/papers/MenEtAl-CADE-17.pdf