Python dict使用真值表的逻辑输入

时间:2017-02-28 04:03:33

标签: python dictionary logic logical-operators

好的男孩和女孩在这里我们去。首先,我有几个问题。由于我的课程很大,我只会分阶段提问,这个问题是第一个。我正在创建一个为后缀逻辑表达式生成真值表的程序。以下是允许的运算符及其逻辑等价物:

Operators:
=                Logical Equivalence (≡ or ↔) 
`->` or `<=`     Logical Implication (→)
+                Disjunction (∨), AKA “or”
*                Conjunction (∧), AKA “and” 
`~` or `!`       Negation (¬), AKA “not”

以下是输入和输出的一些示例:

input
p True =

output
p      p True =
False  False
True   True

input
p !

output
p      p !
False  True
True   False

input
p q =

output
p      q      p q =
False  False  True
False  True   False
True   False  False
True   True   True

好的,我真的知道从哪里开始,但我不是要求任何人为我编写这个程序。我知道我需要使用Python dict编写代码,它匹配相应命题的键。但是我怎么知道哪些用于键和哪些用于值?此外,在以下情况下:

`->` or `<=`     Logical Implication (→)

`~` or `!`       Negation (¬), AKA “not”

如何指定2个不同的输入才能在python dict中使用?我希望这不是太混乱,我在python非常棒,任何帮助都表示赞赏。谢谢!

UPDATE 好的,这是我现在的代码:

propositions = {
    '=' : (2, {(True, True): True,
              (True, False): False,
              (False, True) : False,
              (False, False): True,
              }),
    '->' : (2, {(True, True): True,
                (True, False): False,
                (False, True): True,
                (False, False): True,
                }),
    '+' : (2, {(True, True): True,
               (True, False): True,
               (False, True): True,
               (False, False): False,
               }),
    '*' : (2, {(True, True): True,
               (True, False): False,
               (False, True): False,
               (False, False): False,
               }),
    '!' : (1, {True: False,
               False: True})}

prop = sys.stdin.readline()
prop = prop.split()
prop = prop[::-1]
for x in prop:

我相信我成功地将字符串反转并删除了所有空格,但我仍然对迭代它有点困惑。

第二次更新这里是我的代码:

propositions = {
    '=' : (2, {(True, True): True,
              (True, False): False,
              (False, True) : False,
              (False, False): True,
              }),
    '->' : (2, {(True, True): True,
                (True, False): False,
                (False, True): True,
                (False, False): True,
                }),
    '+' : (2, {(True, True): True,
               (True, False): True,
               (False, True): True,
               (False, False): False,
               }),
    '*' : (2, {(True, True): True,
               (True, False): False,
               (False, True): False,
               (False, False): False,
               }),
    '!' : (1, {True: False,
               False: True})}

prop = sys.stdin.readline()
prop = prop.strip().split()
prop = reversed(prop)
def evaluate():
    token = next(prop)
    try:
        nargs, table = propositions[token]
    except KeyError:
        if token.lower() in ('true', '1'):
            return True
        elif token.lower() in ('false', '0'):
            return False
        else:
            return token
    return table[tuple(evaluate() for i in range(nargs))]

1 个答案:

答案 0 :(得分:2)

你必须按照从外到内的分辨率顺序构建你的dicts:

JSONObject jsonObj = new JSONObject(response);

数字表示操作员需要多少操作数。

解析输入从右向左读取。

使用递归函数,该函数使用右边的一个标记。

(1)如果令牌是操作员(即词典中的一个键),则从主词典中检索相应的值。

首先存储的数字是运算符所占用的参数数量。所以你的函数现在必须多次调用自己,就像有参数一样。务必跟踪已经读取的令牌。这样做的一个巧妙方法是使用列表迭代器,它会将每个元素精确地吐出一次,这样就无法使索引错误。一旦你获得了所有参数,你就应用了刚刚检索过的真值表,读出结果并将其返回。

(2)如果令牌不是操作者,你的功能必须将它返回。

master_dict = {
   '=': (2, {(True, True): True,
             (True, False): False,
             ...
             }),
   ...
   '!': (1, {True: False,
             False: True})}