我已经获得了用于验证2位全加器电路的函数和谓词。这是我到目前为止所理解的: -
函数信号(t)其中t是终端,信号取值为1或0。
signal(T, V) :- V is 1; V is 0.
函数类型(x)其中type是电路元素,type(x)可以取值xor,和,或
type(X, T) :- T is and; T is or; T is xor.
表示门x和(n,x)n输出的函数out(x)是输入端。
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)]
对于这些我不知道如何将它们转换为prolog代码并且不理解prolog函数如何返回某些东西(我认为结果也必须作为参数提供)。
任何帮助都非常有用!
答案 0 :(得分:0)
首先,您应该为您的问题选择更好的代表。事实对于这个人来说已经足够了。电路可表示为:
in / 1 - >输入信号(0或1)。这是避免无限循环所必需的(见后文)。
xor / 2,和/ 2,或/ 2 - >对电路的逻辑运算 A和B. 不是/ 1 - >等
这样,电路就会采用这种形状:
xor(and(in(In1),in(In2)),or(in(In1),not(in(In3))))
现在,让我们定义一个谓词输出/ 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).
这个preciate在porpouse上是可逆的,因此输入可以保留为自由变量以获得所有输出:
?- 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.