当我在OZ中使用Show时,为什么我得到总和(<p 3 =“”> </p> <p 3 =“”>)?

时间:2015-11-11 00:58:53

标签: show oz

我正在学习Oz,并试图运行我在书中找到的一个例子,它即将模拟一个完整的加法器,但我得到的是sum(),所以我不知道哪里出错,我将不胜感激。

以下是代码的一部分:

fun {XorG X Y}
   fun {$ X Y}
      fun {GateLoop X Y}
         case X#Y of (X|Xr)#(Y|Yr) then
            {X+Y-2*X*Y}|{GateLoop Xr Yr}
         end
      end
   in
      thread {GateLoop X Y} end
   end
end

proc {FullAdder X Y ?C ?S}   
   K L M
in
   K={AndG X Y}
   L={AndG Y Z}
   M={AndG X Z}
   C={OrG K {OrG L M}}
   S={XorG Z {XorG X Y}}
end

declare
X=1|1|0|_
Y=0|1|0|_ C S in
{FullAdder X Y C S}
{Show sum(C S)}

AndG和OrG与XorG类似。

1 个答案:

答案 0 :(得分:0)

全加器有3个输入和2个输出。实际上,您在FullAdder函数中使用Z但从未声明它。所以首先将它添加为参数。然后你必须像为X和Y那样为Z定义一个流。即:

declare
X=1|1|0|_
Y=0|1|0|_ 
Z=1|1|1|_ C S in
{FullAdder X Y Z C S}
{Show sum(C S)}

但是你的主要问题是你的XOR门功能没有明确定义。它返回一个匿名函数。所以像{XorG A B}之类的调用会返回一个函数。实现逻辑门的更好方法是使用通用函数GateMaker,以便不重复代码:

fun {GateMaker F}
   fun {$ Xs Ys}
      fun {GateLoop Xs Ys}
         case Xs#Ys of (X|Xr)#(Y|Yr) then
            {F X Y}|{GateLoop Xr Yr}
         end
      end
   in
      thread {GateLoop Xs Ys} end
   end
end

然后你只需要像这样定义你的大门:

AndG = {GateMaker fun {$ X Y} X*Y end}
OrG = {GateMaker fun {$ X Y} X+Y-X*Y end}
XorG = {GateMaker fun {$ X Y} X+Y-2*X*Y end}
...

正确定义门后,您的FullAdder应该可以正常工作。