Во-первых, вам следует выбрать лучшее представление для ваших проблем. Для этого достаточно фактов. Схемы могут быть представлены в виде:
in / 1 -> входной сигнал (0 или 1). это необходимо, чтобы избежать бесконечных циклов (см. ниже).
xor / 2, и / 2, или / 2 -> логические операции над схемами A и B. не / 1 -> и т. д.
Таким образом, схема примет такую форму:
xor(and(in(In1),in(In2)),or(in(In1),not(in(In3))))
Теперь давайте определим предикат output / 1, который вычисляет состояние схемы:
output(xor(In1,In2),1) :-
output(In1,Out1),
output(In2,Out2),
Out1 \== Out2.
output(xor(In1,In2),0) :-
output(In1,Out1),
output(In2,Out2),
Out1 == Out2.
output(and(In1,In2),1) :-
output(In1,1),
output(In2,1).
output(and(In1,In2),0) :-
output(In1,Out1),
output(In2,Out2),
(Out1==0 ; Out2==0).
output(or(In1,In2),1) :-
(output(In1,1); output(In2,1)).
output(or(In1,In2,0),0) :-
output(In1,0),
output(In2,0).
output(not(In),0) :-
output(In,1).
output(not(In),1) :-
output(In,0).
output(in(0),0).
output(in(1),1).
Это предопределение обратимо на порте, поэтому входные данные можно оставить как свободные переменные для получения всех выходных данных:
?- output(xor(and(in(In1),in(In2)),or(in(In1),not(in(In3)))),Result).
In1 = In2, In2 = In3, In3 = 0,
Result = 1 ;
In1 = In2, In2 = In3, In3 = 0,
Result = 1 ;
In1 = In3, In3 = 0,
In2 = Result, Result = 1 ;
In1 = Result, Result = 1,
In2 = 0 ;
In1 = Result, Result = 1,
In2 = In3, In3 = 0 ;
In1 = In2, In2 = 1,
Result = 0 ;
In1 = In2, In2 = 1,
In3 = Result, Result = 0 ;
false.
output(A,B)
не следует путать с output(in(A),B)
. Первый может быть создан для любой схемы (бесконечный цикл), а второй может быть установлен только на 0 или 1.
Кажется, он работает с рекурсивными схемами:
?- output(or(in(Input),in(InOut)),InOut).
Input = InOut, InOut = 1 ;
InOut = 1.
person
Zebollo
schedule
20.09.2016