使用prolog进行电路验证

时间:2016-09-06 15:18:18

标签: prolog clpb

我已经获得了用于验证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函数如何返回某些东西(我认为结果也必须作为参数提供)。

任何帮助都非常有用!

1 个答案:

答案 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.