指定合金中关系的属性

时间:2015-10-13 01:24:38

标签: alloy

我试图在Alloy中表达关系的某些数学属性,但我不确定我是否有正确的方法,因为我只是一个初学者。非常感谢来自专家社区的任何见解!

将关系域指定为单例。例如以下是一种合理而正确的方法吗?

pred SingletonDomain(r: univ->univ) {
 one ~r
}

sig S2 {}
sig S1 {
 child: set S2
}

fact {
  SingletonDomain [child]
}

或应该是以下

pred SingletonDomain (r: univ->univ) {
  #S2.~r = 1
}

这不是非常模块化,因为S2的使用非常特定于特定签名。

指定关系是总订单的事实。目前我正在使用以下内容,基本上我正在模拟xor

pred total[r: univ->univ] {
  all disj e, e': Event | (e.r = e' and e'.r != e) or (e.r != e' and e'.r = e)
}

由于

1 个答案:

答案 0 :(得分:3)

要指定给定关系的域是单身的事实,您的第一次尝试真的很接近。唯一的问题是one ~r强制r关系的倒数(因此r关系本身)由单个元组组成。这不是你想要表达的。 你想要表达的是,r关系范围内的所有元素通过其反比关系具有相同的(因此只有一个)图像。 因此,您应该编写以下谓词:

pred SingletonDomain(r: univ->univ) {
   one univ.~r
}

对于您的第二个问题,您的谓词不处理e -> e' -> e '' -> e.处理案例,您可以使用传递闭包。