提问人:i'm ashamed with what i asked 提问时间:11/2/2021 最后编辑:i'm ashamed with what i asked 更新时间:11/4/2021 访问量:394
在一个输出的逻辑电路中,如何得到产生一定输出的所有输入组合?(无蛮力)[已结束]
In logic circuit with one output , how to get all combination of input which produces a certain output ? (Without brute forcing) [closed]
问:
假设我有一个逻辑电路,逻辑电路由输入、静态位值(0或1)和逻辑门组成。逻辑电路中的所有逻辑门都接受两个输入并产生一个输出(例如,1 和 0 = 0)。逻辑电路仅产生一个输出(0或1)。
逻辑电路仅由三个基本逻辑门(NOT、或、AND)组成。
如何获得逻辑电路中导致逻辑电路产生特定输出的所有输入组合?例如,我想得到所有输入的组合,这导致逻辑电路产生输出 1。
我知道我可以通过蛮力来做到这一点,尝试输入的每一种组合。但是,对于大量输入,蛮力方法可能不可行。所以我想知道我是否可以在没有蛮力方法的情况下做到这一点?
我用python编写了一些逻辑电路的脚本实现。但它是一堵代码墙(超过一百行),可能不是世界上最好的逻辑电路实现。所以我觉得没有必要在这里发布代码。但是,如果需要我的代码,请在评论中告诉我,如果我看到足够的需求,那么我会在这里发布。
答:
这最好使用 SAT/SMT 求解器来完成,例如 Microsoft 的 z3:https://github.com/Z3Prover
它可以从 python 编写脚本,您可以要求它查找为您提供所需输出的输入值。下面是一个非常简单的示例:
from z3 import *
in1, in2 = Bools("in1 in2")
out = Bool("out")
s = Solver()
# Encode your circuit here. We'll just do out = in1 \/ in2
s.add(out == Or(in1, in2))
# require output to be true.
# You could also set it to False, if that's what you're looking for.
s.add(out == True)
print(s.check())
print(s.model())
当我运行它时,我得到:
sat
[in1 = True, in2 = False, out = True]
第一行说,这意味着问题确实是可以解决的。(否则你会得到 。sat
unsat
第二行是用于获取此所需输出的赋值。您还可以通过编程来枚举所有可能的解决方案,当然,如果有很多解决方案,这可能会导致很长的运行循环。
有关如何对电路进行编码以使其适合此类分析的详细信息,您应该查找 Tseytin Encoding: https://en.wikipedia.org/wiki/Tseytin_transformation
我应该强调的是,如果你试图“逆向工程”一个单向函数(即,如果你的电路正在计算某种加密算法,如AES/DES,或者进行类似SHA的散列),所有这些都将是徒劳的。目前还没有SAT求解器(或任何其他工具)可以处理这类问题。我在这里谈论的电路类型是常规函数,例如算术或其他常规数据路径。你从来没有说过你正在处理什么样的电路,但请记住这一点。
评论
core.logic
是我个人最有经验的特定现代逻辑编程系统;minikanren.org 是它所模仿的基础,后者的网站有书籍/论文/等的链接)。