处理多重关系(arity ~10)
Dealing with multirelations (of arity ~10)
我有一个型号与这个类似:
sig State {
ps: set P,
cs: set C,
o: set C -> set P,
m: set M
}
像这样的谓词,处理两个 State
s:
pred my_pred [s, s': State] {
...
}
我正在尝试创建我的模型的参数化版本,其中我没有 State
签名,而是在函数和谓词中显式传递这些字段。这意味着谓词看起来像
pred my_pred [(M -> P -> C -> (C -> P)) ->
(M -> P -> C -> (C -> P))] {
...
}
我的问题是,如何轻松处理数量比较大的关系,例如my_pred
中的关系?例如,我试图使用 util/relation
中的 dom
,但是 dom
是在二元关系上定义的,不幸的是 alloy 似乎看到了这个
(M -> P -> C -> (C -> P))
->
(M -> P -> C -> (C -> P))
作为元数 10 而不是 2 的关系;意味着忽略括号。因此,使用 dom
会 return 类型为 M
,而不是所需类型的 (M -> P -> C -> (C -> P))
。
还有一个相关的说明,我想知道 if/how 可以在这样的关系上使用传递闭包运算符。
通常来说,元数关系大于 3 是不好的做法。
你为什么不简单地声明你的谓词如下:
pred my_pred [m,m':M , ps,ps':P , cs,cs':C , o,o':(C -> P)] {
...
}
我有一个型号与这个类似:
sig State {
ps: set P,
cs: set C,
o: set C -> set P,
m: set M
}
像这样的谓词,处理两个 State
s:
pred my_pred [s, s': State] {
...
}
我正在尝试创建我的模型的参数化版本,其中我没有 State
签名,而是在函数和谓词中显式传递这些字段。这意味着谓词看起来像
pred my_pred [(M -> P -> C -> (C -> P)) ->
(M -> P -> C -> (C -> P))] {
...
}
我的问题是,如何轻松处理数量比较大的关系,例如my_pred
中的关系?例如,我试图使用 util/relation
中的 dom
,但是 dom
是在二元关系上定义的,不幸的是 alloy 似乎看到了这个
(M -> P -> C -> (C -> P))
->
(M -> P -> C -> (C -> P))
作为元数 10 而不是 2 的关系;意味着忽略括号。因此,使用 dom
会 return 类型为 M
,而不是所需类型的 (M -> P -> C -> (C -> P))
。
还有一个相关的说明,我想知道 if/how 可以在这样的关系上使用传递闭包运算符。
通常来说,元数关系大于 3 是不好的做法。
你为什么不简单地声明你的谓词如下:
pred my_pred [m,m':M , ps,ps':P , cs,cs':C , o,o':(C -> P)] {
...
}