合金配方,表达foreach操作

时间:2013-10-08 13:35:36

标签: formula alloy

我是合金新用户,我试图在谓词中声明

There is a y in Y for each x in X

但是当我这样写的时候:

all x : X | all y : Y | one y

all x : X | all y : Y | one x => one y

整个X只有一个y

我期望的是,如果有3 x将会有3 y。 我不想使用基数比较,因为我试图模拟态射。

有人可以帮助我吗?

提前感谢。

2 个答案:

答案 0 :(得分:2)

您应该使用user1513683的答案并将f作为sig中的字段,而不是将其用作量化变量,例如

sig X {}
sig Y {}
one sig M {
  f: X one -> one Y
}
run {} for 4

正如您已经意识到的那样,您可以避免引入新的sig并将此约束嵌入到存在量词中,例如,

run {
  some f: X one -> one Y | 1=1
} for 4

你可以在这里使用存在量词而不是二元关系的原因是潜在的约束求解机制。如果目标只是找到量子体的真实存在的二元关系(存在量化)的一个实例,那么比询问身体是否适用于所有可能的二元关系实例(通用量化)要容易得多。对于前一种情况,量词可以被重新定义,即用一些自由变量替换,然后要求求解器找到任何解决方案(这些变量的一组值),以便身体持有;当目标是检查正文所有可能的解决方案时,这个过程根本不可能。

答案 1 :(得分:0)

Y =#X表示Y的数量与X相同。

或者你的意思是#X =< #Y? X中的每个x都有一个Y,可能还有一些备用的Y.

或者您是否需要连接名称?在这种情况下,请介绍

f:X one-> 1 y //恰好是一一 要么 f:X孤立 - >一个Y //每个X只有一个Y,但Y最多只有一个X

以适当的签名。