Как выполнить решение ограничений со смешанными типами данных?
я работаю над трансформатором от источника к источнику для Java 6*1).
мне нужно поддерживать отрицательную информацию, а также положительную информацию, поэтому я должен реализовать маленький система ограничения для трансформаторов. The система ограничения - это ограниченный вид формулы CNF, который может быть определен следующим образом:
(v1 == c1 / v2 == c2 ... vn == cn) /
((w1,1 != d1,1 / w1,2 !== d1,2 ... w1,k != d1,k) /
(w2,1 != d2,1 / ...) / ...
(wm,1 != dm,1 / ... / wm,k != dm,k))
здесь vi == ci
are равенство ограничения (замены, назначения переменных),
wj != dj,l
are ограничения disequality,
vi, wj,l
are переменные,
ci, dj,l
are константы (литералы).
постоянный типы в Java примитивные типы и ссылочные типы сопоставленных чисел. Константы также являются произвольными AST-подобными структурами (которые представляют частично оцененные выражения и, возможно, contain (meta)-переменные).
система ограничения работает следующим образом:
когда трансформатор достигает условного (например if(x == c) then b else b1
) ограничение x == c
добавляется система ограничения of затем ветвь и ограничение x != c
, в свою очередь, добавляется к система ограничения (формулу)другое филиала.
Итак, новая формула затем филиал: x == c / formula
(положительной частью формулы является конъюнкция равенств);
новая формула другое филиал: x != c / formula
(отрицательная часть формулы-это соединение дизъюнкций disequalities).
Edit: выполнимость система ограничения.
на система ограничения для того чтобы быть satisfiable должно быть возможно назначить значения к переменные в системе такие, что ограничения выполняются.
на система ограничения удовлетворен МФЛ существует substituition тэта такие, что для каждого уравнения v = c
тэтаv
будет синтаксически идентично тэтаc
, и аналогично, для каждого disequation w != d
тэтаw
будет синтаксически отличаться от тэтаd
.
к сожалению, я довольно новичок в программировании ограничений, и я столкнулся с проблемами.
мне не совсем ясно, как сопоставить константы AST целым числам в этом случае. Должен ли я просто использовать индекс массива констант или некоторую хэш-функцию?
непонятно, как обращаться долго тип. Перепишите решатель на основе int, делая его длинным или используя плавающую точку решатель?
также не ясно, как обрабатывать комбинированные целое и с плавающей точкой данные. Как я понимаю, простое решение использует с плавающей точкой решатель для обоих целое и с плавающей точкой ограничения. Это правда? Или я могу решить с плавающей точкой и целое часть ограничений отдельно?
пожалуйста, кто-нибудь может мне помочь? Некоторые указания, намеки ...
1) в настоящее время схема.
1 ответов
было бы хорошо, если бы вы также разместили свою конечную цель (что на самом деле означает решенное ограничение).
, Мне кажется, что вы хотите знать набор возможных значений для каждой переменной в данной инструкции. В этом случае вам понадобится интервальное ограничение решательразличие между целыми и рациональными интервалами зависит от вашего варианта использования и выбранного вами решателя, но в целом можно обрабатывать целые числа как плавающие точки (что может привести к нецелочисленным решениям вашего ограничения).
Это важно иметь в виду, что вы не уметь доказать равенство произвольных фрагментов AST. Следовательно, вам нужно либо уменьшить выразительность указанных фрагментов (например, многочлены над вашими переменными заданного порядка), либо приблизительное равенство (например, ссылка на то же самое (т. е. тот же контекст, тот же синтаксис, никаких побочных эффектов) АСТ фрагмент. Однако, возможно, лучше всего просто перевести фрагменты AST в несвязанные (или пессимистически связанные) интервалы.