вы можете просто использовать ключевое слово disj при объявлении вашего поля elem
sig List {
header: set Node
}
sig Node {
link: set Node,
disj elem: set Int
}
Это сокращение для выражения того, что не существует двух узлов n1 и n2 таких, что n1 != n2 и n1.elem & n2.elem != none
Что касается того, что вы пытались,
all n: Node | n.elem != n.*link.elem
говорит, что для всех узлов n элементы, связанные с n, отличаются от элементов, связанных с узлами, связанными с n. Это имеет два потока.
Во-первых, вы не принимаете во внимание узлы, не связанные с n.
Во-вторых, вы должны принять во внимание, что elem представляет собой набор целых чисел. Предположим, что n1.elem= {1,2,3,4} и n2.elem={1,2,3}. записи n1.elem недостаточно, поскольку {1,2,3,4} != {1,2,3}. В этом случае n1 и n2 указывают как на 1,2, так и на 3 . Таким образом, дизъюнкция - это то, что вам нужно.
person
Loïc Gammaitoni
schedule
02.02.2015