
Сообщение от
capzap
...пример реализации логической машины состояний с использованием четырёхзначной логики
Но ведь подменены понятия. Это пример банального автомата, а с "использованием четырёхзначной логики" это набор стандартных операторов "четырёхзначной логики".
Ожидаются операторы для 1,2,3 и 4 входных элементов. Иначе это все профанация и смесь всего что-то тока можно.
Например
Код:
IF Input1 = 0 AND Input2 = 0 THEN
PumpState := 0; // Переход в состояние Ложь
END_IF;
оператор AND_для_4х_логики_для_2х_операндов
Немного википедии
Булева логика допускает ... 4 унарных оператора; добавление третьего значения в троичной логике приводит к общему количеству .. 27 различных операторов для одного входного значения. ...
Аналогично, там, где булева логика допускает ... 16 различных двоичных операторов (операторов с 2 входами), троичная логика допускает ... 19 683 таких оператора...
Тенденции очевидны.
Да и приведен вариант уже сокращенный - "выносы за скобки" и т.п. Полный вариант это:
Код:
Input1,
Input2: INT(0..3);
--
case PumpState of
0:
case Input1 of
0:
case Input2 of
0: ..
..
3: ..
end_case
..
3:
case Input2 of
0: ..
..
3: ..
end_case
..
..
case Input1 of
0:
case Input2 of
0: ..
..
3: ..
end_case
..
3:
case Input2 of
0: ..
..
3: ..
end_case
..
end_case
end_case
А што такое
Код:
case PumpState of
0:
case Input1 of
0:
case Input2 of
0: ..
..
3: ..
end_case
.. и до конца? Это просто функция (а может и оператор - много их там должно быть) для 3-х 4-х вариантных (дарю термин) аргументов, такого вида:
Код:
PumpState := f(Input1, Input2, PumpState);
а как её обработать? дык
Код:
case Input1 * 16 + Input2 * 4 + PumpState of
0: PumpState := ...
...
63: PumpState := ...
end_case
Всё. Просто всё.
А можно охренительно быстро и без case?
Можно. Просто массив M[0..63] of INT с заранее заданными значенииями. И тогда просто:
Код:
PumpState := M[Input1 * 16 + Input2 * 4 + PumpState];
И всё. Но с маленьком ньюансом. Надо запрыгнуть в 5-ти значную логику чтоб добавить, например, 4 - оставить как есть.
И тогда вся функция:
Код:
X := M[Input1 * 16 + Input2 * 4 + PumpState];
if X <> 4 then
PumpState := X;
end_if
а учитывая что на текущих железках даже с доп.значением(4) на массив 64 байта это слезы, а коли зачем-то нужно ужать то и 24 байта (хотя непонятно, не уйдут ли сэкономленные 40 байт в код) теряет смысл какое-то кодирование этих 1..3 да и может 4 операндовых операций этой "4-ичной логики" на 2-ичной машине. Тупо набор быстроадресуемых таблиц.
А массив не хочется (входных очень много) и для повышения наглядности (а это пипец какой важный фактор)
сделать не
Код:
X := Input1 * 16 + Input2 * 4 + PumpState
а (следите за руками)
X := Input1 *
100 + Input2 *
10 + PumpState;
тогда фрагмент
CASE PumpState OF
0: // Ложь
IF Input1 = 1 THEN
PumpState := 1; // Переход в состояние Истина
ELSIF Input1 = 2 THEN
PumpState := 2; // Переход в состояние Неопределённость
END_IF;
превращается (в шорты?)
Код:
case X of
000: PumpState := PumpState;
010: PumpState := PumpState;
020 PumpState := 2;
030: PumpState := PumpState;
100: PumpState := 1;
110: PumpState := 1;
120: PumpState := 1;
130: PumpState := 1;
200: PumpState := PumpState;
210: PumpState := PumpState;
220: PumpState := 2;
230: PumpState := PumpState;
300: PumpState := PumpState;
310: PumpState := PumpState;
320: PumpState := 2;
330: PumpState := PumpState;
а зачем нам лишнее?
Код:
case X of
020 PumpState := 2;
100: PumpState := 1;
110: PumpState := 1;
120: PumpState := 1;
130: PumpState := 1;
220: PumpState := 2;
320: PumpState := 2;
И это чистые состояния без шулерского подмешивания какой-то примитивной 2-ичной логики с её IF и т.п)))
(мелкие ошибки могут быть - я этот диссер не рецензировал)