好的男孩和女孩在这里我们去。首先,我有几个问题。由于我的课程很大,我只会分阶段提问,这个问题是第一个。我正在创建一个为后缀逻辑表达式生成真值表的程序。以下是允许的运算符及其逻辑等价物:
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))]
答案 0 :(得分:2)
你必须按照从外到内的分辨率顺序构建你的dicts:
JSONObject jsonObj = new JSONObject(response);
数字表示操作员需要多少操作数。
解析输入从右向左读取。
使用递归函数,该函数使用右边的一个标记。
(1)如果令牌是操作员(即词典中的一个键),则从主词典中检索相应的值。
首先存储的数字是运算符所占用的参数数量。所以你的函数现在必须多次调用自己,就像有参数一样。务必跟踪已经读取的令牌。这样做的一个巧妙方法是使用列表迭代器,它会将每个元素精确地吐出一次,这样就无法使索引错误。一旦你获得了所有参数,你就应用了刚刚检索过的真值表,读出结果并将其返回。
(2)如果令牌不是操作者,你的功能必须将它返回。
master_dict = {
'=': (2, {(True, True): True,
(True, False): False,
...
}),
...
'!': (1, {True: False,
False: True})}