Генерация кода из таблиц правды! - PullRequest
1 голос
/ 06 апреля 2011

Как бы странно ни звучал этот вопрос, у меня на самом деле есть набор vairables и несколько условий, в которых они создают допустимое состояние.я, конечно, напишу код, который тестирует их, основываясь на моем понимании, но есть ли генератор системы / кода, который генерирует действительный код со всеми надлежащими оптимизациями?

  $a   $b   Output
 ---------------
  0     0    1
  0     1    0
  1     0    1
  1     1    0

, так что этосистема должна создать код php:

 if($b==0) {}

Для этого:

  $a   $b   Output
 ---------------
  0     0    0
  0     1    1
  1     0    1
  1     1    0

он должен вывести:

 if(($a!=1 && $b!=1) && ($a!=0 && $b!=0)) {}
 // any better way?

Конечно, 0 и 1 здесь простодля иллюстрации - есть реальные строки / значения, с которыми мне нужно сравниваться, поэтому умные методы умножения не сработают.

Ответы [ 4 ]

2 голосов
/ 06 апреля 2011

Ваша система является расширением булевой логики (за исключением &&, || между значениями и! Вокруг определенных значений, вы также используете результаты, основанные исключительно на одном значении истинности, хотя существует несколько значений истинности). Поэтому нормальные подходы не сработают, я посмотрел на K-Map и не думаю, что она сработает здесь.

Вы можете объединить все A, B, C, ... во всех возможных комбинациях, возможно, введя новые значения для всех возможных подмножеств (для обработки (A || B) && C), а затем опробовать все возможные Комбинация операторов во всех этих подмножествах, чтобы увидеть, выполняется ли одна из комбинаций операторов для всех комбинаций, а затем, наконец, вывести правило, возможно, с помощью динамического программирования вы можете немного ускорить это, но это будет медленно для чего-то большего, чем пара ценностей, и это будет сложно для программирования. (это будет намного больше O (n ^ 3), чтобы найти эти правила)

Более быстрое / легкое / быстрое, но более затратное решение для памяти - просто хранить все возможные комбинации, которые являются истинными (или все ложные, в зависимости от того, какой список короче), в хеш-таблице / словаре / массиве.

1 голос
/ 06 апреля 2011

Вы должны быть в состоянии сгенерировать оптимизированное решение, проанализировав таблицу истинности K-map и записав выражение.

0 голосов
/ 06 апреля 2015

Я думаю, что CKen (http://cken.sourceforge.net/) (хорошо для вас).

CKen поддерживает как «верхний регистр», так и «нижний регистр», поэтому он поддерживает 58 (= 2x29)) одиночные переменные!

И в нем могут использоваться самые важные мульти-выражения (по разделителям):

Пример: a,b,c,d,e;(a+b)*c;d*e#a;

С другой стороны,это очень быстро!


Вы должны определить свои переменные, прежде чем использовать их (переменные) в своих выражениях.

0 голосов
/ 07 апреля 2011

Существует много литературы по тому, как делать это вручнуюсм. карты Карно.Вы можете автоматизировать один из этих методов.

Но, по сути, вы хотите построить наивное логическое уравнение, представляющее вашу таблицу истинности, а затем применить к этому уравнению символический логический упрощитель (или минимизатор)языковые синтезаторы делают это как часть процесса генерации кода).

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

 (~a & ~b)  |  (a & ~b) 

Если вы примените к этому логическое упрощение:

  ((~a | a) & ~b)  // combine terms
  (TRUE & ~b )    // consequence of ~a | a
  ~b  // the answer

Ваша вторая таблица выдаст наивное уравнение:

 (~a & b) | (a & ~b )

Что не упрощает далее.

Вы можете использовать систему программной трансформации , чтобы выполнить это.Такая система обычно позволяет вам определить синтаксический анализатор для вашего входного языка (в данном случае таблиц истинности), а также определить преобразования из вашего входного языка в выходной язык и дополнительные преобразования в выходном языке.Ваше преобразование ввода-вывода будет отображать запись таблицы истинности в запись булевого уравнения.Преобразования в булевых уравнениях будут тогда выполнять упрощения.

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

Подобные вещи мы делали довольно часто с нашим DMS Software Reengineering Toolkit .DMS помогает справиться с этой проблемой: она понимает ассоциированные и коммутативные алгебраические перезаписи, что делает создание уравнений упрощения проще и надежнее перед лицом сложных формул.

Мы применили DMS к алгебраическим логическим формулам с буквально сотнями тысяч литералов (в форме A или ~ A) в ряде случаев.Одним из примеров был генератор кода, который принимал описание того, как управлять фабрикой (буквально) с точки зрения датчиков (чтение заводского состояния) и исполнительных механизмов (вещи, которые изменяют фабричное состояние), генерировать уравнения, упрощать их, а затем переводитьих можно использовать для нескольких разных целевых компьютерных языков для промышленных контроллеров, называемых ПЛК.

Вы можете увидеть пример не логического упрощения, а реального алгебраического упрощения с использованием DMS.Булево упрощение проще написать: -}

...