2015-05-19 1 views
0

Я действительно новичок в решателях Z3 и SMT. У меня есть следующая проблема, которую я не знаю, как закодировать в Z3py.Z3py SMT кодирование следующих переменных и формул

In the above block diagram, N contains set of nodes.

В приведенной выше схеме N является множество узлов, таким образом, N = {Node1, Node2, node3, Node4, Node5, Node6, Node7}

Я это набор входов, I = { Я , я , я , я }

вывода множество выходов, O = {O , о, О }

G представляет собой группу, где для любых последовательных 2 выходов (O я, О J), если O я генерируется первый выход и О J является второй выход генерируется тогда, G к является множеством узлов, которые были запланированы после генерации O я и до генерации O J, но, если O J был создан до O i, тогда G k содержит все блоки, которые были запланированы до O j. Планирование узлов задается другой программой. Например, в приведенном выше блок-схеме планирования узлов наряду с выработкой продукции выглядит следующим образом:

  • Первый узел по расписанию = Node1
  • Второй узел по расписанию = Node2
  • Третий узел по расписанию = Node5
  • Выход генерируется = O
  • Четвертый узел запланирован = node3
  • Пятый узел по расписанию = Node6
  • Выход генерируется = O
  • Шестой узел запланированную = Node4
  • Пятый узел по расписанию = Node7
  • Выход генерируется = O

Таким образом, из вышесказанного можно сказать, что G за (O , O) is = {Node3, Node6}

Но G для (O , О) является = {Node1, Node2, Node5}

Для выполнения каждого узла нам нужно задание, задание может реализовать 1 узел или ее набор узлов за раз.

Узел г, я обозначает I й узел в группе G г. Задача r, m обозначает m th Задача в группе G r.

Булевы переменные (может быть либо 0 или 1):

  • е Узел г, я Задача г, т представляет, если Узел г, я отображается в Task г, т
  • Ду Узел R, I Узел с, J представляет, если Узел s, j зависит от узла r, i i.e.если существует путь от узла г, я к узлу S, J
  • DT Задача г, т Задача с, п обозначает, является ли Задача S, N зависит от задачи г, т
  • м Задача г, т представляет собой, если есть любой узел отображается на целевой г, м

Основываясь на приведенной выше информации, я должен сформулировать следующие уравнения в SMT.

  1. Минимизация (Σ г, т М Задача г, т)
  2. М Задача г, т> = е Узел г, я Задача r, m (для всех i)
  3. Σ м е Узел г, я Задача г, т = 1 (для всех г = I, O!) пример: е Узел г, я Задача г, т + ж Узел г, я Задача г, т + 1 + ж Node R, I Задача г, т + 2 = 1 + 0 + 0 = Это говорит о том, что узел г, я сопоставлен к задаче г, т Поскольку F Node г, я задача г, т = 1 (только один узел может быть отображен в 1 задачи в то время, но задача может быть отображен на нескольких узлах одновременно)
  4. е узел г, я Задача s, m = 0 (для всех г! = S)
  5. F Узел г, я Задача г, т = 1 (для всех г = I, О и т = I)
  6. ф Узел R, I задачи r, m = 0 (для всех r = I, O и m!= Я)
  7. ДТ Задача г, т Задача с, п> = F Узел R, I задач г, м + F Узел с, J Задача с , п + Д.Н. Узел R, I Узел с, J - 2
  8. ДТ Задача г, т Задача с, п> = DT Задача г, т Задача т, л + DT Задача т, л Задача с, п - 1
  9. ДТ Задача г, т Задача с, п + DT задач s, N задач г , М < = 1

Я не понимаю, как представлять переменные и эти формулы в формате SMT.

ответ

1

Я не уверен, как лучше всего ответить, потому что в этом вопросе содержится много ссылок на специфику, которые не указаны полностью. Например, что такое I, и O? Вероятно, вы спрашиваете, как добавить систему линейных неравенств. Или как указать проблемы с целыми переменными, которые могут быть либо 0, либо 1.

Одним из подходов является введение функции следующим образом:

 a = Function('a', IntSort(), IntSort(), IntSort()) 

Тогда «а» это функция, которая отображает пары целых чисел целое число. Вы можете объявить функцию 'n' аналогичным образом (но, я думаю, ваш пример на самом деле имеет некоторые опечатки, и вы используете n как функцию и как индексную переменную). Вы можете также объявлять функции f, h, q аналогичным образом.

Тогда в питона вы можете написать:

 N = 5 
    s = Solver() # create a solver context 
    for r in range(N): 
     for i in range(N): 
      for m in range(N): 
       if m != i: 
        s.add(f(n(r,i),a(r,m)) == 0) 

Это добавляет ограничения равенства на е, которые вы указали. Другие ограничения равенства и неравенства могут быть добавлены аналогичным образом. В конце вы спрашиваете, является ли результирующее состояние выполнимым.

print s.check() 
    print s.model() # print model for satisfiable outcome. 

и другие подходы, которые вы объявляете различные константы для разных версий ф. В конце концов, ваша предлагаемая проблема указывает, что вы всего лишь , записывая большую систему неравенств по переменным, созданным в разных способах .

E.g., вы можете создать и постоянную v:

v = Const('f(a[%d][%d],a[%d][%d])' % (r,m,r,i), IntSort()) 

вместо приложения функции.

+0

Спасибо, что ответили на мой вопрос, я переформатировал вопрос. Будет ли ответ по-прежнему оставаться таким же для вышеупомянутого вопроса? а также вы могли бы любезно помочь мне понять, как представить выше суммирования терминов. Вышеупомянутые функции, такие как f, будут ли они представлены другим способом для представления зависимостей? – Priyanka