【问题标题】:Why I get sum(<P/3> <P/3>) when I use Show in OZ?为什么我在 OZ 中使用 Show 时得到 sum(<P/3> <P/3>)?
【发布时间】:2015-11-11 00:58:53
【问题描述】:

我正在学习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。

【问题讨论】:

  • 函数sum的声明在哪里?
  • sum 不是函数,因为函数总是以大写字母开头。这是记录的标签
  • 对不起,你是对的!

标签: show oz


【解决方案1】:

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

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 应该可以正常工作。

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多