※ 引述《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)