Почему я получаю сумму(‹P/3› ‹P/3›) при использовании Show in 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.


person Angela    schedule 11.11.2015    source источник
comment
где объявление функции sum ?   -  person rok    schedule 11.11.2015
comment
sum не является функцией, потому что функции всегда начинаются с прописной буквы. Вот это метка записи   -  person demesmaekerf    schedule 11.11.2015
comment
извините, вы правы!   -  person rok    schedule 11.11.2015


Ответы (1)


Полный сумматор имеет 3 входа и 2 выхода. Действительно, вы используете Z в функции FullAdder, но никогда не объявляете ее. Поэтому сначала добавьте его в качестве аргумента. Затем вам нужно определить поток для 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 должен работать правильно.

person demesmaekerf    schedule 11.11.2015