如果/ else阻止如何将真值表变为最小


20

如何获取真值表并将其转换为压缩的if块?

例如,假设我有一个真值表,其中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
您的意思是将卡诺地图转换为ifelse级联?
棘轮怪胎

@ratchet:好像我不是吗?我以前不知道 将不得不做一些阅读,但是仍然可以使用对我有用的应用程序来验证我的手工结果,如果没有其他事情的话,将是一个很好的选择。
胡安

1
@jalayn大多数卡诺工具都是用于数字电路的;那些具有与问题无关的试探法
棘轮怪胎

1
@jsoldi:您收到的答案将取决于您询问的站点。如果您要查找包含某些if-then-else块的特定代码段的注释,则该代码段当然属于Code review(beta)Stackoverflow将教您工具和技术。在programmings.SE上,人们会告诉您您是否应该/应该不关心为人类理解还是为了更快地执行而重写逻辑语句。
rwong 2011年

2
工具建议不合时宜,但是如果您将问题更改为“ 该怎么做?” 它将是话题。如果确实需要软件推荐,则应转到softwarerecs.stackexchange.com。
Kilian Foth,2014年

Answers:


14

如果您是根据卡诺地图设计的,那么代码也可能看起来像这样:

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

actionMap[a][b]()

这是什么语言?Javascript?蟒蛇?
TheLQ 2011年

TheLQ,不是python,可能是javascript。但是,如果使用python编写,将会非常相似
grizwako 2011年

@TheLQ:这是Groovy,因为这就是我最近在做的事情,也许还有Ruby。Javascript或Python或LUA或Perl的代码将非常相似。
凯文·克莱恩

2
当然,即使不需要评估,这也具有评估b的效果。也许这是一个问题,也许不是。
别名2014年

@kevincline,请,请“ Lua”,而不是“ LUA”。:)
Machado

4

在C#.NET中,您可以使用Dictionary类来获得结果,而无需任何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
我喜欢这种解决方案,我唯一要做的更改是使用Dictionary <Tuple <bool,bool>,Tuple <bool,bool,bool>而不是Dictionary <string,string>。然后,您不需要构建用于查找的字符串并随后解构结果,因为Tuples会为您完成此操作。
莱塞

@Lyise,谢谢您的发言。你是绝对正确的。如果有机会,我应该把你的观点纳入其中。
2014年

2

您想要的是Rete算法。这将自动组合一组规则,并按照您描述的方式将它们划分优先级。

有许多商业“规则引擎”系统可以在非常大的规模(数以百万计的规则)上执行,而执行速度是至关重要的。


2

这是您的库:)并且您不需要传递完整的K表,只需传递您感兴趣的字段即可:)它假定其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,其中n是输入数量。7或8个输入可能是可管理的,10或12个输入开始变得难看。如果输入的内容太多,请首先尝试通过其他方式(例如卡诺图)进行简化。


0

看一下“ Gorgeous Karnaugh”软件-它可以接受与您的样本相当精确的真值表,接受解析布尔公式定义,接受Lua脚本来构建真值表。接下来,“ Gorgeous Karnaugh”软件绘制K-Map以获取输入,您可以手动或使用“ Espresso”逻辑最小化器将其最小化,并生成C / C ++和某些硬件语言的输出。查看“华丽的卡诺”的摘要功能页面-http://purefractalsolutions.com/show.php?a=xgk/ gkm


这看起来很像我需要的东西,但是if在输入真值表后无法获得C / C ++代码来显示空值以外的任何内容。
2012年

是的,该工具专为逻辑功能最小化而设计-在输入真值表后,您需要使逻辑功能最小化(PoS / SoP-减0 /减1)。最小化后,可以在“最小化结果”窗口中找到C ++代码。
Petruchio 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.