Проверка схемы с помощью пролога

Мне были предоставлены функции и предикат для проверки 2-битной полной сумматорной схемы. Вот что я понял до сих пор:

функция signal (t), где t - терминал, а signal принимает значение 1 или 0.

signal(T, V) :- V is 1; V is 0.

функция type (x), где type - это элемент схемы, а type (x) может принимать значение xor, и, или

type(X, T) :- T is and; T is or; T is xor.

функция out (x), обозначающая выход на вентиле x, а in (n, x) n - это входной терминал.

out(X, O) :- type(X, and), O is I1+I2, in(1, X, I1), in(1, X, I2). 
%%and so on for other gates

для ворот предикаты задаются как

forall X[{type(X) == OR} ----> {(out(X) =1)}-----> for some y(in(y, X) = 1)]

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

Любая помощь была бы очень полезной!


person Tanmay Das    schedule 06.09.2016    source источник
comment
Вы прочитали какой-либо учебник по Прологу или есть учебник по Прологу? Возможно, вы захотите просмотреть информацию под тегом пролога.   -  person lurker    schedule 06.09.2016
comment
Вы писали код серым цветом или он был предоставлен?   -  person JustAnotherSoul    schedule 08.09.2016


Ответы (1)


Во-первых, вам следует выбрать лучшее представление для ваших проблем. Для этого достаточно фактов. Схемы могут быть представлены в виде:

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