簡體   English   中英

在一個輸出的邏輯電路中,如何得到產生某個輸出的所有輸入組合? (無需蠻力)

[英]In logic circuit with one output , how to get all combination of input which produces a certain output ? (Without brute forcing)

假設我有一個邏輯電路,邏輯電路由輸入、靜態位值(0 或 1)和邏輯門組成。 邏輯電路中的所有邏輯門都接受兩個輸入並產生一個輸出(例如,1 AND 0 = 0)。 邏輯電路只產生一個輸出(0 或 1)。

邏輯電路僅由三個基本邏輯門(NOT、OR、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 編碼: https ://en.wikipedia.org/wiki/Tseytin_transformation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM