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

就讓我們試著構造一組有先後次序的子句,看看 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('N, S, P, print, 次序, 移動') >>> +次序('一') >>> 移動(N) <= (次序('一')) & (N == N - 1) &  (P == print('次序一', N)) & (S == +次序('二')) 移動(N) <= 次序('一')&==(N,(N-'1'))&==(P,('<built-in fu >>> 移動(N) <= (次序('二')) & (N == N - 1) &  (P == print('次序二', N)) & (S == +次序('三')) 移動(N) <= 次序('二')&==(N,(N-'1'))&==(P,('<built-in fu >>> 移動(N) <= (次序('止')) & (N == N - 1) &  (P == print('次序止', N)) 移動(N) <= 次序('止')&==(N,(N-'1'))&==(P,('<built-in fu >>> 移動(N) <= (次序('三')) & (N == N - 1) &  (P == print('次序三', N)) & (S == +次序('止')) 移動(N) <= 次序('三')&==(N,(N-'1'))&==(P,('<built-in fu  # 定義時,就已推演最佳化? >>> pyDatalog.ask("次序('一')") == set([()]) True >>> pyDatalog.ask("次序('二')") == set([()]) True >>> pyDatalog.ask("次序('三')") == set([()]) True >>> pyDatalog.ask("次序('止')") == set([()]) True  # 陳述次序性有關? >>> 移動(3) 次序一 3 次序二 3 次序止 3 次序三 3 []  # 記憶?效應! >>> - 次序('二') >>> - 次序('三') >>> - 次序('止') >>> pyDatalog.ask("次序('一')") == set([()]) True >>> pyDatalog.ask("次序('二')") == set([()]) False >>> pyDatalog.ask("次序('三')") == set([()]) False >>> pyDatalog.ask("次序('止')") == set([()]) False  # 真的重新推導過嘛! >>> 移動(3) 次序一 3 次序二 3 次序止 3 次序三 3 []  # >>> pyDatalog.ask("次序('一')") == set([()]) True >>> pyDatalog.ask("次序('二')") == set([()]) False >>> pyDatalog.ask("次序('三')") == set([()]) False >>> pyDatalog.ask("次序('止')") == set([()]) False >>>  </pre> 那麼我們將如何『解釋』的呢?顯然的當我們依序建構子句時, pyDatalog 就做了安排,以至於苦心想建立的『次序』根本無用武之地!然而執行時,卻似乎沿用『陳述次序』?即使我們重申最初的事實是什麼,它一點不與理會,儼然對自己推論過的事很有把握 ??所以當用這個語言時,必須了解它的『純陳述』主張以及建構『最佳化』方式,否則發生了『程式錯誤』,這是『邏輯』的錯誤 ,還是『語用』的誤解,就很難說的清的了!!  如是我們可以了解《圖的範例》  <a href="https://bitbucket.org/pcarbonn/pydatalog/src/280de5f8ef28dca2a584523080d427ddc597f712/pyDatalog/examples/graph.py?at=default">graph.py</a> 談的寫法之『安全』 safe 與『不安全』 unsafe 意指,明白  <span style="color: #808080;">【所有路徑述詞定義】</span>  <span style="color: #666699;">‧ 所有路徑(X站名, Y站名, P路徑甲) <=</span>  <span style="color: #666699;">所有路徑(X站名, Z站名, P路徑乙) & 【※前段】</span>  <span style="color: #666699;">連接(Z站名, Y站名) & 【※後段】</span>  <span style="color: #666699;">(X站名 != Y站名) & 【※避免迴路】</span>  <span style="color: #666699;">(X站名._not_in(P路徑乙)) & 【※避免迴路】</span>  <span style="color: #666699;">(Y站名._not_in(P路徑乙)) & 【※避免迴路】</span>  <span style="color: #666699;">(P路徑甲 == P路徑乙 + [Z站名]) 【※ 經過路徑累計】</span>  <span style="color: #666699;"> </span>  <span style="color: #666699;">‧ 所有路徑(X站名, Y站名, P路徑甲) <=</span>  <span style="color: #666699;">連接(X站名, Y站名) & 【※基本連接事實】</span>  <span style="color: #666699;">(P路徑甲 == []) 【※基本直通,無經由路徑。】</span>  為何如此定義的吧。因此對  <span style="color: #808000;">【<span style="color: #808080;">計費所有路徑述詞定義</span>】</span>  <span style="color: #808000;">‧ 計費所有路徑(X站名, Y站名, P路徑甲, F費用小計) <= </span>  <span style="color: #808000;">計費所有路徑(X站名, Z站名, P路徑乙, F費用) & </span>  <span style="color: #808000;">連接(Z站名, Y站名) & (X站名 != Y站名) &</span>  <span style="color: #808000;"> (X站名._not_in(P路徑 乙)) & (Y站名._not_in(P路徑乙)) &</span>  <span style="color: #808000;"> (P路徑甲 == P路徑乙 + [Z站名]) & (F費用小計 == F費用 + 1) </span>     <span style="color: #808000;">‧ 計費所有路徑(X站名, Y站名, P路徑甲, F費用小計) <= </span>  <span style="color: #808000;">連接(X站名, Y站名) & (P路 徑甲 == []) & (F費用小計 == 0)</span>  自然就能掌握的了。  [<span style="color: #808080;">參考程式</span>】 <pre class="lang:sh decode:true ">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('連接, 鄰近, 能達, 所有路徑')
>>> +連接('台北車站', '中山')
>>> +連接('台北車站', '善導寺')
>>> +連接('台北車站', '西門')
>>> +連接('台北車站', '台大醫院')
>>> +連接('西門', '龍山寺')
>>> +連接('西門', '小南門')
>>> +連接('西門', '北門')
>>> +連接('中山', '北門')
>>> +連接('中山', '雙連')
>>> +連接('中山', '松江南京')
>>> +連接('中正紀念堂', '小南門')
>>> +連接('中正紀念堂', '台大醫院')
>>> +連接('中正紀念堂', '東門')
>>> +連接('中正紀念堂', '古亭')
>>> +連接('東門', '古亭')
>>> +連接('東門', '忠孝新生')
>>> +連接('東門', '大安森林公園')
>>> +連接('善導寺', '忠孝新生')
>>> +連接('松江南京', '忠孝新生')
>>> +連接('忠孝復興', '忠孝新生')
>>> +連接('松江南京', '行天宮')
>>> +連接('松江南京', '南京復興')
>>> +連接('中山國中', '南京復興')
>>> +連接('台北小巨蛋', '南京復興')
>>> +連接('忠孝復興', '南京復興')
>>> +連接('忠孝復興', '忠孝敦化')
>>> +連接('忠孝復興', '大安')
>>> +連接('大安森林公園', '大安')
>>> +連接('科技大樓', '大安')
>>> +連接('信義安和', '大安')
>>> +連接('信義安和', '世貿台北101')

#
>>> pyDatalog.create_terms('X站名, Y站名, Z站名, P路徑甲, P路徑乙')
>>> 連接(X站名, Y站名) <= 連接(Y站名, X站名)
連接(X站名,Y站名) <= 連接(Y站名,X站名)

#
>>> 能達(X站名, Y站名) <= 能達(X站名, Z站名) & 連接(Z站名, Y站名) & (X站名 != Y 站名) 
能達(X站名,Y站名) <= 能達(X站名,Z站名)&連接(Z站名,Y站名)&!=(X站名,Y站名)
>>> 能達(X站名,Y站名) <= 連接(X站名,Y站名)
能達(X站名,Y站名) <= 連接(X站名,Y站名)

#
>>> 鄰近(X站名, Y站名) <= 連接(X站名, Z站名) & 連接(Z站名, Y站名) & (X站名 != Y 站名)
鄰近(X站名,Y站名) <= 連接(X站名,Z站名)&連接(Z站名,Y站名)&!=(X站名,Y站名)
>>> 鄰近(X站名,Y站名) <= 連接(X站名,Y站名)
鄰近(X站名,Y站名) <= 連接(X站名,Y站名)

#
>>> 所有路徑(X站名, Y站名, P路徑甲) <= 所有路徑(X站名, Z站名, P路徑乙) & 連接(Z 站名, Y站名) & (X站名 != Y站名) & (X站名._not_in(P路徑乙)) & (Y站名._not_in(P路 徑乙)) & (P路徑甲 == P路徑乙 + [Z站名])
所有路徑(X站名,Y站名,P路徑甲) <= 所有路徑(X站名,Z站名,P路徑乙)&連接(Z站名,Y站
>>> 所有路徑(X站名, Y站名, P路徑甲) <= 連接(X站名, Y站名) & (P路徑甲 == []) 
所有路徑(X站名,Y站名,P路徑甲) <= 連接(X站名,Y站名)&==(P路徑甲,'[]')

#
>>> pyDatalog.create_terms('F費用, F費用小計, 計費所有路徑')
>>> 計費所有路徑(X站名, Y站名, P路徑甲, F費用小計) <= 計費所有路徑(X站名, Z站名, P路徑乙, F費用) & 連接(Z站名, Y站名) & (X站名 != Y站名) & (X站名._not_in(P路徑 乙)) & (Y站名._not_in(P路徑乙)) & (P路徑甲 == P路徑乙 + [Z站名]) & (F費用小計 == F費用 + 1)
計費所有路徑(X站名,Y站名,P路徑甲,F費用小計) <= 計費所有路徑(X站名,Z站名,P路徑乙,
>>> 計費所有路徑(X站名, Y站名, P路徑甲, F費用小計) <= 連接(X站名, Y站名) & (P路 徑甲 == []) & (F費用小計 == 0)
計費所有路徑(X站名,Y站名,P路徑甲,F費用小計) <= 連接(X站名,Y站名)&==(P路徑甲,

#
>>> print(計費所有路徑('台北車站', '世貿台北101', P路徑甲, F費用小計))
P路徑甲                                                                                                          | F費用小計
--------------------------------------------------------------------------------------------------------------|------
('中山', '北門', '西門', '小南門', '中正紀念堂', '古亭', '東門', '忠孝新生', '忠孝復興', '大安', '信義安和')                                  | 11   
('西門', '小南門', '中正紀念堂', '古亭', '東門', '大安森林公園', '大安', '信義安和')                                                    | 8    
('西門', '北門', '中山', '松江南京', '忠孝新生', '忠孝復興', '大安', '信義安和')                                                      | 8    
('善導寺', '忠孝新生', '東門', '中正紀念堂', '小南門', '西門', '北門', '中山', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                 | 13   
('台大醫院', '中正紀念堂', '小南門', '西門', '北門', '中山', '松江南京', '忠孝新生', '東門', '大安森林公園', '大安', '信義安和')                      | 12   
('西門', '北門', '中山', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                                                      | 8    
('台大醫院', '中正紀念堂', '古亭', '東門', '忠孝新生', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                                   | 10   
('善導寺', '忠孝新生', '忠孝復興', '大安', '信義安和')                                                                         | 5    
('善導寺', '忠孝新生', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                                                         | 7    
('台大醫院', '中正紀念堂', '古亭', '東門', '忠孝新生', '忠孝復興', '大安', '信義安和')                                                   | 8    
('台大醫院', '中正紀念堂', '小南門', '西門', '北門', '中山', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                              | 11   
('台大醫院', '中正紀念堂', '小南門', '西門', '北門', '中山', '松江南京', '南京復興', '忠孝復興', '忠孝新生', '東門', '大安森林公園', '大安', '信義安和')      | 14   
('台大醫院', '中正紀念堂', '東門', '大安森林公園', '大安', '信義安和')                                                               | 6    
('台大醫院', '中正紀念堂', '東門', '忠孝新生', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                                         | 9    
('善導寺', '忠孝新生', '松江南京', '中山', '北門', '西門', '小南門', '中正紀念堂', '東門', '大安森林公園', '大安', '信義安和')                       | 12   
('善導寺', '忠孝新生', '東門', '大安森林公園', '大安', '信義安和')                                                                 | 6    
('西門', '小南門', '中正紀念堂', '古亭', '東門', '忠孝新生', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                              | 11   
('台大醫院', '中正紀念堂', '小南門', '西門', '北門', '中山', '松江南京', '忠孝新生', '忠孝復興', '大安', '信義安和')                              | 11   
('西門', '北門', '中山', '松江南京', '忠孝新生', '東門', '大安森林公園', '大安', '信義安和')                                              | 9    
('中山', '松江南京', '南京復興', '忠孝復興', '忠孝新生', '東門', '大安森林公園', '大安', '信義安和')                                          | 9    
('中山', '北門', '西門', '小南門', '中正紀念堂', '古亭', '東門', '忠孝新生', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                  | 13   
('西門', '小南門', '中正紀念堂', '東門', '忠孝新生', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                                    | 10   
('中山', '松江南京', '忠孝新生', '忠孝復興', '大安', '信義安和')                                                                  | 6    
('中山', '北門', '西門', '小南門', '中正紀念堂', '東門', '大安森林公園', '大安', '信義安和')                                              | 9    
('善導寺', '忠孝新生', '東門', '古亭', '中正紀念堂', '小南門', '西門', '北門', '中山', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')           | 14   
('西門', '小南門', '中正紀念堂', '古亭', '東門', '忠孝新生', '忠孝復興', '大安', '信義安和')                                              | 9    
('善導寺', '忠孝新生', '忠孝復興', '南京復興', '松江南京', '中山', '北門', '西門', '小南門', '中正紀念堂', '東門', '大安森林公園', '大安', '信義安和')       | 14   
('西門', '北門', '中山', '松江南京', '南京復興', '忠孝復興', '忠孝新生', '東門', '大安森林公園', '大安', '信義安和')                              | 11   
('中山', '北門', '西門', '小南門', '中正紀念堂', '東門', '忠孝新生', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                        | 12   
('西門', '小南門', '中正紀念堂', '東門', '忠孝新生', '忠孝復興', '大安', '信義安和')                                                    | 8    
('善導寺', '忠孝新生', '忠孝復興', '南京復興', '松江南京', '中山', '北門', '西門', '小南門', '中正紀念堂', '古亭', '東門', '大安森林公園', '大安', '信義安和') | 15   
('台大醫院', '中正紀念堂', '東門', '忠孝新生', '忠孝復興', '大安', '信義安和')                                                         | 7    
('中山', '松江南京', '南京復興', '忠孝復興', '大安', '信義安和')                                                                  | 6    
('西門', '小南門', '中正紀念堂', '東門', '大安森林公園', '大安', '信義安和')                                                          | 7    
('台大醫院', '中正紀念堂', '古亭', '東門', '大安森林公園', '大安', '信義安和')                                                         | 7    
('中山', '松江南京', '忠孝新生', '東門', '大安森林公園', '大安', '信義安和')                                                          | 7    
('善導寺', '忠孝新生', '松江南京', '中山', '北門', '西門', '小南門', '中正紀念堂', '古亭', '東門', '大安森林公園', '大安', '信義安和')                 | 13   
('中山', '北門', '西門', '小南門', '中正紀念堂', '東門', '忠孝新生', '忠孝復興', '大安', '信義安和')                                        | 10   
('中山', '北門', '西門', '小南門', '中正紀念堂', '古亭', '東門', '大安森林公園', '大安', '信義安和')                                        | 10   
>>> 

 

讀者只要讀讀維基百科『圖論Graph theory 詞條,

Wikipedia_multilingual_network_graph_July_2013.svg

將可以知道『圖』的應用廣泛,而這也正是 pyDatalog 的『強項』之一呢!