專家系統
曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 February 2025
53年前(1972)出現過一個曾被公認是很成功的人工智慧軟體程式專家系統 MYCIN ,它被用來根據血液數據提供出診斷與治療建議。那時的電腦性能沒有那麼好,但可以容得下500條規則進行推論得出結果。這個應用典例,說明了專家系統由推理引擎及數據資料庫所形成,它是一種由專家整理出來的確定性人工智慧,由電腦執行的過程中,沒有模糊的(fuzzy)決策理念摻雜其間。它跟現今的熱門話題:運用類神經網路發展出來的人工智慧(AI)系統不同,差別就在設計系統時只依據專家總結出來的定論規劃程式。
運轉原子爐時,為了安全,必須講求運轉人員能迅速的確定爐心燃料棒的狀況,判斷狀況的依據則僅能根據各種儀錶的讀數。能運轉原子爐的工程師都是專家,都必須被訓練成能根據儀錶讀數解讀出燃料棒發生了什麼事情?而且判斷要快,才能立刻採取正確的處理措施,確保原子爐一定安全。
我曾運轉過一座 40MW(t) 的重水式原子爐許多年,爐心有大約 200 根以天然鈾製成的金屬燃料棒,由於它是專門供作研究用的巨型核輻射裝置,內部全面採用必須絕對安全的設計。例如:每單根燃料棒冷卻水的出口管路,都必須經過好幾套儀錶的監測,運轉時隨時提供重要數據,關鍵性的參數不正常時,還可能立即引發原子爐『急停』(trip),自動強制原子爐處於絕對安全的停爐狀態。
所用的監測儀錶有氣體分裂產物監測器(GFP)、冷卻水流量計(FT)、冷卻水溫度計(TE)、冷卻水壓力計(PIS).....等。由於壓力參數最敏感、響應最快速,一裝就三套,兩套接通到流量測量元件(FE)的上游,一套接通到下游,兩邊的壓差有 2 psi 的程度。冷卻水壓力出現問題時,壓力計的信號會直接驅動壓力控制器(PC),引發原子爐自動急停。
研究用原子爐的燃料棒比較容易出現異常狀況,因為爐心的運轉條件必須經常配合研究需要而調變。甚至於在全功率運轉狀況下,經常有添加的研究設施在爐心範圍內作動,也有只能短瞬間被照射的物質必須快速進出於爐心領域,而原子爐的動態性能研究本就是這種原子爐建造起來的目的。種種的研究需求都會令原子爐運轉功率變化,同時就令燃料棒的狀態跟著變化。
燃料棒出現問題時,出口冷卻水的監測參數會立刻顯現出來,根據參數判斷出問題是一門專家才能搞得很清楚的技術。判斷必須講求迅速,狀況又有許多種,把專家確定的知識設計成以電腦輔助運轉的專家系統就有價值。專家系統能快速的提供建議,告訴專家那些可能,例如:燃料棒內套管破了、外套管破了、管頂或管底的閥門漏水了、管內防止燃料棒斷掉的先斷式張力棒(tension member)斷掉了、管內冷卻水道變形或有雜物堵塞妨礙冷卻了.....等等現象,都需要能被快速的判斷出來,以便採取措施。這種專家技術討論起來有點複雜,我只把相關圖示貼在這裡供大家認識。請問:光憑上述資訊,能自己把儀錶參數與燃料棒狀況對應得上嗎?答案是不能,只能由學通過整個系統的專家來回答問題,這就是建立專家系統的好處。此外,我因較為資深,碰過例外情況,還能在例外狀況發生而專家系統上沒有列入程序的狀況下解釋問題,我做過這種貢獻,是比專家更專家的事情。
設計電腦的專家系統有許多例子可舉,我們可以舉一個很簡單之數學方面的專家程式為例,越簡單越好,主要目的只在說明專家系統的道理:
二元二次方程式的類型判別式,早就已經被整理得很完善了。從專門的數學手冊中,都可以找到這種規則分類表,使用者只須取出二元二次方程式的每一項係數,自行代入指定的幾個判別式,計算出結果,然後對照至規則分類表中的幾個條件,就能判別出方程式是屬於那一種幾何圖形?所根據的方法,在數學上稱為不變式論(Invarians)。
這樣的小型數學專家系統,於電腦的使用沒現在那麼方便前,至少還是要靠一點人工的計算,與人工設計的邏輯判斷來得到結果。但是,如果不能方便的設計程式,要解決這樣的問題,仍是不值得耗時、耗力去完成。 ABC Forth 系統改善了傳統 Forth 的這種情況,這一篇文章也係為了解決此類問題而寫。
在三位作者A. D. Aleksandrov(Editor ), A. N. Kolmogorov (Editor ), M. A. Lavrentiev(Editor ),所著之 Mathematics: Its Content, Methods, and Meaning (3 Volume Set).The MIT Press 於 March 15th 1969 出版的書中,Chapter 3 第十二節就刊載了整理得非常完善的規則分類表,我們就以這份表格來設計程式,設計出來的程式幾乎不用解說,任何人都可以很容易的明白與使用,程式中就得用到性能優越、用法平易近人的邏輯運算,才能表現得非常清楚。
由於我在設計 ciForth 的浮點運算系統時,把 『 E 或 e 』當作一個指令來處理出 10 的幾次方之表達方式,程式中不宜再用 E 或 e 來作為變數名稱。因此,這個範例程式中改採全用雙字元來宣告出變數,想用 E 或 e 時,改用 EE ,特此提示。
\ 二元二次方程式判別程式
\ 根據不變式論(Invarians)設計。
\ 作者:曾慶潭2011/4/16保有一切版權,知會作者,附加本宣告則允許引用。
\ Copyright 2011/4/16 Ching-Tang Tseng
\ Permission is granted by the author to use this software
\ for any application provided this copyright notice is preserved.
\ 2025/2/2重整內容並在Lina64之ABC Forth系統上執行,測試無誤。
10 Reals I1 I2 I3 K1 AA BB CC DD EE FF
: INPUT-COEFFICIENTS {{ AA = 9.0 E 0 }} {{ BB = 0.0 E 0 }} {{ CC = 1.6 E 1 }} {{ DD = 0.0 E 0 }} {{ EE = 0.0 E 0 }} {{ FF = 1.0 E 0 }} ; : DISCRIMINANTS BASIC 10 LET { BB = BB / 2.0 E 0 } 20 LET { DD = DD / 2.0 E 0 } 30 LET { EE = EE / 2.0 E 0 } 40 LET { I1 = AA + CC } 50 LET { I2 = AA * CC - BB * BB } 60 LET { I3 = AA * CC * FF + 2. E 0 * BB * DD * EE - AA * EE * EE - CC * DD * DD - FF * BB * BB } 70 LET { K1 = AA * FF - DD * DD + CC * FF - EE * EE } 80 END ; : DESCRIPTION BASIC 10 PRINT " 二元二次方程式:AX^2+BXY+CY^2+DX+EY+F=0 " 20 PRINT " 係數為: " 30 PRINT { " A = " ; AA ; " B = " ; BB ; " C = " ; CC } 40 PRINT { " D = " ; DD ; " E = " ; EE ; " F = " ; FF } 50 PRINT " 方程式為: " 60 END ; : MAIN BASIC 10 RUN INPUT-COEFFICIENTS 20 RUN DESCRIPTION 30 RUN DISCRIMINANTS 40 IF { ( I2 > f0.0E0 ) AND ( ( I1 * I3 ) < f0.0E0 ) } THEN 150 50 IF { ( I2 > f0.0E0 ) AND ( ( I1 * I3 ) > f0.0E0 ) } THEN 170 60 IF { ( I2 > f0.0E0 ) AND ( I3 = f0.0E0 ) } THEN 190 70 IF { ( I2 < f0.0E0 ) AND ( I3 <> f0.0E0 ) } THEN 210 80 IF { ( I2 < f0.0E0 ) AND ( I3 = f0.0E0 ) } THEN 230 90 IF { ( I2 = f0.0E0 ) AND ( I3 <> f0.0E0 ) } THEN 250 100 IF { ( I2 = f0.0E0 ) AND ( I3 = f0.0E0 ) AND ( K1 < f0.0E0 ) } THEN 270 110 IF { ( I2 = f0.0E0 ) AND ( I3 = f0.0E0 ) AND ( K1 > f0.0E0 ) } THEN 290 120 IF { ( I2 = f0.0E0 ) AND ( I3 = f0.0E0 ) AND ( K1 = f0.0E0 ) } THEN 310 130 PRINT " 已知條件不符合程式執行要求,未判別出結果。 " 140 GOTO 999 150 PRINT " 橢圓,典型方程式為:(X^2/a^2)+(X^2/b^2)=1 " 160 GOTO 999 170 PRINT " 虛橢圓,典型方程式為:(X^2/a^2)+(X^2/b^2)=-1 " 180 GOTO 999 190 PRINT " 點,典型方程式為:(X^2/a^2)+(X^2/b^2)=1 " 200 GOTO 999 210 PRINT " 雙曲線,典型方程式為:(X^2/a^2)-(X^2/b^2)=1 " 220 GOTO 999 230 PRINT " 一對相交的直線,典型方程式為:(X^2/a^2)-(Y^2/b^2)=0 " 240 GOTO 999 250 PRINT " 拋物線,典型方程式為:X^2=2pY,其中p=SQRT(-(I3/I1^3)) " 260 GOTO 999 270 PRINT " 一對平行線,典型方程式為:X^2=a^2 " 280 GOTO 999 290 PRINT " 一對虛平行線,典型方程式為:X^2=-a^2 " 300 GOTO 999 310 PRINT " 一對重合的直線,典型方程式為:X^2=0 " 999 END ; 載入程式後,執行MAIN指令,得到下列結果: MAIN 二元二次方程式:AX^2+BXY+CY^2+DX+EY+F=0 係數為: A = 9.000000000 B = 0.000000000E0 C = 16.00000000 D = 0.000000000E0 E = 0.000000000E0 F = 1.000000000 方程式為: 虛橢圓,典型方程式為:(X^2/a^2)+(X^2/b^2)=-1 ok
這樣的程式顯示出幾項特點:
(1) 並不是只有從頭到底都必須一直計算的程式,才叫數學計算程式。這個程式根本只進行很簡單的數學計算,最後能得到正確答案,主要還是依靠邏輯判斷的功能。
(2) 非結構化的程式性能,並不是不好的性能。這個程式簡直就是一個澈底非結構化的典型程式,但是!我在設計它時,就因為系統具有能寫非結構化程式的功能,如此設計出來的程式,簡直就是照規則表直接翻譯,一次完成。
大家現在就回頭讀一讀看 MAIN 指令的內容,您不可能會看不懂程式在做甚麼?嚴格的專家經驗,就需要這樣的程式功能來表達,可貴的經驗才不會被扭曲。
反之,您若使用現行任何一種號稱嚴格結構化的程式語言,設計這種程式,邏輯判斷三次,就足以將程式設計者搞混了,那怕您將程式依序一層一層的縮格,規劃得再漂亮,寫完程式後五分鐘,就無法正確的維護了。那麼,要結構化程式語言何用?不如就像 ABC Forth 系統一樣,能夠非結構化。
作者曾經是核子反應器廠(俗稱原子爐)的運轉專家,深知當年想以程式實現專家經驗時的關鍵問題所在,如果那時我就設計了具有邏輯功能的 ABC Forth 系統,想具體實現作者的專家經驗,並實際應用設計出來的程式,作為核子反應器廠運轉時的強力輔助工具,實現計劃就不會那麼困難了。
(3) 還有,最重要的一點,就是,如果系統不提供純粹中文式的邏輯運算功能,我就不覺得設計上述的程式,對中國人而言,會有任何意義了。因為邏輯條件講求嚴謹,輸出結果講求絕對正確,程式的日後維護講求易看、易懂、易修改,沒有中文功能,就不必白費力氣去設計日後難用、難維護的程式。
(4) 近代應用於解決數學問題的商售大型套裝軟體,由於電腦易於安裝廉價大量的記憶體,執行速度也不再是應用時主要的考量問題。系統的功能也開始提供非純粹計算式的解題功能。例如:執行求解數學式子的微積分問題時,根本不執行數值分析程式,改成設計對輸入數學式的文字或符號式剖析,再經歸納出來的數學分析規則,只進行簡單的判別式計算,就能輸出正確解答。這樣的程式功能,就得依靠本章中的『條件整合』式邏輯運算功能來處理問題,上述的程式提供了一點解決此類問題的思考依據。
(5) 電腦輸出決策絕對重要,如果最聰明的人類,能夠製作出最關鍵性的決策表格,截至目前為止,甚麼程式語言?才能提供人類最清楚的表達程式,令其與表格同步。甚麼樣的程式?放幾十年後,還能夠照樣清楚的反應出專家技術。這些問題,表示為電腦設計出簡單明確的邏輯運算功能非常重要。現行 ABC Forth 數學計算系統,具備這樣的特質。
沒有留言:
張貼留言