勇闖新世界︰ 《 pyDatalog 》【專題】之物件導向設計‧四上

由於『物件』 Object 概念並非三言兩語可說,『物件導向』 編程Object-oriented programming 更是千言萬語難為功,如果只是摘用維基百科的詞條說明︰

物件導向程式設計英語Object-oriented programming縮寫OOP)是一種程式設計典範,同時也是一種程式開發的方法。物件指的是類別的例項。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充功能性。

怕是說了也如沒說。故而特此援引之前寫過的有關『派生』 Python 兩個系列文章首篇以為輔翼作為參考,希望讀者諒解,那些概念是什麼之事,就此輕輕帶過的了。

W!o 的派生‧十日談之《一》》───

甲骨文永

甲骨文派

説文解字》:

永,長也。象水巠理之長。《詩》曰:“江之永矣。”凡永之屬皆从永。

派,別水也。从水从 派派 亦聲。

之所以將『 Python 』譯為『派生』實有個緣故。『 Computer 』本就是『計算機器』,祇因『程式語言』源自用機器『作計算』,也可以稱為『計算機語言』,在這個意義上說,『派生』可以說是『 Pi 』── 圓周率 π ── 所『』。由於人們一般比喻的說,也將『 Computer 』意會成『電腦』,從此向度來講,『派生』亦不只是『 Python 』的『音譯』,『』之『古義』為『別水』,正如『 Python 』號稱『 Battery Included 』自備電池的,而且有眾多『應用分支』程式庫,於是因 W!o 之故而得名,旨在『一本萬殊,各建其功』。……

───

《派生》 Python 作坊【甲】尋本溯源 》───

甲骨文作一

甲骨文作二

甲骨文作三

△★ 坊

《説文解字》:,起也。从人,从乍。

本義:木匠用刀具砍斫削刻,制作器物。

《説文解字》:,邑里之名。从土,方聲 。古通用埅。

原意:邊塞的防護墙。

想當初

李時珍說『燒酒』,非『古法』也。自元時『始創』其法 ︰

本草綱目‧穀之四

燒酒(《綱目》)

釋名】火酒(《綱目》)、阿剌吉酒(《飲膳藥正》)

集解

時珍曰︰燒酒非古法也。自元時始創其法,用濃酒和糟入甑,蒸令氣上,用器凡酸壞之酒,皆可蒸燒。近時惟以糯米或粳米或黍或秫或大麥蒸熟,和曲 蒸取。其清如水,味極濃烈,蓋酒露也。

曰︰暹邏酒以燒酒複燒二次,入珍寶異香。其壇每個以檀香十數斤燒煙熏令如漆,然後入酒蠟封,埋土中二、三年,絕去燒氣,取出用之。曾有人攜至舶,能飲三、四杯即醉,價值數倍也。有積病,飲一、二杯即愈,且殺蠱。予親見二人飲此,打下活蟲長二寸許,謂之魚蠱雲。

氣味】辛、甘,大熱,有大毒。

時珍曰︰過飲敗胃傷膽,喪心損壽,甚則黑腸腐胃而死。與薑、蒜同食,令冷水、綠豆粉解其毒。

主治】消冷積寒氣,燥濕痰,開郁結,止水泄,治霍亂瘧疾噎膈 ,心腹死,殺蟲辟瘴,利小便,堅大便,洗赤目腫痛,有效(時珍 )。

發明

時珍曰︰燒酒,純陽毒物也。面有細花者為真。與火同性,得火即燃,同乎焰消。北人四時飲之,南人止暑月飲之。其 味辛甘,升揚發散;其氣燥熱,勝濕祛寒。故能開怫鬱而消沉積,通膈噎而散痰飲,治泄瘧而止冷痛也。辛先入肺,和水飲之,則抑使下行,通調水道,而小便長 白。熱能燥金耗血,大腸受刑,故令大便燥結 ,與薑、蒜同飲即生痔也。 飲之,汗出而膈快身涼;赤目洗之,淚出而腫消赤散,此乃從治之方焉。過飲不節,殺人頃 刻。近之市沽 ,又加以砒石、草烏、辣灰、香藥,助而引之,是假盜以方矣。善攝生者宜戒 之。按︰劉克用《病機賦》雲︰有人病赤目,以燒酒入鹽飲之,而痛止腫消。蓋燒酒性走,引鹽通行經絡,使郁結開而邪熱散,此亦反治劫劑也。

附方】新七。

冷 氣心痛︰燒酒入飛鹽飲,即止。 陰毒腹痛︰燒酒溫飲,汗出即止。 嘔逆不止︰真火酒一杯,新汲井水一杯,和服甚妙。(瀕湖) 寒濕泄瀉,小便清者︰以頭燒酒飲之,即止。 耳中有核,如棗核大,痛不可動者︰以火酒滴入,仰之半時,即可風蟲牙痛︰燒酒浸花椒,頻頻漱之。 寒痰咳嗽︰燒酒四兩,豬脂、蜜、香油、茶末各四兩,同浸酒內,以茶下之,取效。……

───

 

既然前一篇我們談到了『實驗證實』東西方的『直覺』在『語言』 、『倫理學』和『知識論』之『理解』上大不同,就讓我們嘗試用 pyDatalog 來作些『人文』研究,看看能不能對一些『概念』有些較深入的了解。這裡將以《易經》說卦傳所講之『八卦』 為例︰

1280px-Carus-p48-Mystic-table

說卦

昔者聖人之作易也,幽贊於神明而生蓍,參天兩地而倚數,觀變於陰陽而立卦,發揮於剛柔而生爻。和順於道德而理於義,窮理盡性以至於命。昔者聖人之作易也,將 以順性命之理,是以立天之道曰陰與陽,立地之道曰柔與剛,立人之道曰仁與義,兼三才而兩之,故易六畫而成卦。分陰分陽,迭用柔剛,故易六位而成章。

天地定位,山澤通氣,雷風相薄,水火不相射,八卦相錯,數往者順,知來者逆,是故易逆數也。

雷以動之,風以散之,雨以潤之,日以烜之,艮以止之,兌以說之,乾以君之,坤以藏之。

帝 出乎震,齊乎巽,相見乎離,致役乎坤,說言乎兌,戰乎乾,勞乎坎,成言乎艮。萬物出乎震,震,東方也。齊乎巽,巽,東南也。齊也者,言萬物之絜齊也。離也 者,明也。萬物皆相見,南方之卦也。聖人南面而聽天下,嚮明而治,蓋取諸此也。坤也者,地也。萬物皆致養焉,故曰致役乎坤。兌,正秋也,萬物之所說也,故 曰說言乎兌。戰乎乾,乾,西北之卦也,言陰陽相薄也。坎者,水也,正北方之卦也,勞卦也,萬物之所歸也,故曰勞乎坎。艮,東北之卦也,萬物之所成終而所成 始也,故曰成言乎艮。

神也者,妙萬物而為言者也。動萬物者莫疾乎雷,撓萬物者莫疾乎風,燥萬物者莫熯乎火,說萬物者莫說乎澤,潤萬物者莫潤乎水,終萬物始萬物者莫盛乎艮。故水火相逮,雷風不相悖,山澤通氣,然後能變化,既成萬物也。

看看『先天八卦』 ──  伏羲八卦 與『後天八卦』── 文王八卦有沒有什麼奧秘?可以幾千年還探究不完!書籍文案之多,辯論之巨古今難盡!!玄之又玄恐傳自天外者耶??

這與用 pyDatalog 有什麼關係哩?!由於『關係代數Relational algebra 就是 pyDatalog 的強項之一。物象一多,關係駁雜,記憶之勞頓就大,而且還容易錯誤,此正為人類的弱點。所以剛好用之以補不足也。卦與卦之間的關係就是『爻』的異同,或者說『卦變』 ,也許講『變卦』。對三畫的八卦而言,簡單可以定義︰

一爻變 ── 卦的第一爻,陰變陽,或陽變陰,即陰陽互變。

二爻變 ── 卦的第二爻,陰變陽,或陽變陰,即陰陽互變。

三爻變 ── 卦的第三爻,陰變陽,或陽變陰,即陰陽互變。

因為卦數為八,兩卦的『二元關係』總數有 8 \times 8 = 64 個。其中有八個是『無爻變』的關係,也就是八卦自己與自己的關係。

【變壹爻】二十四個

[(震, 坤), (坎, 兌), (震, 離), (坎, 巽), (離, 乾), (艮, 坤), (巽, 艮), (坎, 坤),

(離, 震), (坤, 艮), (乾, 兌), (艮, 巽), (兌, 坎), (坤, 震), (巽, 坎), (兌, 震),

(乾, 離), (乾, 巽), (離, 艮), (坤, 坎), (艮, 離), (巽, 乾), (兌, 乾), (震, 兌)]

【變貳爻】二十四個

[(坤, 巽), (乾, 坎), (兌, 坤), (巽, 坤), (巽, 離), (兌, 巽), (震, 乾), (艮, 乾),

(離, 坤), (乾, 震), (坎, 乾), (巽, 兌), (震, 坎), (離, 巽), (坤, 兌), (離, 兌),

(艮, 坎), (乾, 艮), (坤, 離), (兌, 離), (坎, 震), (艮, 震), (坎, 艮), (震, 艮)]

然而【變參爻】用下面述詞

變參爻(X卦, Y卦)<=

爻變(X卦, Z卦) & 爻變(Z卦, T卦) & 爻變(T卦, Y卦) &

(X卦 != Z卦) & (X卦 != T卦) & (X卦 != Y卦) &

(Z卦 != T卦) & (Z卦 != Y卦) &

(T卦 != Y卦)

卻得不到預期的結果,反倒是

[(兌, 震), (巽, 坎), (乾, 兌), (坎, 坤), (震, 離), (乾, 坤), (坤, 震), (坤, 坎),

(乾, 離), (巽, 乾), (兌, 坎), (兌, 乾), (艮, 兌), (坤, 乾), (艮, 坤), (巽, 艮),

(震, 兌), (坎, 離), (離, 乾), (離, 艮), (巽, 震), (坤, 艮), (艮, 離), (震, 坤),

(離, 震), (坎, 巽), (艮, 巽), (坎, 兌), (震, 巽), (乾, 巽), (兌, 艮), (離, 坎)]

這是為什麼的呢?設想『一卦三爻全變』以及『一卦爻變三次』這兩句話的意義能夠相同的嗎?所以『爻變』三次皆取不同卦名,並不一定意味著全變的吧!因此改用『全變』述詞如下︰

全變(X卦, Y卦) <=

一爻變(X卦, Z卦) & 二爻變(Z卦, T卦) & 三爻變(T卦, Y卦) &

(X卦 != Z卦) & (X卦 != T卦) & (X卦 != Y卦) &

(Z卦 != T卦) & (Z卦 != Y卦) &

(T卦 != Y卦)

得到

[(坤, 乾), (巽, 震), (兌, 艮), (離, 坎), (震, 巽), (乾, 坤), (艮, 兌), (坎, 離)]

八個關係,如是關係總數 8 \ + \ 24 \ + \ 24 \ + \ 8 \ = \ 64 符合如數 。所以說『邏輯嚴密』方可無誤無漏。

 

【參考程式】

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 
>>> class 卦(pyDatalog.Mixin):
...     def __init__(self, 名, 象, 義, 畫):
...         super(卦, self).__init__()
...         self.名 = 名
...         self.象 = 象
...         self.義 = 義
...         self.畫 = 畫
...     def __repr__(self):
...         return self.名
... 
>>> 乾 = 卦('乾', '天', '健', '☰')
>>> 坤 = 卦('坤', '地', '順', '☷')
>>> 震 = 卦('震', '雷', '動', '☳')
>>> 巽 = 卦('巽', '風', '入', '☴')
>>> 坎 = 卦('坎', '月', '陷', '☵')
>>> 離 = 卦('離', '日', '麗', '☲')
>>> 艮 = 卦('艮', '山', '止', '☶')
>>> 兌 = 卦('兌', '澤', '說', '☱')
>>> 
>>> pyDatalog.create_terms('一爻變, 二爻變, 三爻變, X卦, Y卦, Z卦')
>>> + 一爻變(乾, 巽)
>>> + 二爻變(乾, 離)
>>> + 三爻變(乾, 兌)
>>> + 一爻變(坤, 震)
>>> + 二爻變(坤, 坎)
>>> + 三爻變(坤, 艮)
>>> + 二爻變(巽, 艮)
>>> + 三爻變(巽, 坎)
>>> + 一爻變(離, 艮)
>>> + 三爻變(離, 震)
>>> + 一爻變(兌, 坎)
>>> + 二爻變(兌, 震)
>>> 
>>> 一爻變(X卦, Y卦) <= 一爻變(Y卦, X卦)
一爻變(X卦,Y卦) <= 一爻變(Y卦,X卦)
>>> 
>>> 二爻變(X卦, Y卦) <= 二爻變(Y卦, X卦)
二爻變(X卦,Y卦) <= 二爻變(Y卦,X卦)
>>> 
>>> 三爻變(X卦, Y卦) <= 三爻變(Y卦, X卦)
三爻變(X卦,Y卦) <= 三爻變(Y卦,X卦)
>>> 
>>> 一爻變(X卦, Y卦).data
[(巽, 乾), (乾, 巽), (震, 坤), (艮, 離), (離, 艮), (兌, 坎), (坤, 震), (坎, 兌)]
>>> 
>>> 二爻變(X卦, Y卦)
[(震, 兌), (乾, 離), (坤, 坎), (艮, 巽), (巽, 艮), (離, 乾), (坎, 坤), (兌, 震)]
>>> 
>>> 三爻變(X卦, Y卦).data
[(坎, 巽), (坤, 艮), (震, 離), (乾, 兌), (離, 震), (艮, 坤), (巽, 坎), (兌, 乾)]
>>> 
>>> pyDatalog.create_terms('變壹爻, 變貳爻, 變參爻, 爻變, T卦')
>>> 
>>> 爻變(X卦, Y卦) <= 一爻變(X卦, Y卦)
爻變(X卦,Y卦) <= 一爻變(X卦,Y卦)
>>> 爻變(X卦, Y卦) <= 二爻變(X卦, Y卦)
爻變(X卦,Y卦) <= 二爻變(X卦,Y卦)
>>> 爻變(X卦, Y卦) <= 三爻變(X卦, Y卦)
爻變(X卦,Y卦) <= 三爻變(X卦,Y卦)
>>> 
>>> 爻變(X卦, Y卦).data
[(坎, 坤), (巽, 艮), (離, 艮), (坎, 巽), (震, 坤), (艮, 離), (坤, 坎), (坎, 兌), (巽, 坎), (艮, 坤), (震, 離), (艮, 巽), (兌, 坎), (乾, 兌), (巽, 乾), (離, 震), (兌, 震), (震, 兌), (離, 乾), (坤, 震), (坤, 艮), (兌, 乾), (乾, 巽), (乾, 離)]
>>> 
>>> 變壹爻(X卦, Y卦) <= 爻變(X卦, Y卦)
變壹爻(X卦,Y卦) <= 爻變(X卦,Y卦)
>>> 變壹爻(X卦, Y卦).data
[(震, 坤), (坎, 兌), (震, 離), (坎, 巽), (離, 乾), (艮, 坤), (巽, 艮), (坎, 坤), (離, 震), (坤, 艮), (乾, 兌), (艮, 巽), (兌, 坎), (坤, 震), (巽, 坎), (兌, 震), (乾, 離), (乾, 巽), (離, 艮), (坤, 坎), (艮, 離), (巽, 乾), (兌, 乾), (震, 兌)]
>>> 
>>> 變貳爻(X卦, Y卦) <= 爻變(X卦, Z卦) & 爻變(Z卦, Y卦) & (X卦 != Z卦) & (X卦 != Y卦) & (Z卦 != Y卦)
變貳爻(X卦,Y卦) <= 爻變(X卦,Z卦)&爻變(Z卦,Y卦)&!=(X卦,Z卦)&!=(X卦,
>>> 變貳爻(X卦, Y卦).data
[(坤, 巽), (乾, 坎), (兌, 坤), (巽, 坤), (巽, 離), (兌, 巽), (震, 乾), (艮, 乾), (離, 坤), (乾, 震), (坎, 乾), (巽, 兌), (震, 坎), (離, 巽), (坤, 兌), (離, 兌), (艮, 坎), (乾, 艮), (坤, 離), (兌, 離), (坎, 震), (艮, 震), (坎, 艮), (震, 艮)]
>>> 
>>> 變參爻(X卦, Y卦) <= 爻變(X卦, Z卦) & 爻變(Z卦, T卦) & 爻變(T卦, Y卦) &  (X卦 != Z卦) &  (X卦 != T卦) &  (X卦 != Y卦) &  (Z卦 != T卦) & (Z卦 != Y卦) & (T卦 != Y卦)
變參爻(X卦,Y卦) <= 爻變(X卦,Z卦)&爻變(Z卦,T卦)&爻變(T卦,Y卦)&!=(X卦,
>>> 變參爻(X卦, Y卦).data
[(兌, 震), (巽, 坎), (乾, 兌), (坎, 坤), (震, 離), (乾, 坤), (坤, 震), (坤, 坎), (乾, 離), (巽, 乾), (兌, 坎), (兌, 乾), (艮, 兌), (坤, 乾), (艮, 坤), (巽, 艮), (震, 兌), (坎, 離), (離, 乾), (離, 艮), (巽, 震), (坤, 艮), (艮, 離), (震, 坤), (離, 震), (坎, 巽), (艮, 巽), (坎, 兌), (震, 巽), (乾, 巽), (兌, 艮), (離, 坎)]
>>> 
>>> pyDatalog.create_terms('全變')
>>> 
>>> 全變(X卦, Y卦) <= 一爻變(X卦, Z卦) & 二爻變(Z卦, T卦) & 三爻變(T卦, Y卦) &  (X卦 != Z卦) &  (X卦 != T卦) &  (X卦 != Y卦) &  (Z卦 != T卦) & (Z卦 != Y卦) & (T卦 != Y卦)
全變(X卦,Y卦) <= 一爻變(X卦,Z卦)&二爻變(Z卦,T卦)&三爻變(T卦,Y卦)&!=(X
>>> 全變(X卦, Y卦).data
[(坤, 乾), (巽, 震), (兌, 艮), (離, 坎), (震, 巽), (乾, 坤), (艮, 兌), (坎, 離)]
>>> 

>>> pyDatalog.create_terms('貳爻變')
>>> 
>>> 貳爻變(X卦, Y卦) <= 一爻變(X卦, Z卦) & 二爻變(Z卦, Y卦) & (X卦 != Z卦) & (X 卦 != Y卦) & (Z卦 != Y卦)
貳爻變(X卦,Y卦) <= 一爻變(X卦,Z卦)&二爻變(Z卦,Y卦)&!=(X卦,Z卦)&!=(X
>>> 貳爻變(X卦, Y卦) <= 一爻變(X卦, Z卦) & 三爻變(Z卦, Y卦) & (X卦 != Z卦) & (X 卦 != Y卦) & (Z卦 != Y卦)
貳爻變(X卦,Y卦) <= 一爻變(X卦,Z卦)&三爻變(Z卦,Y卦)&!=(X卦,Z卦)&!=(X
>>> 貳爻變(X卦, Y卦) <= 二爻變(X卦, Z卦) & 三爻變(Z卦, Y卦) & (X卦 != Z卦) & (X 卦 != Y卦) & (Z卦 != Y卦)
貳爻變(X卦,Y卦) <= 二爻變(X卦,Z卦)&三爻變(Z卦,Y卦)&!=(X卦,Z卦)&!=(X
>>> 貳爻變(X卦, Y卦).data
[(巽, 坤), (坤, 離), (離, 巽), (乾, 震), (兌, 坤), (坤, 巽), (震, 乾), (離, 兌), (兌, 巽), (震, 艮), (乾, 艮), (艮, 坎), (震, 坎), (坎, 乾), (坤, 兌), (兌, 離), (坎, 震), (乾, 坎), (巽, 兌), (離, 坤), (艮, 震), (坎, 艮), (巽, 離), (艮, 乾)]
>>> set(貳爻變(X卦, Y卦).data) == set(變貳爻(X卦, Y卦).data)
True
>>> 
>>> len(變貳爻(X卦, Y卦).data)
24
>>> len(變壹爻(X卦, Y卦).data)
24
>>> set(變貳爻(X卦, Y卦).data) & set(變壹爻(X卦, Y卦).data)
set()
>>>