我试图在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)
}
由于
答案 0 :(得分:3)
要指定给定关系的域是单身的事实,您的第一次尝试真的很接近。唯一的问题是one ~r
强制r关系的倒数(因此r关系本身)由单个元组组成。这不是你想要表达的。
你想要表达的是,r关系范围内的所有元素通过其反比关系具有相同的(因此只有一个)图像。
因此,您应该编写以下谓词:
pred SingletonDomain(r: univ->univ) {
one univ.~r
}
对于您的第二个问题,您的谓词不处理e -> e' -> e '' -> e.
处理案例,您可以使用传递闭包。