勇闖新世界︰ 《 pyDatalog 》 導引《十》豆鵝狐人之表達篇

從『了解』

問題
有一個農民到集市買了一隻狐狸、一隻鵝和一袋豆子,回家時要渡過一條河。河中有一條船,但是只能裝一樣東西。而且,如果沒有人看管,狐狸會吃掉鵝,而鵝又很喜歡吃豆子。問:怎樣才能讓這些東西都安全過河?

到用別的語言作『改寫重述』,意味著『概念』體系對應『轉譯』 。就『邏輯問題』來講︰『事實』的『轉譯』 後依然是『事實』;由『事實』可推導的『結論』,『轉譯』 後依然是『結論』。這個『邏輯網』

豆鵝胡人

的『轉譯』就是用『狀態』表達『事實』,以『狀態變遷』 State_i  \ \frac{action} {\longrightarrow}}  \ State_j 詮釋『人的行動推理』。由於熟悉的河多半是東西向,我們就說那農夫將由『南岸』到達『北岸』的吧!如此一個有四個物象的系統,最多能有 2^4 = 16 個狀態。【※注意,以南為觀點,『‧』表達在北。

可能狀態

ˇ豆鵝狐人
╳豆鵝狐‧
ˇ豆鵝‧人
╳豆鵝‧‧
ˇ‧鵝狐人
╳‧鵝狐‧
ˇ‧鵝‧人
ˇ‧鵝‧‧
ˇ豆‧狐人
ˇ豆‧狐‧
╳豆‧‧人
ˇ豆‧‧‧
╳‧‧狐人
ˇ‧‧狐‧
╳‧‧‧人
ˇ‧‧‧‧

在此打『ˇ』的狀態代表『安全』,不會發生

狐狸吃掉鵝,或鵝吃豆子。

的事情。打『╳』的狀態說明『不安全』,終究歸於『渡河失敗』這一事態。為了彰顯『題意』,特將『‧‧‧‧』目標態命名為『到達彼岸』。再將農夫的『行動』與『狀態變遷』連繫起來︰

狀態變遷】※狀態(始態, 行動, 終態)

狀態(‘豆鵝狐人’,‘鵝人去北’,‘豆‧狐‧’)
狀態(‘豆‧狐‧’,‘鵝人回南’,‘豆鵝狐人’)
狀態(‘豆‧狐‧’,‘獨人回南’,‘豆‧狐人’)
狀態(‘豆‧狐人’,‘獨人去北’,‘豆‧狐‧’)
狀態(‘豆‧狐人’,‘豆人去北’,‘‧‧狐‧’)
狀態(‘‧‧狐‧’,‘豆人回南’,‘豆‧狐人’)
狀態(‘‧‧狐‧’,‘獨人回南’,‘渡河失敗’)
狀態(‘‧‧狐‧’,‘鵝人回南’,‘‧鵝狐人’)
狀態(‘‧鵝狐人’,‘鵝人去北’,‘‧‧狐‧’)
狀態(‘‧鵝狐人’,‘狐人去北’,‘‧鵝‧‧’)
狀態(‘‧鵝狐人’,‘獨人去北’,‘渡河失敗’)
狀態(‘‧鵝‧‧’,‘狐人回南’,‘‧鵝狐人’)
狀態(‘‧鵝‧‧’,‘豆人回南’,‘豆鵝‧人’)
狀態(‘豆鵝‧人’,‘豆人去北’,‘‧鵝‧‧’)
狀態(‘‧鵝‧‧’,‘獨人回南’,‘‧鵝‧人’)
狀態(‘‧鵝‧人’,‘獨人去北’,‘‧鵝‧‧’)
狀態(‘‧鵝‧人’,‘鵝人去北’,‘到達彼岸’)
狀態(‘豆‧狐人’,‘狐人去北’,‘豆‧‧‧’)
狀態(‘豆‧‧‧’,‘狐人回南’,‘豆‧狐人’)
狀態(‘豆‧‧‧’,‘鵝人回南’,‘豆鵝‧人’)
狀態(‘豆鵝‧人’,‘鵝人去北’,‘豆‧‧‧’)
狀態(‘豆‧‧‧’,‘獨人回南’,‘渡河失敗’)
狀態(‘豆鵝狐人’,‘獨人去北’,‘渡河失敗’)
狀態(‘豆鵝狐人’,‘狐人去北’,‘渡河失敗’)
狀態(‘豆鵝狐人’,‘豆人去北’,‘渡河失敗’)

 

這就構成了該『邏輯網』的圖說。所謂的『答案』求解推理,也就『轉譯』為『尋找』從『豆鵝狐人』狀態通往『到達彼岸』狀態之『路徑』的哩!或許此時突然開朗,果真『網網相通』井井往來的呦!!那個 pyDatalog 的程式立馬寫成︰

 

pi@raspberrypi ~ $ python3
Python 3.2.3 (default, Mar  1 2013, 11:53:50) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pyDatalog import pyDatalog
>>> pyDatalog.create_terms('狀態, 可達狀態')
>>> pyDatalog.create_terms('X狀態, Y狀態, Z狀態, P經由, P經由一, P借著')
>>> +狀態('豆鵝狐人', '鵝人去北', '豆‧狐‧')
>>> +狀態('豆‧狐‧', '鵝人回南', '豆鵝狐人')
>>> +狀態('豆‧狐‧', '獨人回南', '豆‧狐人')
>>> +狀態('豆‧狐人', '獨人去北', '豆‧狐‧')
>>> +狀態('豆‧狐人', '豆人去北', '‧‧狐‧')
>>> +狀態('‧‧狐‧', '豆人回南', '豆‧狐人')
>>> +狀態('‧‧狐‧', '獨人回南', '渡河失敗')
>>> +狀態('‧‧狐‧', '鵝人回南', '‧鵝狐人')
>>> +狀態('‧鵝狐人', '鵝人去北', '‧‧狐‧')
>>> +狀態('‧鵝狐人', '狐人去北', '‧鵝‧‧')
>>> +狀態('‧鵝狐人', '獨人去北', '渡河失敗')
>>> +狀態('‧鵝‧‧', '狐人回南', '‧鵝狐人')
>>> +狀態('‧鵝‧‧', '豆人回南', '豆鵝‧人')
>>> +狀態('豆鵝‧人', '豆人去北', '‧鵝‧‧')
>>> +狀態('‧鵝‧‧', '獨人回南', '‧鵝‧人')
>>> +狀態('‧鵝‧人', '獨人去北', '‧鵝‧‧')
>>> +狀態('‧鵝‧人', '鵝人去北', '到達彼岸')
>>> +狀態('豆‧狐人', '狐人去北', '豆‧‧‧')
>>> +狀態('豆‧‧‧', '狐人回南', '豆‧狐人')
>>> +狀態('豆‧‧‧', '鵝人回南', '豆鵝‧人')
>>> +狀態('豆鵝‧人', '鵝人去北', '豆‧‧‧')
>>> +狀態('豆‧‧‧', '獨人回南', '渡河失敗')
>>> +狀態('豆鵝狐人', '獨人去北', '渡河失敗')
>>> +狀態('豆鵝狐人', '狐人去北', '渡河失敗')
>>> +狀態('豆鵝狐人', '豆人去北', '渡河失敗')
>>> 
>>> (可達狀態[X狀態, Y狀態] == P經由) <= ((可達狀態[X狀態, Z狀態] == P經由一)) & 狀態(Z狀態, P借著, Y狀態) & (X狀態 != Y狀態) & (P經由 == P經由一 + [P借著])
可達狀態[2]==(*,X狀態,Y狀態,P經由) <= 可達狀態[2]==(*,X狀態,Z狀態,P經
>>> (可達狀態[X狀態,Y狀態] == P經由) <= 狀態(X狀態, P借著, Y狀態) & (P經由 == [P借著])
可達狀態[2]==(*,X狀態,Y狀態,P經由) <= 狀態(X狀態,P借著,Y狀態)&==(P經由
>>> print((可達狀態['豆鵝狐人', '到達彼岸'] == P經由) >= P經由)
('鵝人去北', '獨人回南', '狐人去北', '鵝人回南', '豆人去北', '獨人回南', '鵝人去北')
>>> 

現在『問題』來了,我們能用

《勇闖新世界︰ 《 pyDatalog 》 導引《七》

系列文章所探討『台北捷運網』之『所有路徑』辦法︰

可達狀態(X狀態, P經由, Y狀態) <=
狀態(X狀態, P借著, Y狀態) & (P經由 == [P借著])

可達狀態(X狀態, P經由, Y狀態) <=
可達狀態(X狀態, P經由一, Z狀態) &
狀態(Z狀態, P借著, Y狀態) &
(X狀態 != Y狀態) & (P經由 == P經由一 + [P借著])

得到所有『可能路徑』的嗎??