ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python与sympy自动化逻辑学作业答案整理与真值表校验

Python与sympy自动化逻辑学作业答案整理与真值表校验 简介这是一份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答案核对表, level1) table out.add_table(rows1, cols4) for i, name in enumerate([题号, 题型, 文档答案, 程序结果]): table.rows[0].cells[i].text name with open(quiz3.csv, encodingutf-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(平时作业答案核对表, level1) table doc.add_table(rows1, cols4) for i, name in enumerate([题号, 题干, 逻辑式, 程序结论]): table.rows[0].cells[i].text name with open(args.csv, encodingutf-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后续归档时直接按文件名排序就能理清时间线。本文还有配套的精品资源点击获取
返回列表