编程实验:让计算机通过“模仿学习”学会解一类小学推理题
$ Y+ O& L3 V* U" x! `让我们来看一下这道推理题: 赵小亮、潘芸、叶昭君三人,一个是北京人,一个是上海人,一个是香港人。现在下面三句话中只有一句是真的: 1. 赵小亮是上海人 2. 潘芸不是上海人 3. 叶昭君不是香港人 求:赵小亮、潘芸、叶昭君分别是哪里人。 这道题目有两种解法: 1. 假设赵、潘、叶三人的籍贯分别为{上海、北京、香港}{上海、香港、北京}{北京、上海、香港}……穷举出所有的情况。每次都要检验三句话中有多少句是符合事实的,如果只有一句话是对的,则是正确答案。 2. 假设三句话中的某一句话是对的,然后检验另外两句话的正确性。如果另外两句话都是错误的,则这个假设是正确答案。 为了编程的方便,我采用第一种方法。 本程序的目的不是解决这一道“北上广”推理题,而是让程序能够通过学习解决这道“北上广”,从而能够解决所有同类的推理题目。 程序运行步骤及原理: 先输入题目中的所有对象名(即上题中的人名,句子中做主语),以空格分隔,如:黑 银 黄。 再输入所有的谓词(即待判定的事实),如:是中国人 是日本人 是北欧人。 接下来输入一个表示否定的词,如:不。 然后告诉程序总共有多少个命题,我输入:4。 最后按照以下格式输入所有的命题: 1 银 是北欧人 2 黄 是日本人 3 黑 不 是中国人 4 黑 是中国人 程序询问:以上命题中有多少个是真命题? 我输入:3 题设条件的输入过程到此为止,接下来的便是程序的“模仿学习”过程了。 我输入:枚举所有可能情况 这时候程序就会开始进行枚举。当然它不会把所有可能的假设情况一次性列举出来,而是每次显示一种情况,等待用户来确认(这个假设是否正确)。输出内容如下: 黑是中国人 银是日本人 黄是北欧人 这是正确结果吗?(Y/N) 我输入N 程序要求我输入一段推理过程,证明这个假设为什么是错误的(如果我前面输入的是“Y”,它就会要求我证明该假设为什么正确)。我输入:统计真命题数 程序显示: 黑是中国人 根据当前假设,以上1个命题为真命题。 我再输入:与题设条件相比较 程序输出如下4行文字: 按照你的设定条件,所有命题中,真命题数目为:3 按照当前的假设,真命题数目为1 当前假设不成立的原因是? 设定的真命题数_____按照当前假设推出的真命题数 请在划线处填上:大于、小于、等于、不等于。要强行退出训练,请输:结束训练 我输入:不等于 按下回车以后,我没有再输入任何内容,程序便开始自动执行我刚才输入的第一步命令——枚举所有可能情况。程序开始输出第二个假设: 黑是中国人 银是北欧人 黄是日本人 这是正确结果吗?(Y/N) 由此可以看出,程序已经记忆下了我刚才输入的三步命令:枚举所有可能情况、统计真命题数、与题设条件相比较。但是程序还没有完全学会判断一个假设是正确的还是错误的,于是我输入Y,告诉程序这个假设是正确的(题目是我出的,我当然知道答案)。 程序执行它保存的第二步、第三步指令:统计真命题数、与题设条件相比较。 程序输出如下: 银是北欧人 黄是日本人 黑是中国人 根据当前假设,以上3个命题为真命题。 按照你的设定条件,所有命题中,真命题数目为:3 按照当前的假设,真命题数目为3 当前假设成立的原因是? 设定的真命题数_____按照当前假设推出的真命题数 请在划线处填上:大于、小于、等于、不等于。要强行退出训练,请输:结束训练 我输入“等于”,告诉程序:按照假设,如果推出的真命题数与我题设条件中要求的真命题数是相等的,这个假设就是正确的。 到此处,学习过程就已经完成了。虽然程序接下来还会显示第三个假设,但是后面我只要输入N告诉它此假设错误,然后一步再打入“结束训练”,就可以了。
/ c+ z1 ~6 ` r5 y! Q6 ]! W- E. H4 L r, m; U) q" g# h q
|