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