Сохранить тот же индекс в анализаторе сплавов?

#alloy #model-checking

Вопрос:

Я хочу выделить машины операторам. Каждая машина имеет фиксированный набор работ (например, машина 1 выполняет работу 2 и работает). Вот простой пример вывода с 2 операторами (operator1,operator0) и 3 машинами (machine1_0,machine1_1,machine2):

введите описание изображения здесь

Проблема в том, что он генерирует больше моделей, чем необходимо, потому что он создает модели с той же «работой s», но с изменением индекса. Например, в одной модели:

 machine1_0 -> do -> {work1_1 , work2_2}
machine1_1 -> do -> {work1_0 , work2_1}
 

и в другом (идентичное распределение)

 machine1_0 -> do -> {work1_0 , work2_2}
machine1_1 -> do -> {work1_1 , work2_1}
 

Мне нужно, чтобы этих повторяющихся моделей не было, когда я передаю эту модель второму программному обеспечению.

Я хочу, чтобы machine1_0 придерживался одних и тех же work1_x и work2_y для всех выходных моделей.

Есть какие-нибудь предложения? Спасибо.

Код:

 sig operator{
    runs: set Machine
}

abstract sig Machine{
    do: set Work
}
fact {all m:Machine | #runs.m = 1}
fact {all m:Machine | disj [m.do , (Machine-m).do ] }
fact{all w:Work | #(do.w) >= 1 }

sig machine1 extends Machine{}{
    #do = 2
    not disj [do , work1]
    not disj [do , work2]
}


sig machine2 extends Machine{}{
    #do = 2
    not disj [do , work2]
    not disj [do , work3]
}

abstract sig Work{}

sig work1 extends Work{}
sig work2 extends Work{}
sig work3 extends Work{}



pred checktime{}


run checktime for exactly 2 operator, exactly 2 machine1, exactly 1 machine2, 6 Work
 

(Примечание. Для этого простого примера мы не повторяем модели, но когда количество задач, машин и операторов растет.)

Ответ №1:

Исходя из моего понимания вашей проблемы, вы хотели бы, чтобы в ваших экземплярах было не более одной работы1, не более одной работы2 и не более одной работы3.

Чтобы достичь этого эффекта, вы можете просто добавить желаемую кратность в свою декларацию подписи:

 abstract sig Work{}
lone sig work1,work2 ,work3 extends Work{}