为什么我在 OZ 中使用 Show 时得到 sum(<P/3> <P/3>)?
Why I get sum(<P/3> <P/3>) when I use Show in 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 类似。
一个全加器有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)}
但是你的主要问题是你的异或门函数没有很好地定义。它 returns 一个匿名函数。所以像 {XorG A B} returns 这样的调用是一个函数。实现逻辑门的更好方法是使用通用函数 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 应该可以正常工作。
我正在学习 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 类似。
一个全加器有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)}
但是你的主要问题是你的异或门函数没有很好地定义。它 returns 一个匿名函数。所以像 {XorG A B} returns 这样的调用是一个函数。实现逻辑门的更好方法是使用通用函数 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 应该可以正常工作。