作者yauhh (哟)
看板logic
标题Re: [请益] 问题谁养鱼??
时间Thu Oct 29 01:54:52 2009
※ 引述《lljh90129 (海公公)》之铭言:
: 在一条街上有5栋房子喷了5种颜色(红黄绿蓝白)
: 各住着不同国籍的人
: 各喝不同饮料
: 抽不同品牌菸
: 养不同宠物
: 问题是: 谁养鱼?
: 提示:
: 1.英国人住红色的房子
这个问题我想了好几天,用逻辑学的处理方式想,终於稍微掌握了一些要领.
简单说是用逻辑演绎的方式把解题的结构建立出来.
以往大家所説的建表格方式,就是逻辑演译吧!
只是在小小的纸上也许一次只推出一,二种情况.
逻辑的处理方式是从一组命题与叙述,将各种情况一步一步推出.
首先根据提示,可以确定小世界比较确定的基本情况是:
B = { (Norwegian, Unknown, Unknown, Unknown, Unknown),
(Unknown, Blue, Unknown, Unknown, Unknown),
(Unknown, Unknown, Milk, Unknown, Unknown),
(Unknown, Unknown, Unknown, Unknown, Unknown),
(Unknown, Unknown, Unknown, Unknown, Unknown) }
然後是藉由一些推导规则,将提示未实现的情况加进去.
第一条说英国人住在红色房子,所以规则是:
B,
Rule = {(1,Brit),(2,Red)},
apply_rule(B, Rule, B')
--------------------------------------
B'
Rule {(1,Brit),(2,Red)} 必须一起套在 B 的其中一组tuple上,
把Brit摆在第一位置,把Red摆在第二位置.
所以这样会推出接下来的三种情况.
其他的情况,也写程规则,用同样的方式套上去.
例如,一条规则说抽Blend香烟的人家隔壁是养猫的,另一条规则说抽Blend香烟隔壁
的人家爱喝水,就把规则合并:
B'',
R1 = {(4,Blend),next,(5,cats),next,(3,water)},
R2 = {(3,water),next,(4,Blend),next,next,(5,cats)},
R3 = {(3,water),(5,cats),next,(4,Blend)},
R4 = {(4,Blend),next,(3,water),(5,cats)},
( apply_rule(B'', R1, B''') |
apply_rule(B'', R2, B''') |
apply_rule(B'', R3, B''') |
apply_rule(B'', R4, B''') )
------------------------------------------------------
B'''
这样可推出四种不同的情况,每一种情况必须让一组规则一起套上.
每一组规则,例如 R1,又会制造出好几种B''',总共产生的数量相当多.
但随着规则越套越多, B's的情况数量会渐渐减少.
从我自己的程式中查出,最後找到养鱼的人是German.
而我的程式,对左右边的定义,全部是直接邻接.
当然,在上述的规则推论之下,许多间接相邻的情况都跑出来了.
所以多加了一些检查条件,确定像绿色在白色左边,抽Blends香烟的人邻居有爱喝水的,
以及有猫. 最後只得到一种组合.
我参考的题目是英文题目,各种物件的编码有些不同.
http://www.coudal.com/thefish.php
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.160.110.5
※ 编辑: yauhh 来自: 218.160.110.5 (10/29 01:57)