合金关系事实

时间:2012-12-03 08:14:34

标签: alloy

以下是我目前工作的一部分。由于某种原因,我在循环和两种方式之间建立了连接,从消息到线路之间的连接。我不明白为什么线路连接永远不会有多条消息。我的事实可能(很可能)有点不对劲。谢谢你的帮助。

some sig Line{  
    nextLine: some Line,
}

sig Message{
    formedOfLines: Line,
}
fact MessageHasMoreThan1LineHasNextLine{
    all m:Message|#m.formedOfLines>1 implies #m.formedOfLines.nextLine>0
}
fact NoNextLineIsSelf
{
   all l1,l2:Line | l1=l2 implies l1.nextLine!=l2
}
fact LineBelongsToSomeMessage
{
    all l:Line | l in Message.formedOfLines
}

1 个答案:

答案 0 :(得分:0)

您的模型允许每个Line有多个nextLine,这可能不是您的意图。这就是为什么您的NoNextLineIsSelf事实实际上并不会阻止循环,因为如果l.nextLine != l包含多个l.nextLine并且其中一个Line,则l可以为真。您可以将该事实重写为

all l: Line | l !in l.nextLine

禁止所有循环。

要禁止行之间的“双向连接”,您可以编写类似

的内容
all disj l1, l2: Line | l2 in l1.nextLine implies l1 !in l2.nextLine

(我不确定你的哪一个事实应该这样做)

如果您希望Message包含多行,则应将formedOfLines的多重性更改为set,即

sig Message {
  formedOfLines: set Line
}
相关问题