सत्य सारणी को छोटी से छोटी संभव में कैसे मोड़ें यदि / अन्यथा ब्लॉक करें


20

मैं एक सत्य तालिका कैसे ले सकता हूं और यदि इसे ब्लॉक किया जाता है तो इसे एक कॉम्पैक्ट में बदल सकता है?

उदाहरण के लिए, मान लें कि मेरे पास यह सत्य सारणी है जहाँ A और B स्थितियाँ हैं और x, y और z संभावित क्रियाएँ हैं:

A B | x y z
-------------
0 0 | 0 0 1
0 1 | 0 0 1
1 0 | 0 1 0
1 1 | 1 0 0

यह ब्लॉक में बदल सकता है:

if(A)
{
    if(B)
    {
        do(x)
    }
    else
    {
        do(y)
    }
}
else
{
    do(z)
}

यह एक आसान नमूना है, लेकिन मेरे पास अक्सर कई स्थितियां होती हैं, जिन्हें अलग-अलग तरीकों से संयुक्त करके अलग-अलग आउटपुट का उत्पादन करना चाहिए और अगर एक ब्लॉक में उनके तर्क का प्रतिनिधित्व करने के लिए सबसे कॉम्पैक्ट और सुरुचिपूर्ण तरीके का पता लगाना मुश्किल हो जाता है।


10
आपका मतलब है कर्णघट के नक्शे को एक इफ्लेसी कैस्केड में बदलना?
शाफ़्ट फ्रीक

@ratchet: लगता है जैसे मैं यह नहीं करता? मैं उनके बारे में पहले नहीं जानता था। कुछ पढ़ना होगा, लेकिन फिर भी और मेरे लिए ऐसा करने वाला ऐप अच्छा होगा, अगर मेरे हाथ से बने परिणामों को सत्यापित करने के लिए और कुछ नहीं होगा।
जुआन

1
@jalayn सबसे अधिक कर्णघट उपकरण डिजिटल सर्किटरी के लिए हैं; उन लोगों की तुलना में अलग-अलग अनुमान हैं कि सवाल क्या है
शाफ़्ट फ्रीक

1
@ जसोल्दी: आपके द्वारा प्राप्त उत्तर उस साइट पर निर्भर होंगे जो आप पूछते हैं। यदि आप किसी विशेष कोड के टुकड़े पर टिप्पणी चाह रहे हैं, जिसमें कुछ इफ-ब्लॉक हैं, तो यह निश्चित रूप से कोड समीक्षा (बीटा) से संबंधित हैStackoverflow आपको उपकरण और तकनीक सिखाएगा। प्रोग्रामर पर। ई।, लोग आपको बताएंगे कि क्या आपको मानव समझ के लिए तर्क बयानों के पुनर्लेखन के बारे में चिंतित होना चाहिए या तेज निष्पादन के लिए नहीं होना चाहिए।
rwong

2
टूल अनुशंसाएँ विषय-विषय हैं, लेकिन यदि आप प्रश्न को " मैं यह कैसे करूं?" यह विषय पर होगा। यदि आप एक सॉफ़्टवेयर अनुशंसा चाहते हैं, तो आपको softwarerecs.stackexchange.com पर जाना चाहिए।
किलन फ़ॉथ

जवाबों:


14

यदि आप एक करनौघ मानचित्र से डिजाइन कर रहे हैं, तो कोड इस तरह से भी देख सकता है:

//                   a      b
def actionMap = [ false: [false: { z() },
                          true:  { z() }],
                  true:  [false: { x() },
                          true:  { y() }]]

actionMap[a][b]()

यह कौनसी भाषा है? जावास्क्रिप्ट? अजगर?
TheLQ

एलक्यूक्यू, इसका अजगर नहीं, जावास्क्रिप्ट हो सकता है। लेकिन यह बहुत कुछ वैसा ही होगा जैसा कि अजगर में लिखा गया
grizwako

@ THELQ: यह ग्रूवी है, क्योंकि यही मैं इन दिनों कर रहा हूं, और शायद रूबी भी। जावास्क्रिप्ट या पायथन या LUA या पर्ल के लिए कोड बहुत समान होगा।
केविन क्लाइन

2
यह, निश्चित रूप से, मूल्यांकन की आवश्यकता नहीं होने पर भी बी का मूल्यांकन करने का प्रभाव है। शायद यह एक समस्या है, शायद यह नहीं है।
छद्म नाम

@kevincline कृपया, बहुत कृपया, "Lua", "LUA" नहीं। :)
मचाडो

4

C # .NET में, आप किसी भी IF ELSE के बिना परिणाम प्राप्त करने के लिए एक डिक्शनरी क्लास का उपयोग कर सकते हैं - इस बारे में अच्छी बात यह है:

  1. यह पठनीय है
  2. नई कुंजी अद्वितीय होगी (अन्यथा, आपको एक त्रुटि मिलती है)
  3. अनुक्रम कोई फर्क नहीं पड़ता
  4. प्रविष्टियों को जोड़ना या निकालना आसान है

यदि आपके पास डिक्शनरी क्लास के बराबर नहीं है, तो आप बाइनरी लुक-अप / सर्च फंक्शन में भी ऐसा कर सकते हैं।

//A B | x y z
//-------------
//0 0 | 0 0 1
//0 1 | 0 0 1
//1 0 | 0 1 0
//1 1 | 1 0 0
// Create a Dictionary object and populate it
Dictionary<string, string> _decisionTable = new Dictionary<string, string>() { 
    { "0,0", "0,0,1" }, 
    { "0,1", "0,0,1" }, 
    { "1,0", "0,1,0" }, 
    { "1,1", "1,0,0"} 
};

//usage example: Find the values of X,Y,Z for A=1,B=0
Console.WriteLine(_decisionTable["1,0"]);
Console.Read();

1
मुझे यह समाधान पसंद है, जो एकमात्र बदलाव मैं करूंगा वह एक शब्दकोश <tuple <bool, bool>, Tuple <bool, bool, bool> के बजाय एक शब्दकोश <string> string> का उपयोग करना होगा। फिर आपको ऊपर देखने के लिए एक स्ट्रिंग बनाने की आवश्यकता नहीं है और परिणाम को बाद में डिक्रिप्ट करें क्योंकि ट्यूपल्स आपके लिए ऐसा करेगा।
10

@ लाइक, अपनी टिप्पणी के लिए धन्यवाद। आप बिल्कुल सही हैं। मौका मिलने पर मुझे आपकी अच्छी बात को शामिल करना चाहिए।
NoChance

2

आप जो चाहते हैं वह एक रिट एल्गोरिथ्म है । यह स्वचालित रूप से नियमों का एक सेट देता है और उन्हें एक पेड़ में वर्णित करता है जिस तरह से आप वर्णन करते हैं।

कई वाणिज्यिक "नियम इंजन" सिस्टम हैं जो बहुत बड़े पैमाने (लाखों नियमों) पर ऐसा करते हैं जहां निष्पादन की गति आवश्यक है।


2

यहाँ आपकी लाइब्रेरी है :) और आपको पूर्ण के-टेबल को पास करने की आवश्यकता नहीं है, केवल वही फ़ील्ड जो आप में रुचि रखते हैं :) यह मानता है कि सत्य तालिका में इसका AND ऑपरेटर है। यदि आप अधिक ऑपरेटरों का उपयोग करना चाहते हैं, तो आपको इसे फिर से लिखना चाहिए। आपके पास किसी भी तर्क हो सकते हैं। में लिखा pythonऔर परीक्षण किया गया।

def x():
    print "xxxx"

def y():
    print "yyyyy"

def z(): #this is default function
    print "zzzzz"

def A():
    return 3 == 1

def B():
    return 2 == 2


def insert(statements,function):
    rows.append({ "statements":statements, "function":function })

def execute():
    for row in rows:
        print "==============="
        flag = 1

        for index, val in enumerate(row["statements"]):
            #for first pass of lopp, index is 0, for second its 1....
            #if any function returns result different than one in our row, 
            # we wont execute funtion of that row (mark row as not executable)
            if funcs[index]() != val:
                flag = 0

        if flag == 1:
            #we execute function 
            row["function"]()
        else: z() #we call default function


funcs = [A,B]  #so we can access functions by index key
rows = []

insert( (0,0), y)
insert( (0,1), y)
insert( (1,0), x)
insert( (1,1), x)
insert( (0,1), x)

execute()

1

इनपुट्स को एकल मान में मैप करें और फिर उस पर स्विच करें:

#define X(a, b) (!!(a) * 2 + !!(b))
switch(X(A, B)) {
case X(0, 0):
    ...
    break;
case X(0, 1):
    ...
    break;
case X(1, 0):
    ...
    break;
case X(1, 1):
    ...
    break;
}
#undef X

1

फ़ंक्शन पॉइंटर्स वाली लुकअप तालिका कुछ स्थितियों में अच्छी तरह से काम कर सकती है। C में, उदाहरण के लिए, आप ऐसा कुछ कर सकते हैं:

typedef void(*VoidFunc)(void);

void do(int a, int b)
{
    static VoidFunc myFunctions[4] = {z, z, y, x}; // the lookup table

    VoidFunc theFunction = myFunctions[ a * 2 + b ];
    theFunction();
}

यह एक अच्छा समाधान है जब इनपुट की संख्या अपेक्षाकृत कम होती है, क्योंकि तालिका में प्रविष्टियों की संख्या 2 ^^ होनी चाहिए जहां n इनपुट की संख्या है। 7 या 8 इनपुट प्रबंधनीय हो सकते हैं, 10 या 12 बदसूरत होने लगते हैं। यदि आपके पास कई इनपुट हैं, तो पहले अन्य माध्यमों (जैसे कि कर्णघ मानचित्र) को सरल बनाने का प्रयास करें।


0

"भव्य कर्णघ" सॉफ़्टवेयर को देखें - यह आपके नमूने के रूप में सत्य तालिकाओं को काफी हद तक स्वीकार कर सकता है, विश्लेषणात्मक बूलियन सूत्र परिभाषा को स्वीकार कर सकता है, सत्य तालिकाओं के निर्माण के लिए लुआ स्क्रिप्टिंग स्वीकार कर सकता है। अगला, "गॉर्जियस कर्णघ" सॉफ़्टवेयर के-मैप्स को इनपुट के लिए खींचता है, जिसे आप मैन्युअल रूप से या "एस्प्रेसो" लॉजिक मिनिमाइज़र का उपयोग करके कम कर सकते हैं, और सी / सी ++ और कुछ हार्डवेयर भाषाओं के लिए आउटपुट तैयार करते हैं। "गॉर्जियस कर्णघ" के लिए सारांश फ़ीचर पेज देखें - http://purefractalsolutions.com/show.php?a=xgk/gkm


यह बहुत कुछ दिखता है जो मुझे चाहिए, लेकिन ifएक सत्य तालिका में प्रवेश करने के बाद खाली s के अलावा कुछ भी दिखाने के लिए C / C ++ कोड नहीं मिल सका ।
जुआन

हां, लॉजिक फंक्शन न्यूनतम करने के लिए डिज़ाइन किया गया टूल - सत्य तालिका में प्रवेश करने के बाद आपको लॉजिक फ़ंक्शन (PoS / SoP - 0/1 से कम करना होगा)। C ++ कोड को कम से कम करने के बाद "न्यूनतम परिणाम" विंडो में पाया जा सकता है।
पेट्रूचियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.