简介:这是一份20秋东北大学《逻辑学》在线平时作业3的答案文档,以docx格式提供,共1个文件,压缩包大小仅18KB,适合正在修读逻辑学课程、需要核对作业答案或考前查漏补缺的同学使用。内容覆盖三段论推理、定义过窄、交叉关系、换质法、预期理由、完全与不完全归纳、模态推理、SOP判断、类比推理、充分条件假言推理等高频考点,每题均附参考答案,有助于快速定位薄弱环节、理解推理规则与谬误类型。已有63人学习浏览,小巧轻便,可直接查看对照,适合期末复习或平时作业自检,是一份简洁实用的逻辑学作业参考答案资料。
1. 一份《逻辑学》平时作业答案 docx,先看穿它背后的任务流
每到20秋东北大学《逻辑学》在线平时作业3的提交周期,班群和论坛里就会冒出一批以“答案”命名的docx。把这类文档当搬运工成果来用,最省事也最没价值;真正值得拆解的,是从作业题目到可提交答案之间的自动化链路。下面按这条任务流来讲:先识别在线作业的题型边界,再用程序做真值表与推理校验,然后把结果整理成平台能读的规范文档,最后固化成一条命令即可复用的辅助工具。
这套做法适合助教、教务、在线练习平台开发者和把作业当练习题的自习者,重点不是抄题,而是把答案文档变成可核验、可再生的数据。对助教来说,批量批改时最怕的就是答案文档里的符号和图例不统一;对平台开发者来说,判分逻辑本身就值得拿真实作业反推;对自习者来说,自己亲手算一遍再和文档核对,比背答案有用得多。
2. 在线逻辑学平时作业的题型边界:判定器到底在判什么
2.1 平时作业3里最常见的三类逻辑题型
在线平台的逻辑学平时作业,题型分布其实很固定。命题符号化、真值表与等值演算、三段论有效性这三类会稳定出现。20秋东北大学《逻辑学》在线平时作业3的答案文档之所以难整理,正是因为它把三种形式混在了一张卷子里:选择题里藏着命题公式,判断题对应真值表结论,填空题则要求补全推导步骤。
这三类题对应计算机里三种可判定的任务。命题符号化本质是把自然语言句子转成抽象语法树;真值表是给定变量个数的全排列枚举;三段论有效性则是带全称量词的推理验证。明白了这一点,答案文档就不该再手写,而应该由程序生成。手写答案最容易在连接词优先级上出错,偏偏在线作业平台只认最终结论,不认中间推导过程。
为什么这类文档总是以docx形式流传?因为在线平台通常不开放批改结果导出,助教需要把参考答案整理成可打印、可张贴的文本。docx恰好能同时容纳公式排版和表格,所以它成了答案载体的事实标准。处理它的正确方式,不是打开后一段段复制,而是把它当作结构化数据源来解析。
2.2 把自然语言命题映射成程序认识的逻辑表达式
在做任何校验之前,先得把题干的自然语言翻译成符号逻辑。建议先在纸上或注释里把连接词标记出来,再写代码,不要直接在脚本里堆符号。下面是一份常用的符号映射表,命题变量用P、Q、R表示,这也是后面所有代码的共同输入格式。
| 自然语言 | 连接词 | 符号 | sympy 写法 |
|---|---|---|---|
| 并非 | 否定 | ¬ | ~P |
| 且 | 合取 | ∧ | P & Q |
| 或 | 析取 | ∨ | P | Q |
| 如果…那么 | 蕴含 | → | P >> Q |
| 当且仅当 | 等值 | ↔ | Equivalent(P, Q) |
映射表只解决符号问题,真正的坑在自然语言歧义上。“只有P才Q”要翻成Q → P,和“如果P则Q”方向相反;“除非P,否则Q”通常翻成¬P → Q。这些连词翻译错,后面真值表算得再对也没有意义。所以写完表达式后,先打印出来人工核对一遍结构,再进入校验环节。
from sympy import symbols P, Q = symbols('P Q') expr = (P >> Q) & (~P | Q) print(expr)代码说明:symbols创建命题变量;>>是蕴含,~是否定,&是合取,|是析取。sympy里逻辑运算符的优先级沿用了数学惯例,蕴含低于合取和析取,所以复杂表达式里加括号显式分组,能避免解析结果和预期不一致。上面这条expr对应“如果P则Q,且(非P或Q)”,打印输出后可以直接确认公式结构。
2.3 在线平台的判分视角与答案文档的对应关系
在线平台的判分和人改卷不同,它把提交内容和标准答案做字符串归一化后比对。这意味着答案文档里的符号体系必须和平台选项严格一致。判断题写“正确”还是“对”、选择题答案大小写、填空题里连接词用“∧”还是“and”,都会影响识别结果。我一般会在答案文档正式生成前,先从平台下载一次样例答卷,观察它接受哪种写法。
还有一点容易被忽略:平台判分通常按题号取答案,不关心文档里的排版逻辑。所以答案文档必须以题号为唯一索引,题号错了,后面所有答案都会串位。特别是平时作业3这种混合题型文档,选择题、判断题、填空题共用一套题号,提取时就要按题号正则而不是按段落顺序去对齐。这个问题在第四章处理docx时会再次遇到,先把索引意识立住,后面操作才不会乱。
3. 用 Python 把逻辑判断算清楚:真值表与推理校验的最小实现
3.1 最小依赖:sympy 一个包就能覆盖命题逻辑
sympy是符号计算库,但也内置了完整的命题逻辑工具集:真值表、逻辑等价判断、重言式检测、合取范式和析取范式转换。对在线作业这种规模的逻辑运算,没有必要引入z3求解器或者自己写SAT判定器,一个sympy就够用。先安装依赖,后面章节的脚本都基于它运行。
pip install sympy python-docx参数说明:sympy承担逻辑运算,python-docx处理答案文档的读取和生成。两个包都没有特殊版本要求,Python 3.10以上即可。如果在离线环境部署,可以先把whl文件下载好,用pip install --no-index --find-links=./packages sympy python-docx安装,避免在线安装被内网策略拦截。
3.2 真值表生成与重言式、矛盾式判定
把一道真值表题写成脚本只需要十几行。下面以“如果甲则乙,且(乙或甲)”为例,展示如何一次拿到全部赋值组合和最终结果。
from sympy import symbols from sympy.logic.boolalg import truth_table, is_tautology, satisfiable A, B = symbols('A B') expr = (A >> B) & (B | A) print("真值表:") for assignment, result in truth_table(expr, [A, B]): print(assignment, result) print("重言式?", is_tautology(expr)) print("可满足模型?", satisfiable(expr))代码说明:truth_table按变量列表[A, B]的顺序生成全部赋值组合,返回的每一项是(变量赋值,公式结果);is_tautology会对所有赋值做语义判定,返回布尔值;satisfiable返回第一个让公式结果为真的赋值字典,若公式不可满足则返回False。作业里“必然为真”的判断直接对应重言式,“恒为假”对应矛盾式,可以先用satisfiable看有没有可满足模型,再决定题目选“真”还是“假”。
这套逻辑还能反向用在多选题上。平台给出一组公式,问哪些是重言式时,就把每个公式依次丢进同一个循环里,收集is_tautology为True的项。这里变量名A、B只代表命题,换成题干里的“甲”“乙”“下雨”“迟到”都不影响计算,只要在本地维护一张变量名对照表即可。
3.3 等值演算与三段论校验:程序怎么区分等价与蕴含
等值演算题经常把“P → Q”和“¬Q → ¬P”混在一起考。程序判断两个公式是否逻辑等价,最稳的做法是看它们的异或结果是否恒为假。异或只有在两边真值不一致时才为真,遍历真值表后只要出现一个为真的行,就说明两式不等价。
from sympy import symbols from sympy.logic.boolalg import truth_table A, B = symbols('A B') e1 = A >> B e2 = ~B >> ~A diff = [r for _, r in truth_table(e1 ^ e2, [A, B]) if r] print("两式恒等?", len(diff) == 0)代码说明:e1 ^ e2构造的是异或表达式,truth_table遍历所有赋值后,diff里收集的是结果为True的行。diff为空意味着没有任何赋值能让两个公式产生差异,所以它们逻辑等价。这套判断比直接bool(Equivalent(e1, e2))更透明,因为后者在不同sympy版本里化简行为不一致,容易给出让人困惑的结果。
三段论有效性是另一类常见题。以经典AAA式为例:“所有M是P,所有S是M,所以所有S是P”。在有限个体域上,可以把每个谓词看成集合的子集关系,用枚举所有子集组合的方式验证是否存在反例。
from itertools import combinations U = [1, 2, 3] subs = [] for r in range(4): subs.extend(combinations(U, r)) counter = None for S in subs: for M in subs: for P in subs: premise1 = set(M).issubset(set(P)) premise2 = set(S).issubset(set(M)) concl = set(S).issubset(set(P)) if premise1 and premise2 and not concl: counter = (S, M, P) break print("AAA式反例?", counter)代码说明:subs枚举了3元素个体域的所有子集,包括空集;三层循环遍历S、M、P的全部组合关系。只要找到一组满足两个前提却让结论为假的S、M、P,就说明该推理形式无效。AAA式因为集合包含关系本身具有传递性,counter会保持None。对无效式,这个枚举法能很快给出具体反例,而反例正是在线填空题里要求填写的核心内容。
4. 答案文档批量化整理:python-docx 解析与核对表生成
4.1 从 docx 段落和表格中提取题目与答案块
拿到“20秋东北大学《逻辑学》在线平时作业3答案.docx”,不要上来就一段段复制。docx的结构里,正文段落和表格是两套独立对象,题目可能分布在任意一边。先探测文档结构,再决定解析策略。
from docx import Document doc = Document("20秋东北大学《逻辑学》在线平时作业3答案.docx") for para in doc.paragraphs: t = para.text.strip() if t: print(para.style.name, "|", t[:50]) for i, table in enumerate(doc.tables): print(f"表格{i}: {len(table.rows)}行 x {len(table.columns)}列") for row in table.rows[:3]: print([c.text.strip() for c in row.cells])代码说明:doc.paragraphs只遍历正文段落,doc.tables按文档顺序列出所有表格。第一段循环打印段落样式名,目的是区分题干用的是“List Paragraph”还是“Normal”,这会影响后续按样式提取的策略;第二段循环打印表格行列数和前三行内容,用来确认答案是否藏在单元格里。
这里有个常见情况:题干在正文段落,答案在表格,两处都有题号。提取时必须先建立题号到内容行的映射,再合并。不要用段落顺序假设题号连续,因为docx里经常混入批注、修订标记和空表格。
4.2 程序算出的答案与文档答案逐行比对
校验的核心不是读文档,而是把程序算出来的结果和文档答案摆在一起看。实际操作中,我会把作业题目整理成CSV,三列就够:题号、题型、逻辑式。然后让程序生成真值表结论,再和文档里的答案逐行对比。
import csv from docx import Document from sympy import symbols from sympy.logic.boolalg import truth_table from sympy.parsing.sympy_parser import parse_expr P, Q = symbols('P Q') def calc(expr_text): expr = parse_expr(expr_text, local_dict={'P': P, 'Q': Q}) rows = list(truth_table(expr, [P, Q])) return "真" if all(v for _, v in rows) else "假" out = Document() out.add_heading("平时作业3答案核对表", level=1) table = out.add_table(rows=1, cols=4) for i, name in enumerate(["题号", "题型", "文档答案", "程序结果"]): table.rows[0].cells[i].text = name with open("quiz3.csv", encoding="utf-8") as f: for row in csv.DictReader(f): result = calc(row["逻辑式"]) cells = table.add_row().cells cells[0].text = row["题号"] cells[1].text = row["题型"] cells[2].text = row["文档答案"] cells[3].text = result out.save("核对表_平时作业3.docx")代码说明:parse_expr比直接eval安全,local_dict把CSV字符串里的P、Q绑定到sympy符号对象上,避免表达式里出现未定义变量。calc函数内部把真值表全部结果取出来,all判断是否所有赋值为真,结果为真时输出“真”,否则输出“假”。文档答案列保留原始文本,方便和程序结果做人工目检。
CSV里的“逻辑式”列写法要和第二章的符号映射一致。比如(P >> Q) & (P | Q),用sympy的字符串解析完全没有问题。如果题目涉及三个变量,只需要把calc函数里的符号列表扩展成[P, Q, R],并在csv.DictReader的同一行多写一列表达式。
4.3 在线作业答案文档的三个格式坑
在线作业答案文档的格式问题,比逻辑错误更容易让人栽跟头。下面三个坑是我在整理这类文档时反复踩过的,列成表可以直接当检查清单用。
| 坑 | 现象 | 规避方式 |
|---|---|---|
| 特殊符号编码 | ¬、∧、⇒粘贴到平台后变问号或乱码 | 统一用平台指定的符号,生成前先做一次字符映射 |
| 题号错位 | 自动编号和手工编号混用,提取时漏题 | 用正则匹配题号模式,不以段落顺序为准 |
| 多选答案顺序 | 平台判分看重选项排列顺序 | 先下载平台样例答卷,确认是否需要按选项排序 |
符号编码问题最隐蔽。docx里看起来正常的“¬”,复制到网页表单后可能变成UTF-8的多个字节,平台端再按GBK解码就成乱码。我一般会在生成docx前定义一个替换字典,把全角符号、HTML实体和Unicode数学符号统一转成平台选项里使用的那套符号。这个替换字典也可以直接复用第二章的符号映射表。
提示:不要用eval解析CSV里的表达式,用sympy.parsing.sympy_parser.parse_expr配合local_dict,既能控制变量作用域,也能避免注入风险。在线作业数据处理脚本经常在班级群传阅,输入来源不可控,安全习惯要提前养成。
5. 固化成一条命令的答题自查工具:从 CSV 到核对 docx
前面的校验逻辑零散分布在各节里,真正用起来需要把它们收拢成一个命令行工具。下面这个脚本把CSV解析、真值表计算和docx生成整合到一起,以后每次作业只需要更新CSV,然后跑一条命令。
#!/usr/bin/env python3 import argparse, csv from docx import Document from sympy import symbols from sympy.logic.boolalg import truth_table, is_tautology from sympy.parsing.sympy_parser import parse_expr P, Q = symbols('P Q') def check(expr_text): expr = parse_expr(expr_text, local_dict={'P': P, 'Q': Q}) rows = list(truth_table(expr, [P, Q])) if is_tautology(expr): return "恒真" return f"{len(rows)}种赋值, 非恒真" def main(): ap = argparse.ArgumentParser(description="逻辑学平时作业答案核对") ap.add_argument("csv", help="题目CSV路径") ap.add_argument("-o", "--out", default="核对结果.docx", help="输出docx文件名") args = ap.parse_args() doc = Document() doc.add_heading("平时作业答案核对表", level=1) table = doc.add_table(rows=1, cols=4) for i, name in enumerate(["题号", "题干", "逻辑式", "程序结论"]): table.rows[0].cells[i].text = name with open(args.csv, encoding="utf-8") as f: for row in csv.DictReader(f): cells = table.add_row().cells cells[0].text = row["题号"] cells[1].text = row["题干"] cells[2].text = row["逻辑式"] cells[3].text = check(row["逻辑式"]) doc.save(args.out) print("已生成", args.out) if __name__ == "__main__": main()代码说明:argparse让脚本接受CSV路径和输出文件名两个参数,CSV是位置参数,-o是可选项,默认输出核对结果.docx。check函数先解析表达式,再用truth_table生成全部赋值组合,is_tautology判断是否恒真,返回的字符串直接写入docx表格,不需要额外排版。
用法很直接:
python quiz3_check.py quiz3.csv -o 核对_作业3.docxCSV第一行必须是表头,中文列名和英文列名都能识别,关键是csv.DictReader用第一行做键名,所以逻辑式那一列的列名必须和代码里row["逻辑式"]完全一致。换学期时只需要复制CSV模板,替换题号和逻辑式两列,输出文档的表格结构和命名规范保持不变。
一个更进阶的用法是把这个脚本挂到文件监控上。用watchdog监听指定文件夹,当新的CSV文件被放入时自动触发quiz3_check.py生成docx,适合助教在收作业高峰期批量处理多个班级的文件。这个技巧不用改脚本主体,只需要在外面包一个几行的事件处理函数即可。输出文件名里带上班级和批次,比如核对_软件2001_作业3.docx,后续归档时直接按文件名排序就能理清时间线。
本文还有配套的精品资源,点击获取