วิธีเปลี่ยนตารางความจริงให้เป็นขนาดเล็กที่สุดหาก / บล็อก


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)
}

นี่เป็นตัวอย่างง่าย ๆ แต่บ่อยครั้งที่ฉันมีเงื่อนไขหลายอย่างที่รวมกันในรูปแบบที่แตกต่างกันควรสร้างผลลัพธ์ที่แตกต่างกันและมันก็ยากที่จะเข้าใจถึงวิธีที่กะทัดรัดและสง่างามที่สุดในการเป็นตัวแทนของตรรกะในบล็อก if


10
คุณหมายถึงการแปลงแผนที่ Karnaughให้กลายเป็นน้ำตก ifelse?
วงล้อประหลาด

@ วงล้อ: ดูเหมือนว่าฉันจะไม่ได้หรือไม่ ฉันไม่เคยรู้จักพวกเขามาก่อน จะต้องทำการอ่านบ้าง แต่ยังและแอพที่จะทำเพื่อฉันจะดีถ้าไม่มีอะไรอื่นในการตรวจสอบผลการทำมือของฉัน
Juan

1
@jalayn เครื่องมือ karnaugh ส่วนใหญ่ใช้สำหรับวงจรดิจิตอล ผู้ที่มีฮิวริสติกแตกต่างจากคำถามคือ
วงล้อประหลาด

1
@jsoldi: คำตอบที่คุณได้รับจะขึ้นอยู่กับเว็บไซต์ที่คุณขอ หากคุณกำลังมองหาการแสดงความคิดเห็นในส่วนของโค้ดโดยเฉพาะอย่างยิ่งที่มีบางอย่างถ้า-แล้วอื่นบล็อกก็แน่นอนเป็นของการตรวจสอบรหัส (เบต้า) Stackoverflowจะสอนเครื่องมือและเทคนิคให้คุณ ใน programmers.SE ผู้คนจะบอกคุณว่าคุณควร / ไม่ควรกังวลเกี่ยวกับการเขียนข้อความเชิงตรรกะเพื่อความเข้าใจของมนุษย์หรือเพื่อการดำเนินการที่รวดเร็วขึ้น

2
คำแนะนำเครื่องมือนั้นไม่ได้อยู่ในหัวข้อ แต่ถ้าคุณเปลี่ยนคำถามเป็น " ฉันจะทำสิ่งนี้ได้อย่างไร" มันจะเป็นในหัวข้อ หากคุณต้องการคำแนะนำซอฟต์แวร์คุณควรไปที่ softwarerecs.stackexchange.com
Kilian Foth

คำตอบ:


14

หากคุณกำลังออกแบบจากแผนที่ Karnaugh รหัสก็อาจจะเป็นเช่นนั้น:

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

actionMap[a][b]()

นี่คือภาษาอะไร? Javascript? งูใหญ่?
TheLQ

TheQ ไม่ใช่ไพ ธ อนอาจเป็นจาวาสคริปต์ แต่มันจะคล้ายกันมากถ้าเขียนเป็นไพ
ธ อน

@TheLQ: มันคือ Groovy เพราะนั่นคือสิ่งที่ฉันทำในวันนี้และอาจเป็นทับทิมด้วย รหัสสำหรับ Javascript หรือ Python หรือ LUA หรือ Perl จะคล้ายกันมาก
วินไคลน์

2
แน่นอนว่าสิ่งนี้มีผลในการประเมินขแม้ว่าจะไม่จำเป็นต้องมีการประเมิน บางทีนั่นอาจเป็นปัญหา แต่อาจไม่ใช่
นามแฝง

@ kevincline ได้โปรดได้โปรด "Lua" ไม่ใช่ "LUA" :)
Machado

4

ใน C # .NET คุณสามารถใช้ Dictionary Class เพื่อรับผลลัพธ์โดยไม่มี IF ELSE ดังต่อไปนี้ - สิ่งที่ดีเกี่ยวกับเรื่องนี้คือ:

  1. มันสามารถอ่านได้
  2. ปุ่มใหม่จะไม่ซ้ำกัน (มิฉะนั้นคุณจะได้รับข้อผิดพลาด)
  3. ลำดับไม่สำคัญ
  4. ง่ายต่อการเพิ่มหรือลบรายการ

หากคุณไม่มี Dictionary Class ที่เทียบเท่าคุณสามารถทำเช่นนี้ได้ในฟังก์ชันการค้นหา / ค้นหาแบบไบนารี

//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> จากนั้นคุณไม่จำเป็นต้องสร้างสตริงเพื่อค้นหาและแยกแยะผลลัพธ์ในภายหลังเนื่องจาก Tuples จะทำสิ่งนี้ให้คุณ
นอน

@Lyise ขอบคุณสำหรับคำพูดของคุณ คุณถูกต้องอย่างแน่นอน ฉันควรรวมจุดที่ดีของคุณเมื่อฉันได้รับโอกาส
NoChance

2

สิ่งที่คุณต้องการคือขั้นตอนวิธีการ Rete วิธีนี้จะรวมชุดของกฎโดยอัตโนมัติและจัดลำดับความสำคัญของพวกเขาเป็นต้นไม้ในแบบที่คุณอธิบาย

มีระบบ "เครื่องมือสร้างกฎ" เชิงพาณิชย์จำนวนมากที่ทำสิ่งนี้ในขนาดที่ใหญ่มาก


2

นี่คือห้องสมุดของคุณ :) และคุณไม่จำเป็นต้องส่ง K-table แบบเต็มเฉพาะสาขาที่คุณสนใจ :) มันจะถือว่ามันและตัวดำเนินการในตารางความจริง ถ้าคุณต้องการใช้ตัวดำเนินการเพิ่มเติมคุณควรจะสามารถเขียนมันใหม่ได้ คุณสามารถมีข้อโต้แย้งได้ไม่ จำกัด จำนวน เขียน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 โดยที่ n คือจำนวนอินพุต อินพุต 7 หรือ 8 อาจจัดการได้ 10 หรือ 12 เริ่มน่าเกลียด หากคุณมีอินพุตจำนวนมากลองลดความซับซ้อนด้วยวิธีอื่น (เช่นแผนที่ Karnaugh) ก่อน


0

ดูซอฟต์แวร์ "Gorgeous Karnaugh" - สามารถยอมรับตารางความจริงได้อย่างแน่นอนเหมือนตัวอย่างของคุณยอมรับคำจำกัดความสูตรบูลีนเชิงวิเคราะห์ยอมรับสคริปต์ Lua เพื่อสร้างตารางความจริง จากนั้นซอฟต์แวร์ "Gorgeous Karnaugh" จะดึง K-Maps สำหรับการป้อนข้อมูลที่นำมาซึ่งคุณสามารถย่อขนาดด้วยตนเองหรือใช้ "เอสเปรสโซ" ลอจิคัลขนาดเล็กสุดและสร้างผลลัพธ์สำหรับ C / C ++ และภาษาฮาร์ดแวร์บางภาษา ดูที่หน้าคุณสมบัติสรุปสำหรับ "Gorgeous Karnaugh" - http://purefractalsolutions.com/show.php?a=xgk/gkm


สิ่งนี้ดูเหมือนมากกับสิ่งที่ฉันต้องการ แต่ไม่สามารถรับรหัส C / C ++ เพื่อแสดงสิ่งอื่นนอกเหนือจากที่ว่างเปล่าifหลังจากป้อนตารางความจริง
Juan

ใช่เครื่องมือนั้นออกแบบมาเพื่อลดฟังก์ชั่นลอจิก - หลังจากป้อนตารางความจริงแล้วคุณต้องลดฟังก์ชั่นลอจิก (PoS / SoP - ด้วย 0 / by 1) รหัส C ++ สามารถพบได้ในหน้าต่าง "ผลลัพธ์การลดขนาด" หลังจากย่อเล็กสุด
Petruchio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.