使用python写一个输入命题公式输出真值表的代码,真值表为0或1
时间: 2024-05-01 13:16:28 浏览: 179
真值表生成代码
4星 · 用户满意度95%
以下是一个简单的例子,可以输入一个命题公式并输出真值表:
```python
import itertools
# 定义命题符号的优先级
precedence = {"~": 3, "and": 2, "or": 1}
def evaluate(expression, values):
"""
计算命题表达式的值
"""
stack = []
for token in expression:
if token == "True":
stack.append(True)
elif token == "False":
stack.append(False)
elif token in values:
stack.append(values[token])
elif token == "~":
operand = stack.pop()
stack.append(not operand)
elif token in ["and", "or"]:
right = stack.pop()
left = stack.pop()
if token == "and":
stack.append(left and right)
else:
stack.append(left or right)
return stack.pop()
def parse(expression):
"""
将命题表达式解析为逆波兰表达式
"""
output = []
stack = []
for token in expression:
if token == "True" or token == "False":
output.append(token)
elif token in precedence:
while stack and stack[-1] in precedence and precedence[token] <= precedence[stack[-1]]:
output.append(stack.pop())
stack.append(token)
elif token == "(":
stack.append(token)
elif token == ")":
while stack and stack[-1] != "(":
output.append(stack.pop())
stack.pop()
else:
output.append(token)
while stack:
output.append(stack.pop())
return output
def generate_table(expression):
"""
生成命题表的真值表
"""
variables = set([token for token in expression if token.isalpha()])
variables = sorted(list(variables))
header = variables + [expression]
rows = []
for assignment in itertools.product([True, False], repeat=len(variables)):
row = list(assignment)
values = dict(zip(variables, assignment))
row.append(evaluate(parse(expression), values))
rows.append(row)
return header, rows
if __name__ == "__main__":
expression = input("请输入命题公式:")
header, rows = generate_table(expression)
print("\t".join(header))
for row in rows:
print("\t".join([str(value) for value in row]))
```
这段代码中,我们首先定义了命题符号的优先级,然后定义了三个函数:
- `parse`:将命题表达式解析为逆波兰表达式。
- `evaluate`:计算逆波兰表达式的值。
- `generate_table`:生成命题表的真值表。
在 `generate_table` 函数中,我们首先通过 `itertools.product` 函数生成所有可能的变量赋值组合。然后对于每个赋值组合,我们计算出命题表达式的值,并将变量赋值和命题表达式的值组成一行。最后,我们将所有行组成一个表格,并输出到标准输出流中。
阅读全文