Итак, я нашел решение для этого, но это не очень приятно, так как я не могу получить кортеж обратно из BDD, не зная, сколько логических переменных я использовал для представления целого числа в двоичном формате. Поэтому я должен определить в начале, например: Все мои целые числа меньше 64, поэтому они представлены 6 двоичными переменными. Если я хочу добавить большее число, чем 64, то у меня возникнет проблема, но я не хочу использовать максимальный размер целых чисел с самого начала, чтобы сэкономить время, потому что я хотел использовать BDD, чтобы сохранить работу времени, иначе есть много более простых вещей, чем BDD для просто представления кортежей.
Я использую JDD как свою библиотеку BDD, поэтому в JDD BDD представлены как целые числа.
Так вот как я получу BDD из целочисленного кортежа:
В начале вы должны создать BDD-переменные, то maxVariableCount
максимальное число двоичных переменных, которые представляют собой целое число (объяснено в начале этого ответа):
variablesDefinition
- это просто число целочисленных переменных, которые я хочу представить позже в BDD. Таким образом, в примере моего вопроса variablesDefinition будет 2, потому что каждый кортеж имеет две переменные intereger.
Массив variables
представляет собой массив двух измерений, в котором есть все переменные BDD. Так, например, если наш кортеж имеет 2 элемента, переменные BDD, которые представляют первую целочисленную переменную, можно найти в variables[0]
.
BDD bddManager = new BDD(1000,100);
private int variablesDefinition;
private int[][] variables;
private void createVariables(int maxVariableCount) {
variables = new int[variablesDefinition][maxVariableCount];
for(int i = 0; i < variables.length; i++) {
for(int j = 0; j < maxVariableCount; j++) {
variables[i][j] = bddManager.createVar();
}
}
}
Затем мы можем создать bdd из заданного целочисленного кортежа.
private int bddFromTuple(int[] tuple) {
int result;
result = bddManager.ref(intAsBDD(tuple[0],variables[0]));
for(int i = 1; i < tuple.length; i++) {
result = bddManager.ref(bddManager.and(result, intAsBDD(tuple[i], variables[i])));
}
return result;
}
private int intAsBDD(int intToConvert, int[] variables) {
return bddFromBinaryArray(intAsBinary(intToConvert, variables.length), variables);
}
private int[] intAsBinary(int intToConvert, int bitCount) {
String binaryString = Integer.toBinaryString(intToConvert);
int[] returnedArray = new int[bitCount];
for (int i = bitCount - binaryString.length(); i < returnedArray.length; i++) {
returnedArray[i] = binaryString.charAt(i - bitCount + binaryString.length()) - DELTAConvertASCIIToInt;
}
return returnedArray;
}
static int DELTAConvertASCIIToInt = 48;
private int bddFromBinaryArray(int[] intAsBinary, int[] variables) {
int f;
int[] tmp = new int[intAsBinary.length];
for(int i = 0; i < intAsBinary.length; i++) {
if(intAsBinary[i] == 0) {
if (i == 0) {
tmp[i] = bddManager.ref(bddManager.not(variables[i]));
}
else {
tmp[i] = bddManager.ref(bddManager.and(tmp[i-1], bddManager.not(variables[i])));
bddManager.deref(tmp[i - 1]);
}
}
else {
if (i == 0) {
tmp[i] = bddManager.ref(variables[i]);
}
else {
tmp[i] = bddManager.ref(bddManager.and(tmp[i-1], variables[i]));
bddManager.deref(tmp[i - 1]);
}
}
}
f = tmp[tmp.length-1];
return f;
}
Моего первое намерение состояло в том, чтобы добавить эти кортежи к BDD, а затем быть в состоянии выполнять арифметические функции в целых числах в BDD, но это возможно только после преобразования BDD обратно кортежи и выполнения функции и возвращая его в BDD, что разрушает все причины, по которым я хотел использовать BDD.
Какая у вас на самом деле проблема? Вы не знаете, как представлять отношение для целых чисел как таблицу истинности, или вы не знаете, как сделать BDD из таблицы истинности? –
Я не знаю, как выполнять арифметические функции для целых чисел, представленных в BDD, без преобразования BDD в целые числа, выполняющие функцию, и преобразование их обратно в BDD с помощью Java. Я слышал, что это работает для других библиотек на других языках программирования, но я думаю, что этого не существует в этих java-библиотеках. – tralala
В вашем вопросе ничего не говорится об арифметических функциях. –