调试合金中的链式关系声明



我正在使用合金来模拟图形转换。我将我的变换指定为应用于图形不同部分的不同变换。所以我有一个签名:

sig Transformation {
    nodes : some Node,
    added_node : one Special_Node
}

为了应用这种转换,我在签名的事实部分声明了 3 个关系,这些关系适用于图形的不同部分。关系的左侧与输入图相关,右侧与输出图相关:

some mapping_rel0_nodes : rel0In one -> one rel0Out|{
    C1 && C2 && C3 
}
&&
some mapping_rel1_nodes : rel1In   ->  some (rel1Out+special_Node) | {
    C1' && C2' && C3'
}
&&
some mapping_rel2_nodes : rel2In   ->  some (rel2Out+special_Node) |{
    C1'' && C2'' && C3''
} && 
 out.nodes <: connections = ~mapping_rel2_nodes.inpCnx.mapping_rel2_nodes +
                            ~mapping_rel1_nodes.inpCnx.mapping_rel1_nodes +
                            ~mapping_rel0_nodes.inpCnx.mapping_rel0_nodes

每个关系都适用于图形的不同不相交部分,但它们通过它们之间的连接连接。CX、CX' 和 CX'' 是应用于关系的约束。节点具有以下签名:

sig Node{
    connections : set Node
}{
    this !in this.@connections
}

为了获得新连接,我获取输入图 inpCnx 中的所有连接,并使用为每个点获得的映射来获取新图中的关联连接。

我的问题是:

  • mapping_relX_nodes在他的这一步仍然为人所知吗?
  • 当我在计算器中控制它们并在适当的实例上手动执行操作时,它可以工作,但表示为事实,它不返回任何实例。我读了这篇文章,我想知道是否有其他工具来控制表达式和变量,比如调试打印或其他?
  • 这些关系具有相同的arity,但rel0是双射的,其他只是二元关系。由于 rel0 的双射性,是否存在任何约束,即这些关系的并集必须是双射的?
  • 根据我在评估器中的经验,当元组重复时,其中一个被删除:{A$0->b$0, A$0->B$0}变得{A$0->B$0}。但有时可能需要同时保留两者,有没有办法同时拥有两者?

提前谢谢。

你问:

mapping_relX_nodes在他的这一步仍然为人所知吗?

如果没有一个完整的工作模型来测试,很难给出一个绝对确定的答案。 但是合金纯粹是陈述性的,mapping_rel1_nodes等的使用似乎不是局部变量,因此事实第四连词中的引用将以与其他结合词中的引用相同的方式绑定。 (或者不绑定,如果它们未绑定。

当我在计算器中控制它们并在适当的实例上手动执行操作时,它可以工作,但表示为事实,它不返回任何实例。我读了这篇文章,我想知道是否有其他工具来控制表达式和变量,比如调试打印或其他?

不是我知道的。 根据我的经验,当某些东西在评估器中似乎按预期工作,但我无法让它在事实或谓词中工作时,我几乎总是无法正确理解事实或谓词的语义。

这些关系具有相同的arity,但rel0是双射的,其他只是二元关系。由于 rel0 的双射性,是否存在任何约束,即这些关系的并集必须是双射的?

不(除非我完全误解了你的问题)。

根据我在计算器中的经验,当元组重复时,其中一个被删除:{A$0->b$0,A$0->B$0}变成{A$0->B$0}。但有时可能需要同时保留两者,有没有办法同时拥有两者?

是的;合金适用于套装。 (所以重复项没有被"删除"——只是集合没有重复项。 要区分两个原本相同的元组,您可以 (a) 向元组添加另一个值(因此对变为三元组,三元组变为 4 元组,n 元组成为元组,arity 为 n+1),或 (b) 为表示元组的对象定义签名。 由于签名的成员具有对象标识,而不是值标识,因此它们可用于区分不同出现的对,例如 A$0->B$0。

最新更新