一种逻辑门的代码表达形式
2019-04-20 本文已影响29人
日更专用小马甲
最近在做逻辑门的模拟,通过代码实现与、或、非,并在此基础上组装出更加复杂的门电路。
场景是这样的:
与非门(NAND)在底层其实是与门和非门的串联,也就是说把与门的输出作为非门的输入。
这件事用电路图画起来倒是没什么难度。转换成Java代码的过程中,为了显得更OO一点,一开始甚至还定义了一个LogicGate
接口(捂脸)。但在表示两个门串联的时候,就稍微有点力不从心了。最后竟然还弄了个Line
出来。
但是,转眼一想,写成数学公式不就是f(g(x, y))
么?其中:
g代表“与门”对应的函数
f代表“非门”对应的函数
对应成Lisp写法跟数学的表达式基本一致。核心代码大概是:(NOT (AND (x y)))
其中,串联无非就是在函数外层再套函数,并联就是把上个函数作为外层函数的入参。比如,异或门可以写为:(AND (NOT (AND (x y))) (OR x y))