
数学与逻辑
swy_swy_swy
这个作者很懒,什么都没留下…
展开
-
Karger 算法简析
Karger 算法简析概述Karger算法是解决最小割问题的随机算法。当然,它是一个近似算法。虽然是近似算法,但它速度快,实现简单。算法细节一个直观的想法是,对于一个无向图GGG,为找到它的最小割(S,T)(S, T)(S,T), 随机选择一条边,将这条边无限变短直到两关联结点重合,然后继承除被缩短的边以外其余所有边,删去自环。重复以上过程,直到图中只剩下两个结点。这两个结点代表的就是这样的一个最小割。注意只能删去自环边。举个例子,如下的无向图。 1 /原创 2021-12-26 06:45:01 · 1918 阅读 · 0 评论 -
人智导(二十二):规划(下)
人智导(二十二):规划(下)部分有序的规划:实例部分有序(Partial Order)的规划举例问题:购买milk, banana, drill, 然后回家SM: 超市(supermarket)HWS: 五金商店(Hardware shop)初始状态定义了start步骤Op(ACTION: Start, EFFECT: At(Home)∧\wedge∧ Sells(HWS, Drill)∧\wedge∧Sells(SM, Milk)∧\wedge∧ Sells(SM, Banana))目标原创 2020-12-16 19:10:05 · 11416 阅读 · 0 评论 -
人智导(二十一):规划(上)
人智导(二十一):规划(上)规划方法实现问题求解规划方法构建智能体问题求解:构建一个plan(动作序列),从初始状态达到目标状态规划(planning):推理方法实现问题求解过程知识表示方法:状态(state)动作(action)目标(goal)推理引擎自动发现达到目标的步骤(solution)问题求解(Problem Solving)方法程序框架Function SIMPLE-PROBLEM-SOLVING-AGENT(p) returns an action原创 2020-12-09 19:42:21 · 11168 阅读 · 0 评论 -
人智导(二十):知识表示与自动推理(Ⅲ)
人智导(二十):知识表示与自动推理(Ⅲ)前向链与后向链推理策略总述到目前为止我们已经有了知识表示的语言我们也已有了合适的推理规则(泛化的假言推理)使用知识现在考虑如何构建一个推理程序泛化的假言推理能通过两个方式得以实现前向链推理方式(forward chaining)后向链推理方式(backward chaining)前向链推理始于知识库(KB)中的句子,依次通过推理规则产生新的结论过程被触发通过不断地增加新观察到的事实p到知识库KB前向链推理可被设计在TELL这个部分原创 2020-11-25 19:18:17 · 1973 阅读 · 1 评论 -
人智导(十九):知识表示与自动推理(Ⅱ)
人智导(十九):知识表示与自动推理(Ⅱ)一阶谓词逻辑推理逻辑推理Δ\DeltaΔ:一系列句子的集合(知识库)ℜ\Reℜ:一系列的推理规则一个句子α\alphaα是句子集合Δ\DeltaΔ的一个演绎(验证),当且仅当α\alphaα能够通过ℜ\Reℜ从Δ\DeltaΔ推导出,即 Δ ⟹ ℜα\Delta\implies _{\Re}\alphaΔ⟹ℜα一个推理程序(推理引擎):发现一个合适的推理规则应用的步骤序列,视为构建一个证明的过程。FOL推理示例自然语言(英文)描述:The l原创 2020-11-02 15:25:34 · 1649 阅读 · 0 评论 -
卷积平移不变性证明
卷积平移不变性证明如题。证明:首先定义卷积操作Convi,j=∑p,qIi−p,j−1Kp,qConv_{i, j} = \sum_{p, q}I_{i-p, j-1}K_{p, q}Convi,j=p,q∑Ii−p,j−1Kp,q定义平移操作Tr(i,j)→(i+k,j+l)Tr(i, j)\to (i+k, j+l)Tr(i,j)→(i+k,j+l)综合以上两式ConvTr(i,j)=Convi+k,j+l=∑p,qIi+k−p,j+l−qKp,q=Tr(∑p,qIi−p,j−q原创 2020-10-28 19:27:03 · 7205 阅读 · 5 评论 -
卷积交换律
卷积交换律证明:(f∗h)[m,n]=∑i=−∞∞∑j=−∞∞f[i,j]⋅h[m−i,n−j]=−∑p=∞−∞∑q=∞−∞h[p,q]⋅f[m−p,n−q]=∑p=−∞∞∑q=−∞∞h[p,q]⋅f[m−p,n−q]=(h∗f)[m,n](f*h)[m, n] = \sum_{i=-\infty}^\infty\sum_{j = -\infty}^\infty f[i, j]\cdot h[m-i, n-j]\\ = -\sum_{p=\infty}^{-\infty}\sum_{q=\inf原创 2020-10-24 20:30:48 · 8128 阅读 · 2 评论 -
人智导(十八):知识表示与自动推理(Ⅰ)
人智导(十八):知识表示与自动推理(Ⅰ)基于一阶谓词逻辑的知识表示一阶谓词逻辑(FOL)亦称为一阶谓词演算 first-order predicate calculus更强的表达能力对象(object):不同的对象通过其特征属性的不同而区分关系(relation):对象与对象间的关联函数:一种特例类型关系一阶谓词逻辑的特点对于数学及人工智能学科极为重要的影响对于客观世界的概念化客观对象和对象之间关系表达的“随意性”例如,king:可表示为人物(object);也可原创 2020-09-22 21:44:20 · 805 阅读 · 0 评论 -
人智导(十七):基于知识的方法
人智导(十七):基于知识的方法基于知识的智能体智能体感知(perceiving)环境后决定在环境中如何行动决策(decision making):基于知识(knowledge)知识表示与自动推理:表示语言(inference-capable representation)智能体(知识系统):知识库(KB) + 推理引擎(IE)基于知识的智能体设计知识库:世界中的事实和规则的集合(集合中的每一个元素我们称之为句子)需要一种语言来构造句子(知识表示语言knowledge represent原创 2020-09-07 23:42:11 · 1585 阅读 · 0 评论 -
人智导(十六):聚类效果评价
人智导(十六):聚类效果评价总述聚类质量的评价是一个困难的问题没有正确结果的反馈(无监督过程)常用的方法:使用者的观察了解数据的分布对于文档的聚类,可以通过阅读同一簇中的文档内容判断分组是否正确分类的方法基于数据外在信息的评价方法使用已标记类的数据(如同分类问题)验证算法质量假设:每一个类是一个簇(cluster)算法得到聚类结果后,测算其质量,通过熵(entropy),纯度(purity),查准率(precision),查全率(recall),F值等等已知数据原创 2020-09-05 23:34:49 · 566 阅读 · 0 评论 -
人智导(十五):无指导学习
人智导(十五):无指导学习无指导学习与聚类分析有指导学习与无指导学习:有指导:通过示例→\to→分类无指导:没有示例,如何分类?聚类(clustering):无指导学习的典型应用场景没有学习的样例对事物根据其相似性进行分组或分类(“物以类聚”)聚类(clustering)分析聚类的基本原则:类内高相似,类间低相似无指导的聚类应用场景市场分析:用购买模式刻画不同的顾客群标识资源分布与使用城市规划地震规划搜索引擎数据表示数据矩阵:对象与变量(元组与属性)原创 2020-08-31 18:31:56 · 1553 阅读 · 0 评论 -
人智导(十四):学习模型的效果评价
人智导(十四):学习模型的效果评价准确度度量侧重在模型的预测能力方面,其次才是其它方面,如效率,可伸缩性等等a:TP(真正 true positive)b:FN(假负 false negative)c:FP (假正 false positive)d:TN(真负 true negative)准确度:Accuracy=a+da+b+c+dAccuracy=\frac{a+d}{a+b+c+d}Accuracy=a+b+c+da+d准确度度量的局限性:在一些应用情况中,准确度度量是不合适的原创 2020-08-23 17:06:42 · 338 阅读 · 0 评论 -
人智导(十三):有指导学习(Ⅲ)
人智导(十三):有指导学习(Ⅲ)支持向量机方法支持向量机方法(Support Vector Machine)寻找一个超平面(决策边界decision boundary)分离数据,以达到分类的目的和效果一种可能的结果另一种可能的结果其它可能的结果B1B_1B1和B2B_2B2,哪一个更好?如何判定哪个更好?寻找具有最大化的空间间隔的超平面(hyperplane)⇒\Rightarrow⇒B1B_1B1好于B2B_2B2最大边缘超平面(Maximum Marginal Hyperp原创 2020-08-15 09:27:52 · 504 阅读 · 0 评论 -
人智导(十二):有指导学习(Ⅱ)
人智导(十二):有指导学习(Ⅱ)贝叶斯方法贝叶斯方法(Bayesian Approach)概率学习方法:学习任务中的最实用方法之一贝叶斯分类器:分类精度较高、速度快、适于处理较大规模的数据概率方式预测:能够预测多重假设,通过概率给出不同预测结果的概率贝叶斯定理给定一组已有类标记的样例集合DDD(以水果为例)XXX:一个未标记数据unknown class(属性:红的并且是圆的)HHH:某一假设(如XXX属于“苹果”类)P(X∣H)P(X|H)P(X∣H):在HHH成立的条件下XXX原创 2020-08-02 22:49:27 · 401 阅读 · 1 评论 -
人智导(十一):有指导学习(Ⅰ)
人智导(十一):有指导学习(上)有指导学习AI本质上,如何发现算法:问题示例(作为输入)/目标示例(作为输出)⇒\Rightarrow⇒学习系统⇒\Rightarrow⇒(构建模型)自动生成算法或程序⇒\Rightarrow⇒(模型应用)实际问题还可以用于分类任务训练数据样本⇒\Rightarrow⇒训练器⇒\Rightarrow⇒分类模型学习算法的种类(根据学习模型的表示)树结构表示:决策树方法规则表示:基于规则的方法函数表示:线性非线性回归方法概率形式表示:贝叶斯方法网络结构表原创 2020-07-10 23:10:31 · 596 阅读 · 0 评论 -
人智导(十):回归方法的扩展
人智导(十):回归方法的扩展多项式回归回归方法的扩展:描述观测变量和响应变量间关联的标准线性模型扩展为非线性多项式回归 Y=β0+β1X+β2X2+β2X3+⋯+βnXnY = \beta_0+\beta_1X+\beta_2X^2 +\beta_2 X^3 +\dots +\beta_nX^nY=β0+β1X+β2X2+β2X3+⋯+βnXn示例:年龄与工资关系(n=4项) f^(x0)=β0^+β1^x0+β2^x02+β3^x03+β4^x04\hat{f}(x_0) = \hat原创 2020-07-07 23:00:27 · 249 阅读 · 0 评论 -
人智导(九):回归方法的精化
人智导(九):回归方法的精化标准回归的不足标准的回归公式:f(X)=β0+β1X1+β2X2+⋯+βpXpf(X) = \beta_0 +\beta_1X_1 +\beta_2X_2+\dots +\beta_pX_pf(X)=β0+β1X1+β2X2+⋯+βpXp观测变量(特征)越多,方差越大需要训练数据量n>>p才能获得较低方差回归模型的精度和解释性能改进:低方差(泛化)、低偏差(准确)不太相关的观测变量会导致模型的复杂性改进思路:选择关键的观测变量(特征)原创 2020-07-05 23:13:34 · 324 阅读 · 0 评论 -
人智导(八):模型的评价
人智导(八):模型的评价均方误差估计针对回归模型,最常用的为均方误差估计(Mean Squarred Error)MSE=1nΣi=1n(fβ′(xi)−yi)2MSE=\frac{1}{n}\Sigma^n_{i=1}(f'_{\beta}(x_i)-y_i)^2MSE=n1Σi=1n(fβ′(xi)−yi)2模型评价:expected lowest testing MSE注意学习模型的估算参数β\betaβ是lowest training MSE模型需要在方差(variance)原创 2020-07-03 23:31:41 · 10372 阅读 · 0 评论 -
人智导(七):回归分析
人智导(七):回归分析问题引入给出一组示例,估算/还原出函数f:基于示例的学习(归纳学习):未知fff,已知的是一个示例集合(训练集),求得一个或多个函数f′f'f′(模型、假设),使得f′f'f′近似于fff举例:30个无产者的数据:收入与受教育年限问题模型问题描述给出一组观测变量X=(x1,x2,…,xp)X=(x_1,x_2, \dots ,x_p)X=(x1,x2,…,xp)以及响应变量YYY(连续值)XXX与YYY之间存在关联,即Y=f(X)+ϵY=f(X)+\e原创 2020-07-03 10:35:49 · 1440 阅读 · 0 评论 -
人智导(六):“不可测”问题的求解
人智导(六):“不可测”问题的求解动作效果的不确定性如图所示:智能体不能确切地直到其动作的效果,可能有多个结果状态表示为:[s1,…,sn]=result(s0,a)[s_1,\dots ,s_n]=result(s_0,a)[s1,…,sn]=result(s0,a)动作效果不确定,需要与环境交互在执行动作之前,智能体需要计算所用结果状态的概率P(si∣a)P(s_i|a)P(si∣a)动作的期望效用(Expected Utility):EU(a)=ΣiP(si∣a)V(s原创 2020-06-30 08:33:44 · 10723 阅读 · 0 评论 -
人智导(五):对抗搜索与博弈
人智导(五):对抗搜索与博弈对抗搜索对抗搜索(adversarial search)源于博弈(game playing)在多agents环境下,其它agent行动的不可预测性把不确定因素引入问题求解过程中博弈:竞争环境下的零和(zero-sum)游戏,两个agents轮流行棋(博弈),动作(行棋)有限并确定,环境完全可观测博弈结果:输、赢、平局面对的挑战如国际象棋,搜索树平均分支35,每个agent平均下50步,搜索树大致包括3510035^{100}35100个节点限定时间内不可能计算出原创 2020-06-28 09:09:29 · 11316 阅读 · 0 评论 -
人智导(四):约束满足问题
人智导(四):约束满足问题约束满足问题(Constraint Satisfaction Problem)一种结构化的、简单而标准模式的问题表示状态被描述为一系列变量XiX_iXi(对应的值域为DiD_iDi)目标测试:一个约束集,描述这些变量或子集允许的取值CSP问题的定义约束满足问题的定义:变量集合:{X1,X2,…,Xn}\{X_1,X_2,\dots ,X_n\}{X1,X2,…,Xn};约束集合:{C1,C2,…,Cn}\{C_1,C_2,\dots ,C_n\}{C1原创 2020-06-25 17:00:02 · 12043 阅读 · 0 评论 -
人智导(三):局部搜索
人智导(三):局部搜索标准的搜索问题标准的搜索算法是基于模型的(model based)这个模型化的世界有以下假设:状态是可观察的(fully observable state)动作效果是确定的(deterministic action)状态空间是离散的(discrete state space)搜索的目的:系统地探查状态空间,去发现从初始状态到目标的途径放宽约束条件:一些现实问题的解决标准搜索的扩展现实应用中很多问题:发现目标,而非达到目标的路径如何描述目标状态?显式定原创 2020-06-23 22:33:37 · 10397 阅读 · 0 评论 -
人智导(二):启发式搜索
人智导(二):启发式搜索概述:Best-First搜索启发式搜索算法本质上都是Best-First搜索,当然,无信息搜索也是一种Best-First搜索,只不过衡量Best的标准不同。启发式搜索算法中,衡量Best的标准是基于评价函数(启发式函数)的。基本思路:后继状态中,具有"best"期望值的状态首先选择并继续扩展best这里指的是期望代价度量,而非实际代价度量。精确与否取决于启发函数的质量算法:Function Best-First-Search(problem, EVAL-FN)原创 2020-06-22 21:57:40 · 2527 阅读 · 0 评论 -
人智导(一):无信息搜索
人智导(一):无信息搜索搜索状态空间模型:定义两个基本元素(本体):动作(action)状态(state)用来描述及表示:问题(problem)目标(goal)解决问题的途径(solution)状态空间模型中的一些概念:环境(世界):一系列的状态集合、动作:导致状态转移s′=result(s,a)s' = result(s,a)s′=result(s,a)目标:世界中的某些状态,使目标得以满足智能体(agent)的任务:已知目前所处的状态,和动作的效果发现一个动作序列(so原创 2020-06-21 22:28:13 · 6892 阅读 · 3 评论 -
程序验证(十二):完全正确性
程序验证(十二):完全正确性完全正确性完全正确性(total correctness),写作:[P]c[Q][P]c[Q][P]c[Q],意思是:如果我们从一个满足PPP的环境开始执行ccc那么ccc一定终止且它的最终的环境满足QQQ良基关系(Well-Founded Relations)集合SSS上的一个二元关系≺\prec≺是一个良基关系,当且仅当:SSS中不存在无限序列s1,s2,s2,…s_1,s_2,s_2,\dotss1,s2,s2,…,使得对于所有i>0i&g原创 2020-06-18 23:00:05 · 1078 阅读 · 0 评论 -
程序验证(十一):演绎验证(下)
程序验证(十一):演绎验证(下)新特征引入向Imp语言引入新的特征:断言注释(assertion annotation)过程(procedure)断言断言注释具有以下形式:{P}\{P\}{P}从语义上说,它们与运行时断言(runtime assertion)一样(比如c里面的assert)如果当前环境使得断言表达式为假,程序停止执行程序举个例子:proc LinearSearch(a: array,l: int,u: int,e:&nbs原创 2020-06-16 23:23:30 · 10504 阅读 · 0 评论 -
程序验证(十):演绎验证(上)
程序验证(十):演绎验证(上)基础路径(Basic Approach)给定一个程序ccc,由以下specification注解:{P}c{Q}\{P\}c\{Q\}{P}c{Q}为了证明这个三元组,我们构造一个验证条件(verification condition, VC)的集合每个VC都是某个理论的一阶公式如果所有的VC都是永真的,那么{P}c{Q}\{P\}c\{Q\}{P}c{Q}就是永真的谓词转换器给定一个断言QQQ和一个程序ccc,一个谓词转换器(predicate trans原创 2020-06-14 23:28:12 · 10982 阅读 · 0 评论 -
程序验证(九):程序正确性规范
程序验证(九):程序正确性规范什么是程序的正确性?应当在指定的前提下,进行预定的行为,达到指定的结果。部分正确性(Partial Correctness)部分正确性指的是一个程序的停止行为我们将部分正确性用霍尔三元组(Hoare triples)表达:{P}c{Q}\{P\}c\{Q\}{P}c{Q}这里:ccc是一个程序PPP和QQQ是一阶逻辑的断言(assertion)PPP, QQQ的自由变量可以在程序的变量中随意选择PPP是先验条件(precondition),QQQ是后验条件原创 2020-06-12 23:21:14 · 13217 阅读 · 4 评论 -
程序验证(八):形式语义
程序验证(八):形式语义语义描述方法如下:操作语义:用抽象机描述程序执行引起的状态改变,关心状态改变是怎样产生的,与语言的实现关系紧密。指称语义:使程序执行的效果对应数学对象,只关心程序执行的效果,不关心其是怎样产生的。公理语义:将程序的语义性质表示为命题,采用数理逻辑的方法研究。引入玩具语言Imp语法范畴如下:数字集NumNumNum,用nnn表示数字变元集VarVarVar,用xxx表示变元算术表达式集AexpAexpAexp,用aaa表示算术表达式布尔表达式集BexpBe原创 2020-06-11 23:19:30 · 11511 阅读 · 0 评论 -
程序验证(七):可满足性模理论(Satisfiability Modulo Theories)
可满足性模理论(Satisfiability Modulo Theories)SMTSatisfiability Modulo Theories(SMT)是以下情况的公式的判定问题:一些一阶理论的复合具有任意的布尔结构DPLL(TTT): DPLL Modulo Theories这是现代SMT求解器的基础技术将SMT问题分解为我呢吧可以高效求解的子问题:使用SAT求解技术来处理布尔结构(宏观)使用专门的理论求解器(theory solver)来判定背景理论的可满足性(微观)布尔结原创 2020-06-10 23:26:32 · 15492 阅读 · 0 评论 -
程序验证(六):纳尔逊-欧朋算法(Nelson-Oppen Procedure)
程序验证(六):纳尔逊-欧朋算法(Nelson-Oppen Procedure)动机截至目前,我们学习了一些一阶理论,每一个都是关于某一种数据类型然而,现实中的公式并不是由单一的理论组成,如:∀i.0≤i≤n→a[i]≤a[i+1]\forall i.0\le i\le n\to a[i]\le a[i+1]∀i.0≤i≤n→a[i]≤a[i+1]这个公式实际上包含了两个理论:等价与数组我们需要找到一个方法,将复杂的一阶逻辑公式转化为简单的一阶逻辑公式一些概念复合理论给定T1,T2T_1,原创 2020-06-09 23:32:53 · 1286 阅读 · 1 评论 -
程序验证(五):一阶理论的过程
程序验证(五):一阶理论的过程主要讨论TET_ETE的量词自由片段以及TAT_ATA等价理论的判定等价及未解释函数理论(Theory of Equality and Uninterpreted Functions)除=外的谓词实际上使我们的讨论不必要地复杂化,去除这些累赘谓词的方法如下:对每个谓词ppp,引入一个新的(fresh)函数符号fpf_pfp引入一个新的常量∙\bullet∙将每个谓词实例p(t1,...,tn)p(t_1 ,..., t_n)p(t1,...,tn)替换原创 2020-06-08 23:51:48 · 9277 阅读 · 0 评论 -
程序验证(四):一阶理论
程序验证(四):一阶理论定义一个一阶理论(theory)TTT被以下两点定义:它的符号集Σ\SigmaΣ, 一个非逻辑符号的集合它的公理A\mathcal{A}A, 一个在Σ\SigmaΣ上的闭公式(closed formula)一阶逻辑理论定义了一个有限的词汇表以讨论所关注的主题,而理论中的公理定义了所意指的涵义(intended meaning)Σ\SigmaΣ-formula: 一个Σ\SigmaΣ-formula 只包含Σ\SigmaΣ中的非逻辑符号,以及逻辑变元,逻辑连接词和量词。原创 2020-06-06 23:34:47 · 11005 阅读 · 2 评论 -
程序验证(三):一阶逻辑
程序验证(三):一阶逻辑语法逻辑符号包括:命题连接符:∧,∨,¬,→,↔\wedge , \vee , \neg , \to , \leftrightarrow∧,∨,¬,→,↔变元:v,y,z,x1,x2,...v,y,z,x_1,x_2, ...v,y,z,x1,x2,...量词:∃\exists∃, ∀\forall∀非逻辑符号(参数)包括:常量:c1,c2,...c_1, c_2, ...c1,c2,...函数符号:g,h,f,f1,f2,...g,h,f,f_1,原创 2020-06-05 21:16:04 · 11352 阅读 · 0 评论 -
程序验证(二):SAT问题
程序验证(二):SAT问题概念:Satisfiability ProblemSAT问题:给定一个命题公式FFF,决定是否存在一个解释III使得I⊨FI\models FI⊨F.3SAT问题是首个被确定的NP完全问题。大多数重要逻辑问题可以归约为SAT:永真性蕴含等价性SAT求解能力的发展:关键:将搜索与推理结合以提高效率CNF详解SAT求解器的输入一般是CNF,这里为便于讨论,引入关于CNF的集合表示。集合表示一个公式(formula)可以视为子句(clause)的集合:C1原创 2020-06-02 22:47:17 · 11962 阅读 · 2 评论 -
程序验证(一):命题逻辑
程序验证(一):命题逻辑概念命题逻辑例如P∨¬Q→RP\vee \neg Q \to RP∨¬Q→R一个原子(atom)是一个或为真或为假的判断。一个文字(literal)是一个原子或它的非。命题公式(propositional formulas)由文字和逻辑连接符组成。合式公式合式公式(well-formed formulas) 由以下语法得到:⟨atom⟩\langle atom\rangle⟨atom⟩ ::= ⊤(true)∣⊥(false)∣P,Q,...(命题变量)\to原创 2020-05-29 15:51:52 · 12341 阅读 · 0 评论 -
从零开始编写SAT求解器(三)
从零开始编写SAT求解器(三)从零开始编写SAT求解器(三)上一篇核心算法:DPLL其他文件测试效果从零开始编写SAT求解器(三)上一篇核心算法:DPLL//DPLL.cpp#include "DPLL.h"bool DPLL::check_sat() { // TODO: your code here, or in the header file std::unor...原创 2020-03-21 23:26:47 · 12516 阅读 · 2 评论 -
从零开始编写SAT求解器(二)
文件解析器实现,assert语句使用原创 2020-03-19 23:27:12 · 12902 阅读 · 0 评论 -
从零开始编写SAT求解器(一)
从零开始编写SAT求解器(一)从零开始编写SAT求解器(一)源起背景知识SAT问题DIMACS文件DPLL算法项目架构从零开始编写SAT求解器(一)源起最近在github上看到了非常有名的cryptominisat开源项目。目前的SAT问题自动求解器有在线版的MiniSAT,但是这个需要科学上网。正好最近一直在写Java和python,C++有点生疏,而网上有大神用Haskell实现了简易的...原创 2020-03-18 21:41:27 · 22032 阅读 · 9 评论