Моделирование комбинационных схем
Моделирование электронных схем начинается с определения функциональных элементов и правил их работы. Пусть функциональными элементами являются двухвходовые логические элементы И, ИЛИ и инвертор НЕ.

Так как эти элементы работают в двоичной логике, введём новый домен, содержащий только два элемента – ноль и единицу:
domains bool = [0..1].
Опишем логику работы элементов в виде соответствия выходного сигнала Out поданным входным сигналам In1 и In2:
class facts
и : (bool In1,bool In2,bool Out). или : (bool In1,bool In2,bool Out). не : (bool In,bool Out). clauses
и(0,0,0). и(0,1,0). и(1,0,0). и(1,1,1). или(0,0,0). или(0,1,1). или(1,0,1). или(1,1,1). не(0,1). не(1,0).
А теперь разработаем на Прологе модель элемента И‑НЕ на основе двух соответствующих элементов. Для этого выход Y элемента И соединим со входом элемента НЕ (рис.2).

Объявим предикат в разделе предикатов:
и_не : (bool In1,bool In2,bool Out) nondeterm anyflow.
и определим правило в разделе предложений:
и_не(X1,X2,Z) :- и(X1,X2,Y), не(Y,Z).
Обратите внимание, что переменная Y, являющаяся выходной в предикате и(X1,X2,Y) , одновременно является входной в предикате не(Y,Z). Это полностью соответствует описанию на рис.1.
Пример 5. Проверим работу элемента И‑НЕ с помощью нижеуказанной программы:
implement main
open core, console
domains bool = [0..1]. constants className = "com/visual-prolog/main". classVersion = "$JustDate: $$Revision: $". class facts и : (bool In1,bool In2,bool Out). или : (bool In1,bool In2,bool Out). не : (bool In,bool Out). class predicates и_не : (bool In1,bool In2,bool Out) nondeterm anyflow. clauses classInfo(className, classVersion). и(0,0,0). и(0,1,0). и(1,0,0). и(1,1,1). или(0,0,0). или(0,1,1). или(1,0,1). или(1,1,1). не(0,1). не(1,0). и_не(X1,X2,Z) :- и(X1,X2,Y), не(Y,Z). run():- init(), и_не(X1,X2,Z), writef("% % -> %",X1,X2,Z),nl, fail(); write("Всё!!!"), _=readchar(). end implement main goal
mainExe::run(main::run).
Запустите эту программу и убедитесь, что она печатает на экране таблицу истинности для элемента И‑НЕ. Эта модель может работать при любой комбинации входных и выходных данных.
Пример 6. Для определения выхода Z элемента И‑НЕ при входах 0 и 1 достаточно изменить цель следующим образом:
run():-
init(),
и_не(0,1,Z),
writef("0 1 -> %",Z),nl,
fail();
write("Всё!!!"),
_=readchar().
Пример 7. Обратная задача: какие должны быть входы X1, X2 для того, чтобы выход Z был единицей? Для её решения достаточно указать требуемый выход, а в качестве входов использовать свободные переменные:
run():-
init(),
и_не(X1,X2,1),
writef("% % -> 1",X1,X2),nl,
fail();
write("Всё!!!"),
_=readchar().
Пример 8. Комбинированная задача: какой должен быть вход X2 для того, чтобы при входе X1 = 1 выход Z был единицей? Для её решения надо указать значения для X1 и Z, а переменную X2 оставить свободной, чтобы Пролог сам нашёл её значение:
run():-
init(),
и_не(1,X2,1),
writef("1 % -> 1",X2),nl,
fail();
write("Всё!!!"),
_=readchar().
Пример 9. Надо проверить, допустима ли такая комбинация входных и выходных значений: X1=1,X2=1,Z=0. Укажем её в предикате и_не(1,1,0):
run():-
init(),
и_не(1,1,0),
writef("1 1 -> 0"),nl,
fail();
write("Всё!!!"),
_=readchar().
Задача 6. Разработайте и проверьте модель элемента ИЛИ‑НЕ.
Задача 7. Разработайте и проверьте модель xor/3 двухвходового сумматора по модулю 2. Его по-другому называют “исключающее ИЛИ”. Логика его работы проста – если входы различны, то на выходе – единица, иначе – ноль.
Задание повышенной трудности. Разработайте и проверьте модель двухразрядного двоичного сумматора sum/7. Описание аргументов: sum(X1, X2, Y1, Y1, Z1, Z1, P). Здесь складывается двухразрядное число X и двухразрядное число Y. Получаемый результат: двухразрядное число Z и сигнал переноса P.
