【问题标题】:debugging chained relation declaration in alloy调试合金中的链式关系声明
【发布时间】:2013-10-22 10:03:07
【问题描述】:

我正在使用 Alloy 对图形转换进行建模。 我将我的转换指定为应用于图表不同部分的不同转换。 所以我有一个签名:

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 在他的步骤中仍然是已知的吗?
  • 当我在评估程序中控制它们并在适当的实例上手动执行操作时,它可以工作,但实际上表示为它不返回任何实例。我读了这个post,我想知道是否有其他工具可以控制表达式和变量,比如调试打印或其他?
  • 关系具有相同的元数,但 rel0 是双射的,其他只是二元关系。由于 rel0 的双射性,这些关系的并集必须是双射的吗?
  • 根据我在评估器中的经验,当一个元组重复时,其中一个会被删除:{A$0-&gt;b$0, A$0-&gt;B$0} 变为 {A$0-&gt;B$0}。但有时可能需要两者兼得,有什么办法可以兼得?

提前致谢。

【问题讨论】:

    标签: debugging graph relation alloy


    【解决方案1】:

    你问:

    是否mapping_relX_nodes 在他的步骤中仍然知道?

    如果没有完整的工作模型进行测试,很难给出绝对确定的答案。但是 Alloy 纯粹是声明性的,mapping_rel1_nodes 等的使用似乎不是局部变量,因此您的事实的第四个连词中的引用将以与其他连词中的引用相同的方式绑定。 (或者不绑定,如果他们没有绑定的话。)

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

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

    关系具有相同的元数,但 rel0 是双射的,其他只是二元关系。由于rel0的双射性,这些关系的并集必须是双射的吗?

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

    根据我在评估器中的经验,当一个元组重复时,其中一个被删除: {A$0->b$0, A$0->B$0} 变为 {A$0->B $0}。但有时可能需要两者兼得,有什么办法可以兼得?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多