资源描述
CLIPS程式技巧
練習一 (安裝與設定)
練習二 (簡易程式)
練習三 (資料定義與邏輯比較)
練習四 (模組化)
練習五 (讀取資料)
練習六 資料(知識)結構
練習七 物件導向程式設計
練習八 程序控制與平行處理
撰寫程式經常發現的問題
實例討論
專家有何特殊不同之處?和用網頁來表達有何不同?
Procedure/non-procedure languages
哲學思考
練習一 (安裝與設定)
l 下載程式及安裝 (
l 請下載示範程式(http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex 1-3 ICstrategies.CLP ),供練習一、二、三使用。
l 請嚐試交談式操作
n 視窗操作
n load:載入「純文字檔(.txt)」的應用程式 (*.clp)
n reset:重置。不移除應用程式,但是所有參數均重設成原預設值。
n run:先要執行reset後,才能執行run。
n clear:移除程式,再重新load/reset/run其他程式。
l 交談式簡易操作
n CLIPS是類似LISP 的人工智能(AI)語言。
n 所有的運算式均為函數(function),寫在 ( … ) 之內,運算子(operator)位於第一位,其餘運算元(operand)跟隨在後。運算子和各運算元之間均以空格隔開(不是逗號)。空格只要一格以上即可,多空無妨。
n 請試 (+ 1 2) ,看會發生什麼結果?
n (+ 1 3 5)
n 請自行試其它的運算式。
l 實務上,仍須寫成應用程式。
l 請注意:括號要雙雙對對!!! 請養成良好的程式格式習慣,會減少很多程式除錯的時間和體力!!!
練習二 (簡易程式)
l TXT檔案格式;副檔名: CLP
l 主要包括二部份: deffacts, defrule 【此二字均是「保留字」,視為operator】
l deffacts 定義已知的事實, defrule 定義推理規則
l ; 註記行
l 事實以串列表示。如: (Relation X Y Z)
l ?X 代表變數。如: (Relation ?X ?Y ?Z )
l 英文字之大小寫有別!!! 例如:(duck) 和 (Duck) 是不同的fact。
l 請注意雙引號 " 之使用,不能用Words裡的雙引號。WordPad 或小作家的雙引號才行。
l 僅註記行及字串得用中文。指令及變數均須英文字母(及合法之符號)。
l 推理方法為「型態比對」(pattern matching),同位之常數要相同,變數可以對應變數或常數。元素個數要相同。=>左(上)方之所有事實均比對成功後,該規則被啟動(activate)並置入議程(agenda)之中。議程依一定之策略(strategy)次序執行(fire)已被啟動之規則的=>右(下)方各指令。
l 各規則之啟動,係因左(上)方事實成立。換言之,一旦事實有所增減,專家系統即會自動找尋有那些規則可被啟動,或議程內原被啟動之規則,不再可以啟動,而自議程撤下。
l 以下是可執行的應用程式實例。
;------------------------------------------------------
; 例: 都市發展策略
; 宣告基本信念
;目標/策略關係 [策略本身是一種次目標]
(deffacts goal-strategies
(gs "都市發展策略" "減少失業率") ; 都市發展策略: 減少失業率
(gs "減少失業率" "吸引廠商") ; 減少失業率策略: 吸引廠商
(gs "吸引廠商" "降低通信成本") ; 吸引廠商策略: 降低通信成本
(gs "吸引廠商" "充足的網路建設") ; 吸引廠商策略: 充足的網路建設
(gs "降低通信成本" "民營化") ;降低通信成本策略: 民營化
)
;推理規則
; 推出所有的 目標--策略 關係 (策略本身也是一種次目標)
(defrule t-gs
(gs ?x ?y)
(gs ?y ?z)
=>
(assert (gs ?x ?z)) ;已知之事實用 deffacts。後來推論所得者用assert。
(printout t "欲達成" ?x "可採取" ?z "之策略" crlf)
)
;----------------------------------------------------------------------------------
;實例結束
;----------------------------------------------------------------------------------
【作業】
l 會推導出「欲達成減少失業率可採取民營化之策略」,合理嗎?
l 請將「城鄉發展」相關文獻之知識改寫成專家系統之形式,以CLIPS推理,看結論是否合理?並討論其問題出在何處?如何修正,可以使推理合理化?
練習三 (資料定義與邏輯比較)
l 用 deftemplate 定義某一資料型態之綱目(schema),再用描述該資料型態之實例。如下,我們先定義city資料型態,再描述Glasgow市之各屬性值。
; 定義city資料型態
(deftemplate city
(slot name)
(slot area)
(slot population)
(slot popu-year)
(slot popu-year-type)
(slot rate-of-jobless)
(slot rate-of-jobless-year)
(slot rate-of-jobless-year-type)
)
; 描述Glasgow市之各屬性值
(deffacts basic-data-of-Glasgow
(city
(name Glasgow)
(population 600000)
(popu-year 1980)
(popu-year-type s)
(rate-of-jobless 0.168)
(rate-of-jobless-year 1996)
(rate-of-jobless-year-type y)
))
l 邏輯比較要放在RHS,用IF-THEN-ELSE,如下例:
(defrule determine-the-degree-of-jobless
(city (name ?x) (rate-of-jobless ?y) (rate-of-jobless-year ?z))
=>
(if (> ?y 0.05)
then
(assert (status-of-jobless ?x serious))
(printout t ?x "在" ?z "年的失業率十分嚴重" crlf)
else
(assert (status-of-jobless ?x no-problem))
(printout t ?x "在" ?z "年沒有失業問題" crlf)
)
)
【作業 – 新增資料及規則】
(1) 自行以deffacts之指令,增加1-2個城市的資料。
(2) 執行練習三之程式,看是否正確判斷城市之失業問題。
(3) 加入以下的規則:「若X在z年的失業率十分嚴重,則X應找尋新的發展策略。」
練習四 (模組化)
l 可以分別寫在不同檔案
l 分別load各檔
l 或者寫成一批次檔(如下,副檔名BAT),再以 load batch指令一次載入,例如:
n (load "C:/Documents and Settings/ftlin/My Documents/courses/空間邏輯/資訊城市/模組化/ex4 -- 變數中文意義.CLP")
n (load "C:/Documents and Settings/ftlin/My Documents/courses/空間邏輯/資訊城市/模組化/ex4 -- 目標策略關係.CLP")
練習五 讀取資料
l 用read讀取一個字;用readline讀取一個句子(數個字)。
l 用bind 將讀取的字(句),指派給某一變數
l 請注意執行過程中,Facts視窗內容的變化。(read 或readline所讀入之資料會出現在Facts視窗)
l 由鍵盤讀取資料:
l 相關指令: read
(defrule test-read
(initial-fact)
=>
(printout t "Name a primary color" crlf)
; 【printout 後面的 t 代表輸出到螢幕 】
(assert (color (read)))
; 【單獨的 read代表由鍵盤輸入】
)
l 由鍵盤讀取一行字,並存於某變數,以供後續使用。
l 相關指令:(readline) 、(bind …)
(defrule test-readline
(initial-fact)
=>
(printout t "Enter input" crlf)
(bind ?string (readline))
; 【bind 指令: 將由鍵盤讀入之文字存於變數 ?string之中】
(assert-string (str-cat "(" ?string ")")))
; 【str-cat 指令:將數個字串連成一個字串】
l 開啟檔案,並寫入、讀取、增加一行字。
l 相關指令: open, close, printout, readline, read
(defrule test-read
(initial-fact)
=>
(open "test.dat" rfile "w")
; 【檔案test.dat位於與程式相同之目錄中】
; 【可以加上路徑,以存取位於其他目錄之檔案】
; 【rfile為「簡稱」,爾後程式中均使用簡稱,不用(含路徑之)檔案名稱】
; 【w表示本檔案僅能從頭「寫入」,會覆蓋原有文字;不能讀取】
(printout t "請輸入文字: " crlf)
(printout rfile "This is the first test line. " crlf)
; 【printout後加上檔案簡稱,將字串輸出於該檔案】
(close)
; 【關閉檔案,檔案游標將回到檔案開頭】
(open "test.dat" rfile "r")
; 【r表示本檔案僅能被讀取,不能寫入】
(printout t (readline rfile) crlf)
; 【readline後加上檔案簡稱,表示由該檔案讀取一行字串】
(close)
(open "test.dat" rfile "a")
;【a表示該檔案僅能由文末寫入新字(串),不會覆蓋原有資料】
(printout rfile "This is the 2nd test line. " crlf)
(close)
)
【完整程式範例—親屬】
; 本程式可以推論親屬關係
; 本程式使用了以下之述詞(predicate)
; ( A X Y) 代表: X 是 Y 的 長輩
;
(deffacts names
(A "甲" "乙")
(A "乙" "丙")
(A "乙" "丁")
(A "乙" "戊")
(A "丁" "己")
)
(defrule ancestor
(A ?X ?Y)
(A ?Y ?Z)
=>
(assert (A ?X ?Z))
)
(defrule ask
=>
(printout t "請輸入長輩的名字:")
(bind ?x (read))
(assert (person ?x))
(printout t crlf)
)
(defrule answer
(person ?x)
(A ?x ?y)
=>
(printout t ?y "是" ?x "的晚輩" crlf)
)
【作業—新增資料並存檔】
增加上述「親屬」程式之功能:詢問新的親屬關係,寫入資料檔案。下次執行時,先行讀取該資料檔。
練習六 資料(知識)結構
一、指令練習
l 複選及重置
n http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/指令練習/複選.clp
l Global variables
n http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/指令練習/globalvar.clp
n local variables
l 串列(list)
n http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/指令練習/事實串列.clp
n http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/指令練習/num-arguments.clp
l While loop
l 複合條件邏輯運算AND, OR, NOT
l 檢查某事實不存在: NOT
n http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/指令練習/事實不存在的not.clp
二、 基本資料結構
l 宗親(質性關係)
n http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/指令練習/宗親.clp
n 【作業—兄弟姐妹】利用「宗親」程式,推論出"同父母之兄弟姐妹"的關係。
n 【作業—同輩】改寫(增修) 「宗親」程式,推論出"同輩"的關係。(提示:記錄輩份差)
n 【作業—親等及輩份差計算】找出任二人之間的親等及輩份差。
l 決策樹(質性因果推論)
n http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/指令練習/決策樹.doc
n 【作業—決策樹】(1)撰寫上述決策樹之CLIPS程式。(2)擴充決策樹,繼續判斷不同物種。(3) 增加quit 及 「回到start」的功能。
l 水災防治因果關聯圖
n 決策時經常遇到左右為難,或者長、短期效益矛盾的困境。本例模擬研訂治水政策所面對的問題。從知識結構的角度來說,本例的知識結構是比「決策樹」還複雜的「循環圖」。
n http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/範例/水災防治因果關聯圖(教學範例).clp
l 聯立方程式(量化預測)
n http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/數學/聯立方程式.clp
n 【作業—一元二次方程式】:可以求 aX2+bX+c=0 解的專家系統
n 【作業—汽機車數量預測模型】
http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/數學/汽機車數量預測.doc
l 堆疊與佇列
n 利用defclass
n 堆疊: http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/basic data structure/stack.clp
n 【作業—佇列】:改寫stack.clp,使之成為具有佇列(排隊)行為的串列
l 模糊推理 (Fuzzy reasoning)
n 模糊集合理論,請參見 http://myweb.ncku.edu.tw/~ftlin/course/CAAD/CourseInformation/document/模糊集合及邏輯.doc
n 身高判斷(物理量à心理量):輸入一身高,回報其身高的心理量:高、很高、矮、很矮、不高也不矮。
u 提示
1.分別建立「高」、「矮」、...等「概念(心理量)」的membership function。
2.進一步建立「很高」、「不算高」、「不高也不矮」...的membership function。
3.輸入一身高值後,分別計算它的各種degree of membership。
4 .回報degree of membership最高值所對應的「概念(心理量)」。
u 程式: http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/數學/模糊集合(身高).clp
n 【作業】 請修正上列程式,加入「很高」、「很矮」、「不高也不矮」三個membership functions。
n 【作業】承上題,輸入心理量之後,估計其可能的身高。
l 階乘 (deffunction之運用)
n http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/數學/階乘.clp
l 樹狀結構
n 讀入一連串的數目,以左方小於等於根,右方大於根之規則,建成樹狀資料結構,並輸出成一資料檔。
n 程式1: http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/樹及圖/tree-example1.clp
n 程式2: http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/樹及圖/tree-example2.clp
三、拓樸演算法
【注意:請在CLIPS的執行環境下,將Execution/Options/Strategy設定為Breadth】
1. 以CLIPS練習「拓樸學」(topology) 或稱「圖論」(graph)之基本表示法。
http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/樹及圖/ex6-1 graph-basic.clp
2. 偵測迴圈之存在。
http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/樹及圖/ex6-2 loop.clp
3. 延伸樹之演算。
http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/樹及圖/ex6-3 spanning-tree.clp
4. 樹狀結構之廣度優先搜尋法 (Breadth First Search)
http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/樹及圖/BFS-tree.clp
【學習重點: (1) defclass 指令的用法。 詳練習七!! (2) 演算法 (algorithm)】
5. 樹狀結構之深度優先搜尋法 (Depth First Search)
http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex6 資料結構/樹及圖/DFS-tree.clp
【學習重點: stack, push, pop】
【作業】
(1) 修改上述程式,讓操作者可以(1)自行增加節點及連結,如已經存在,應提醒已經存在,不必再加;(2)自行刪減連結(不刪節點,只刪連結),若該連結本不存在,應提醒該連結本不存在,無法刪去,(3)輸入二個節點名稱,系統告知二者之間是否存在路徑?
(2) 請自行建構一個具有多個迴圈,ex6-2 loop.clp程式能夠找到多少迴圈?
【討論】
圖論之各種(程序性)演算法,以「規則式」來撰寫,有何其便利及困難之處?
【作業—中序】
讀入上一題所建之樹的資料檔,依中序列印出其由小而大的順序。
提示:
每一個node要有一個編碼(ID),左右子點及父點均是指向其ID,而不是指向資料內容本身。
Node的格式如:
(node ID value left-ID right-ID parent-ID)
【討論—divide, conquer and merge】
如何將一個複雜的問題切割(divide)成小的子問題,分別解決(conquer)之後再加以合併(merge)?
在上例,排序問題被切成「建樹」及「中序」二個子問題,透過檔案加以結合。子問題的程式可以分別獨立撰寫,互不影響其所設定的local variable的命名。如是,子問題如同軟體零組件,可以交由不同國家/設計團隊開發,運用其低廉的人力,但他們僅知其一,不知其二,而由系統規劃分析人員加以組裝之。
練習七 物件導向程式設計
基本觀念
http://myweb.ncku.edu.tw/~ftlin/course/GIS/物件導向式資料庫.doc
http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex7 物件導件基本技巧.clp
【Word 版: http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex7 物件導件基本技巧(MSword).doc 】
練習八 程序控制與平行處理
http://myweb.ncku.edu.tw/~ftlin/course/LOGIC/clips基本練習/ex8 程序控制及平行作業 -- OO之現勘準備作業.clp
本練習模擬營建署審議開發案現勘籌備作業之流程
【註】
目前(2005)CLIPS的OO僅能描述ISA的關係,尚不能描述HAS或其他關係。但仍能用原來的 predicate來描述各種關係。
撰寫程式經常發現的問題:
l (建議)步驟:
n 以「查詢者」之身分,設定問題情境。【誰問什麼問題?】
n 以「領域專家」之身分,回答問題,建構知識體系(決策樹)。
n 繪製「事件圖」(決策樹)
n 以「知識工程師」之身分,撰寫程式。
n 找「查詢者」及「領域專家」進行測試,修正程式。
l 程式的正確性:只好多翻翻手冊,問問有經驗的人。
l 邏輯流程
n 問題的前後次序
n 重複問問題
n 中文語意不清、不明確 【User Interface】
n 出現Y/N 殊途同歸。不須問該問題,因為Y/N之結果一樣。
n 有不可能發生的路徑?
l 問題的本質:判斷/決策樹
n 診斷:汽車、電腦
n 分類:古蹟、動物 (terminals 為 Classes)
n 指認:古蹟、動物 (terminals 為 instances)
n 簡單的問題結構可以用decision tree來表達。複雜的問題便會需要graph。
l 知識的體系化、結構化
n 讓領域專家成為知識工程師(合為一人)。
u 領域專家與知識工程師之間的溝通十分困難,經常造成專家系統的失敗。如今,我們讓領域專家成為知識工程師(合為一人)。希望能突破此一困境。
n chunk:片斷知識
n 有效的將片斷知識予以系統化,尤其當新的知識進來,或刪去舊知識,而仍舊保持明晰的系統(仍維持是decision tree)
n 儘量避免預設的問答次序。(宜採用switch…case…default指令)
n 可以將已知的資料(庫)建立於deffacts/instances,讓查詢者有案例可參考。
l 化簡(精緻化)
n 邏輯已經是正確
n 如何縮短決策步驟? = 去除不必要之步驟
n 如何設定default 值?(尤其是多選項)
l 【User Interface】
n 如何讓專家與一般使用者正確瞭解用詞之語意?
n 如何很快的瞭解到(感知到)使用者與專家之間的知識差距?
n 應請查詢者做專家系統測試,以瞭解使用者之查詢需求。
n 應使用查詢者可以理解或者回答之語句。
n 如使用「術語」,應能讓查詢者進一步查詢該術語之意義。
n 應確認程式設計者與查詢者的「語意」是否相同?(是否對問答之用詞有相同之理解)。
實例討論
【王文君:法律專家系統】
n 可以納入全部法條,變成一部「電子書」。
n 可以加入案例(判例)及說明、參考。利用「案例式推理」的方法,擷取條件最近似之案件,提供查詢者參考。
【分類問題】
l 鳥類辨識、電腦問題診斷、古蹟分級、…均是「分類問題」。
l 分類有其目的。目的不同,分類的準則(屬性)不同,其結果也不同。
l 分類的述詞:
n 需要二種述詞
u IS (X, A, V): X的A屬性值為V
u CLASS (X, Y): X 的類別為Y
n X 為待分類之物件集合
n A = {A1, A2, A3, …} 【可以有不同的屬性,如體積、重量、價格…】
n V = {VA1, VA2, VA3, …} 【不同屬性,分別對應不同的值域】
n Y = {Y1, Y2, Y3, …}
n 例:
n X 為所有中國建築之集合
n A = {屋群型式,屋頂型式,樓層數,建材}
n V屋群型式= {獨棟式,四合院,三合院,連棟式街屋}
n V屋頂型式= {歇山式、硬山式、懸山式、燕尾、平屋頂 }
n V 樓層數 = 自然數系
n V建材 = power set of {木,石,磚,竹,水泥,鋼骨} 【容許多種建材混用】
n Y = {官式建築,民居,窯洞,吊腳樓,廟,家祠,…}
規則
n 某類建築型式構成要素之規則
u IS(x, 屋群型式, 四合院) Ù IS(x, 歇山式) à CLASS(x, 官式建築)
n 類型及次類型之間的關係規則
u CLASS(x, 窯洞) à CLASS(x, 民居)
l 以首階邏輯描述之分類體系,即便是「樹狀」的,其層級順序並非固定的。亦即,不一定要先就A1分類,再依A2, A3,…依序分類。
l 首階邏輯描述之分類體系容許「網絡結構」,讓一個子類同時(可能)屬於不同的父類。例如:歇山式的四合院建築可能是官式建築、宮殿,也可能是國家劇場(如中正紀念館之國家劇院、音樂廳)
l 上述首階邏輯之分類體系,其基本事實之描述是「表格式」的。
專家有何特殊不同之處?和用網頁來表達有何不同?
l 語言的表述能力(expression power)。
n 各種(電腦)語言的表述能力是否一樣?
n 某些概念或者問題,用某種語言比較容易表述。
l 可以用網頁來表達樹狀、網絡的知識結構。
l 「祖先問題」是一個「樹狀結構」問題。
l 可否用「網頁」來表述祖先問題?
n 不能用網頁,一次「全部」推論出「所有的」祖先或子孫。
u 要加上以下之能力才行
l 推論
n 仍然要建立「龐大的」資料庫。
n 是否容許網頁具有「搜尋」、「網頁編輯器(維基百科)」的功能?
n 功能程式一定要用ES來寫嗎?
l Google可以不經首頁,直接找到某頁。
l 網頁:必須一頁一頁去找。
l 也必須沿者決策樹一層一層往下走。
l 對使用者而言,無差別。
l STRATEGY(程序控制策略):這是專家系統的特色之一。
Procedure/non-procedure languages
l 傳統的程式語言(例如:FORTRAN, C, VB)大多是程序性語言(procedural languages),程式指令的順利相當重要。次序不同就會得到不同的結果。
l 許多人工智能(AI)語言,是「非程序語言」。專家系統CLIPS即是。數學的聯立方程式也是。理論上(理想上),指令、規則的順序無關緊要。
l 程序性語言的重點是HOW to do, 要把演算程序步驟詳細的寫出來。
l 非程序性語言的重點是 WHAT to do, 只要把問題要素的關係、規則講清楚即可,不必考慮解決的步驟為何。(事實上,領域專家也經常說話顚三倒四,並不按一定的次序想起規則)
l 聯立方程式是一種non-procedure language
l 方程式的順序不重要
l 存在二種(以上)的解題程序。
l 解題程序之控制,在程式執行時,才由使用者決定。(程序性語言必須於程式撰寫時同時決定各模組之執行順序)。
l 概念的層級。高階概念(專業術語)是從低階概念建構上來的;例如,「容積率」是由「土地面積」、「建築面積」、「除法」等基本概念所構成。使用高階概念,會十分便利、迅捷。但是,必要時仍然可以用低階概念來重述高階概念。程式語言亦復如此。CLIP是一種相當高階的語言,具有許多「浮現」出來的能力(例如程序控制),但它仍然是可以用程序語言來表達(但就會十分繁瑣費事)。
l 這是一個專業化、模組(具)化的分工過程。資訊系統因為如此分工,才使系統的發展變得相當有彈性、可以多樣化的組合(重構),結果,成長相當快速。必須注意的是,分工只是一個面向;另一個面向是整合。資訊系統因為有清楚定義的分工和整合界面,才能夠多而不亂、快速累積知識,產生知識的綜效力量。(知識分工反而造成零碎、片斷化,這是各知識領域之間未能有效整合之故)。
l 從知識論來說,我們企圖建構一種知識整合平台,讓不同的知識能夠源源不斷的新陳代謝,而不失其系統性、結構性。(如何整合不同專家的知識?)
l 使用某一種語言,得到了某一種便利,但也必然會受到它所帶來的限制。自然語言正如礦泉水,有許多雜質,也充滿了養分;電腦程式語言就像蒸餾水,十分純淨,可以醫療使用,避免細菌感染,但是毫無養分。所以,就單一事件而言,有所取捨。但是,交替使用,則可兼得其利。正如,太陽之下,必有陰影,有白天,必有黑夜。但是,太陽會旋轉,會使每一個地方都有白天與黑夜。是故,在多元的社會、多元的認知中,經常要從不同角度去看問題,要「毌意、毌必、毌固、毌我」,不要死守一方,要多元觀照。語言也是一樣。不要限制自己「只能」用一種語言。「如筏喻者,法尚應捨,何況非法?」,再多高強的語言,都無需堅持只使用該種語言。
l 有些問題先天本質上就是網絡式,無法化成樹狀結構。
哲學思考
【符號系統可以表述所有的現實世界嗎?】
l NO! 哥德爾(Kurt Gödel, 1906/4/28 -1978/1//14,http://web.edp.ust.hk/math/history/3/3_157.htm)證明了「具內在一致性之符號系統無法對應到現實世界的所有陳述」。例如:「我說的話都是謊話」是一種詭論(paradox)陳述。這種詭論便無法被「具內在一致性之符號系統」所處理。
l 不過,「具內在一致性之符號系統」的確可以處理「非真即假」的命題邏輯及首階邏輯體系。近來,更有人引進模糊理論、歸納法、設證法、多值邏輯、等非傳統邏輯之符號系統。這些新的符號系統究竟能走多遠?值得討論。
l 這裡面有一個很根本的「語意」問題。我們知道,有些語意是蘊含在「語法」之內,也就是說,語句的文法結構決定了某些語意。例如:「下雨天留客天天留我不留」。不同的斷句(語法結構),會有完全相反的意思。但是,哥德爾也同時告訴我們,語法(具內在一致性之符號系統)不能完全涵蓋所有的現實世界的陳述。易言之,有些語意仍然是無法用語法來涵括的。究竟什麼是「語意」呢?或者什麼是「意義」呢?恐怕還是得傷傷腦筋吧!
l 相對於現實世界,數學是一個抽象系統。「1」可以代表一個人,也可以代表一顆樹。到了二十世紀初期,更發展出了「符號系統」。符號系統可以說是數學的進一步抽象化。其實,被抽象化的不只是數學而已,它也抽象化了邏輯系統。數學、邏輯是符號系統的實例。那麼,符號系統也揭示了存在著其他的(理念)世界。在下圖,我們標示了現實世界、數學、邏輯、符號系統、其他世界的關係。圓圈的包含關係說明它們之間的「不完全(替代)性」。
l 科學哲學家卡爾波普(Karl Popper)曾劃分了三個世界:物理世界、心理世界、知識世界。人類心智活動所發現的知識世界似乎是獨立於物理和心理之外。數理世界是知識世界的一部份。二十世紀初期的哲學家們(或者只是數學家們和符號邏輯學家們?)致力於建構一個「具內在一致性之符號系統」,希望能以它來打造「堅固」的知識世界。不過,似乎沒那麼簡單。不單是哥德爾的「不完全理論」揭示了它的侷限性,現象學、詮釋學也一再挑戰它。
l 現象學大師胡賽爾(Edmund Husserl, 1859-1938),受過嚴謹的自然科學訓練。但是他認為瀰漫二十世紀初期的實證主義是一種「不完善的理性」,忽視了認識論的問題,沒有考慮感官認知和詮釋的問題。他希望建構一個完全的理性主義來代替殘缺不全的理性主義。所以,胡賽爾所質疑的是哲學的危機。只有正視哲學問題,才能正確的對待科學問題。
展开阅读全文