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

2024-09-28 05:43:14 发布

您现在位置:Python中文网/ 问答频道 /正文

好了,孩子们,我们开始吧。首先,我有几个问题。由于我的项目很大,我将简单地分阶段提问,这个问题是第一个问题。我正在创建一个为后缀逻辑表达式生成真值表的程序。以下是允许的运算符及其逻辑等价物:

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

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

^{pr2}$

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

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

以及

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

如何分配两个不同的输入,以便在python dict中使用?我希望这不会太混乱,我对python不在行,任何帮助都将不胜感激。谢谢您!在

更新 好的,这是我现在的代码:

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

Tags: or代码in程序tokenfalsetruereturn
1条回答
网友
1楼 · 发布于 2024-09-28 05:43:14

你必须按照从外到内的顺序来构建你的口述:

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

数字表示运算符需要多少操作数。在

要解析输入,请从右向左读取。在

使用递归函数,该函数从右侧使用一个令牌。在

(1)如果令牌是运算符(即字典中的键),则从主字典中检索相应的值

首先存储的数字是运算符接受的参数数。所以你的函数现在必须在有参数的时候调用它自己。一定要跟踪哪些令牌已经被读取。一种很好的方法是使用列表迭代器,它将精确地输出每个元素一次,这样就不会出现索引错误。一旦你有了所有的参数,你就应用你刚刚检索到的真值表,读出结果并返回它。在

(2)如果令牌不是操作器,则函数必须返回它。在

^{pr2}$

相关问题 更多 >

    热门问题