就讓我們試著構造一組有先後次序的子句,看看 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('連接, 鄰近, 能達, 所有路徑') >>> +連接('台北車站', '中山') >>> +連接('台北車站', '善導寺') >>> +連接('台北車站', '西門') >>> +連接('台北車站', '台大醫院') >>> +連接('西門', '龍山寺') >>> +連接('西門', '小南門') >>> +連接('西門', '北門') >>> +連接('中山', '北門') >>> +連接('中山', '雙連') >>> +連接('中山', '松江南京') >>> +連接('中正紀念堂', '小南門') >>> +連接('中正紀念堂', '台大醫院') >>> +連接('中正紀念堂', '東門') >>> +連接('中正紀念堂', '古亭') >>> +連接('東門', '古亭') >>> +連接('東門', '忠孝新生') >>> +連接('東門', '大安森林公園') >>> +連接('善導寺', '忠孝新生') >>> +連接('松江南京', '忠孝新生') >>> +連接('忠孝復興', '忠孝新生') >>> +連接('松江南京', '行天宮') >>> +連接('松江南京', '南京復興') >>> +連接('中山國中', '南京復興') >>> +連接('台北小巨蛋', '南京復興') >>> +連接('忠孝復興', '南京復興') >>> +連接('忠孝復興', '忠孝敦化') >>> +連接('忠孝復興', '大安') >>> +連接('大安森林公園', '大安') >>> +連接('科技大樓', '大安') >>> +連接('信義安和', '大安') >>> +連接('信義安和', '世貿台北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 詞條,
將可以知道『圖』的應用廣泛,而這也正是 pyDatalog 的『強項』之一呢!