Там есть логический недостаток:
fact SomeFact {
no q, q' : Queue | q.root = q'.root
}
Предположим, что существует экземпляр с единственной очередью Q
, имеющий заданный корень R
. При запуске SomeFact
он будет проверять единственную доступную очередь, Q
, и обнаружит, что Q.root = Q.root
, таким образом, исключая возвращение данного экземпляра к жизни.
То же самое можно сделать для экземпляров с произвольным числом очередей.
Вот рабочая версия:
sig Node {
}
sig Queue {
root : Node
}
fact sss {
all disj q, q' : Queue | q.root != q'.root
}
pred abc() {
}
run abc for 3