2026年4月15日 星期三

邏輯運算(Logic operation)

邏輯運算(Logic operation)


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 April 2026


本文所探討的邏輯運算,為『條件整合』所需的邏輯運算,而非『位元操作』方面使用的邏輯運算。

為了讓ABC FORTH數學計算系統增添這種邏輯運算的功能,我才慎重其事的重新探討此一主題。討論的內容仍然憑藉著邏輯運算的傳統原始定義,但討論的結果,可以產生創新的作法,並實際實現將系統中的邏輯運算指令,設計成以適當的中文意思來表達,且令其在程式中的使用方式,符合中文的語法規格。

大體而言,數學計算系統中的處理對象,若能夠被明確的劃分成各個獨立模組,系統便容易規劃、設計、發展。舉例而言,ABC FORTH數學計算系統,將整數、浮點數、複數…等數字處理對象,都當作各自獨立的模組來考慮,模組化後可以大大的簡化整個系統,讓各模組的問題,只須在各模組的範圍內自行解決。

因此,在ABC FORTH系統中,欲添加邏輯運算的功能時,最佳的作法,當然也就是繼續將這項主題,考慮成一個新建的單一模組來設計程式,讓邏輯運算的位階等同於整數運算、或浮點數運算、或複數運算,是一個獨立的新模組。

事實上,邏輯運算在實際的科學應用中,原本就與各種數字的運算不相干。數字運算計算3乘2得到6,1加1得到2,配合上其他所有的運算,形成一套完整的數學體系。邏輯運算執行0與1的各種運算後,也會得到一些運算結果,但這裡的0與1不表數字,而是表真或假、對或錯、是或非、有或無、開或關、高或低…等等所謂的邏輯相對狀態,0與1僅只是借自數字系統的兩個元素當作符號,這個1也可以使用除了0以外的其它任何數字來代表,但都與數字的大小或正負意義完全無關。總而言之,邏輯運算原本就與各種數字運算無關。

邏輯學是研究理論數學、應用數學、高深數學之基礎工具,也一直都是電腦科技發展的基石,電子邏輯電路工程更是經常需要用到邏輯運算設計產品。數學計算系統不應排除邏輯運算的功能,它係電腦以執行軟體程式的方式,實踐邏輯學問,沒有邏輯運算功能的系統,性能便有所欠缺。因此,將全部的邏輯運算功能建立在數學計算系統中,是有必要的,健全的邏輯運算功能,也有助於處理人工智慧方面的程式。我將加建邏輯運算功能的方法搞成極其簡明的方式,當然也就有助於各方面的應用發展。

2010年七月,我才開始設想『如何增建處理邏輯運算的功能進入系統?』的問題,自覺很容易實現這樣的設計。但是,那時只是初步的構思,只考慮仿照一般傳統程式語言的習慣,暫時僅融入『而且』(AND)與『或者』(OR)兩個單純指令。這篇文章則進行廣泛性的探討,包括如何給予適當的邏輯算子中文名稱?我個人認為,應該研究過它們在系統程式語言中之表達位置後,方給予適當的命名,才會比較恰當。讓指令的名稱符合語言上下文的啣接要求,這樣才能有助於設計出具有優良語法的程式系統。

一般而言,若只討論邏輯運算不同的名稱,基本邏輯運算的算子共有六個,它們是:

(1) AND (2) OR (3) XOR (4) NAND (5) NOR (6) NOT。

在FORTH程式語言中,邏輯算子(Operator)所需要的算元(Operand)操作對象,除了NOT只需要先行提供一個算元外,其他五個,都需要先將兩個算元操作對象放在堆疊上,然後才能執行邏輯運算。執行的結果都只得到唯一的狀態表示值,並將其留在堆疊上,供後續指令使用。換句話說,FORTH的邏輯運算,是一種後算符式的運算。1994年訂定的ANSI FORTH指令標準中,只將前三個當作標準基本指令,後三個可以導得,設計如下:


 
: NOT	 0=		;
: NAND AND NOT ;
: NOR OR NOT ;


如果單純的以1表示『真』,以0表示『假』,來製作一份邏輯運算真假值表,NOT不製表,原為1則得0,原為0則得1,其它的邏輯運算真假值表示如下:


上述全屬邏輯運算的原始性質定義,我們透過它來討論問題。

學過電子學上邏輯電路設計技術的人,一定知道,只要根據單一種邏輯閘,NAND或NOR僅擇其一,把它當作萬用基本邏輯閘,就可以設計出另外五種邏輯閘的知識。目前,市面上販售所謂的以NAND或以 NOR單種電路製造的快閃記憶體,大概也就是依據這個道理設計而成的。

事實上,在FORTH程式語言中,我們單純的只以軟體程式來設計,也一樣可以完成這種方式的設計,只不過是我們另得配合使用簡單的堆疊操作指令來達到目的。

我們若只以NAND當萬用基本指令來設計時,其它的五個是:


 
: NOT	( n – n ) 	  	DUP NAND ;
: OR ( n1 n2 – n ) DUP NAND SWAP DUP NAND NAND ;
: AND ( n1 n2 – n ) NAND DUP NAND ;
: NOR ( n1 n2 – n ) DUP NAND SWAP DUP NAND NAND DUP NAND ;
: XOR ( n1 n2 – n ) OVER OVER DUP NAND NAND –ROT SWAP DUP
NAND NAND NAND ;

我們若只以NOR當萬用基本指令來設計時,其它的五個是:


 
: NOT 	( n – n ) 		DUP NOR ;
: OR ( n1 n2 – n ) NOR DUP NOR ;
: AND ( n1 n2 – n ) DUP NOR SWAP DUP NOR NOR ;
: NAND ( n1 n2 – n ) DUP NOR SWAP DUP NOR NOR DUP NOR ;
: XOR ( n1 n2 - n ) OVER OVER DUP NOR NOR -ROT SWAP DUP
NOR NOR NOR DUP NOR ;


這些FORTH指令簡單易懂,是初學者很好的程式設計練習指令,而且上述設計方法不是唯一解答,您若有興趣試一試自己的本領,不妨就自己另搞一套,並自行摸出如何證明自己的設計絕對正確的辦法。這些整理出來的結果,也是當初發展出eforth系統前,曾經被仔細探討過的題材,是想要將FORTH反璞歸真前的一個重要程序。

有了這些根據,我們可以開始探討如何將這些功能全部加進ABC FORTH數學計算系統的問題了。在這個系統中,若以BASIC式的方式來設計程式,則『條件整合』用的邏輯運算,只會出現在條件分支指令組IF…THEN之間,一個典型的『而且』(AND)指令使用範例如下:

100 IF ( A > 5 ) AND ( B > 5 ) THEN 700

其中,( A > 5 ) 與( B > 5 )是兩個範例條件,本文只使用它們來代表一切可能的條件,是假設性的算元,AND便對這兩個條件進行邏輯運算,所得結果用來決定是否分支到THEN後面所指示的前往位置700去?改成中文程式則為:

100 如果 ( A > 5 ) 而且 ( B > 5 ) 前往 700

這樣的程式書寫方式,幾乎與我們中國人的語言表達方式完全一致了。有這麼重要的意義在其中,就更值得為其它另外五個邏輯運算指令,好好的設計出適當使用規則。另外一個『或者』(OR)指令,性質與『而且』(AND)相當,就照上述安排,成為標準的中算符指令使用方式,非常理想,由英文譯成中文的指令名稱也很恰當,不須要再進行任何修正。

這兩個指令,還有一項特點,也就是可以連續使用無限次於IF…THEN之間,用幾次都不成問題。因為每經過一次邏輯運算之後,都只留下一個邏輯狀態值,繼續以上列中算符方式安排在程式中時,便也能繼續與後續的新條件亦即算元操作對象進行邏輯運算,直到不算了為止,仍只得到唯一的結果,供給『前往』(THEN)指令使用。

另外的四個慣常邏輯運算指令,在英文環境的適當表達方式,則與中文有所不同,這是我從上述真假值對照表中看出來的問題。

當然,表達方式可以有很多種,只要使用方式合理,使用者使用時,可以覺得足夠友善,都可以作為設計的依據,而且對我而言,都很容易設計得出來。例如:我可以懶到根本就將所有的邏輯運算當作也是一種函數來考慮,那麼,六個邏輯運算,在程式中,就可以全部統一成前算符方式,使用於程式設計中。

我在ABC FORTH系統整數體系內所設計之『位元操作』應用方式的邏輯運算,就是前算符的格式,以便讓這六個指令可以呈現函數表示式的性質,如果在IF……THEN間的『條件整合』情況,繼續延用前算符規矩,程式就必須寫成下列格式:


 
AND 	( ( A > 5 )  ,  ( B > 5 ) )
OR ( ( A > 5 ) , ( B > 5 ) )
XOR ( ( A > 5 ) , ( B > 5 ) )
NAND ( ( A > 5 ) , ( B > 5 ) )
NOR ( ( A > 5 ) , ( B > 5 ) )
NOT ( A > 5 )


系統將這些函數式的邏輯算子執行完畢之後,都只得到一個唯一的狀態值,當然就能提供後續的THEN指令使用了。可是,這樣子使用之後,就完全失去了與人類語言直接對應的關係,結果就等同於傳統FORTH中的後算符使用方式,這兩種類型都與人類慣常語言完全不匹配。

另外還有一項因素,上述AND與OR兩個較完美中算符式的設計,也是一般傳統程式語言中所採用的格式,若不跟著以同樣的方式使用,想轉譯舊程式進入ABC FORTH系統時,就會產生困擾。因此,必須保留這兩個邏輯算子,成中算符的格式來使用。

其它的邏輯算子就不是這樣了,如果生平根本就不用英文思考問題,不必管它XOR、NAND、NOR、 NOT的實質意義為何?把這些算子都譯成『與…進行某種邏輯運算』,那麼,前三個指令就設計成也是中算符就很理想,例如:

( A > 5 ) XOR ( B > 5 )

表示條件( A > 5 ) 與條件( B > 5 )進行XOR邏輯運算

至於NOT,則只好維持原來FORTH後算符的方式了,我在ABC FORTH系統中,就將英文的邏輯運算指令,設計成這樣的使用格式,但深覺它忽略了中文,不尊重我們中國人的存在。

考慮在中文程式中使用這些邏輯運算指令時,若純用中文進行思考,便能夠深刻的體會出指令名稱、實質意義,與語言規格間的重要關聯。為顧全大局,要讓這四個指令都必須以『後算符』的格式來使用,才比較恰當。為什麼?請回頭仔細看看邏輯運算真假值對照表中顯示的各種狀態,您就可以明白其中的道理。

我在台灣讀過的書本中,幾乎所有與邏輯算子有關的譯名,大約都被固定的翻譯成非常怪異難懂的名稱了。『XOR』被譯成『互斥或』,『NAND』被譯成『反且』,『NOR』被譯成『反或』,『NOT』大概被譯成『非』吧。如果要拿這樣的譯名來設計中文程式,那我寧可不設計程式了,不信請讀一讀下列用法,看看您能不能直接讀出程式的意義來?

100 如果 ( A > 5 ) 互斥或 ( B > 5 ) 前往 700

講實在話,我讀不出來。

於是,我為這四個邏輯運算指令想好了比較一致、比較恰當的中文名稱,將它們都設計成後算符的使用格式,並且在兩個條件算元操作對象之間,添加一個逗號『 , 』當作分隔符號,完成了設計。此處再度複製一份真假值表,以便就近參考,請先行觀察四個指令在表中呈現的意義,然後再看看分別被譯成的適當中文名稱,對照如下:



 
XOR		一是一非
NAND 不為皆是
NOR 兩者皆非
NOT 不對


我在ABC FORTH系統中實現了這樣的設計,它們的使用規格則如下列:


 
100 如果 ( A > 5 ) , ( B > 5 ) 一是一非 前往 700
100 如果 ( A > 5 ) , ( B > 5 ) 不為皆是 前往 700
100 如果 ( A > 5 ) , ( B > 5 ) 兩者皆非 前往 700
100 如果 ( A > 5 ) 不對 前往 700


如此一來,這些邏輯運算就都符合我們的中文語法了,而且想進行連續邏輯運算的程式設計時,使用小括弧,清楚的將各個條件算元操作對象,按同樣格式區分開來,也能完成沒有次數限制的邏輯運算。以前,從未有人這樣子翻譯這四個邏輯算子的中文名稱,我現在則以邏輯算子在中文話語中的上下文關係,作為考慮基礎,譯名也包括了中文的直覺意義,可以通順的使用於程式語言中,這樣做算是創舉。

我在習慣於快速中文打字的操作後,已經不再認為:給予指令兩個字,例如:『不對』,會比只給單個字,例如:『非』,的譯名要差了。好的指令中文譯名,應該是清楚第一,通順至上。在以打字方式設計程式的作業環境中,字有幾筆、幾劃?更不重要,今人考慮的問題,早已與前人大不相同。

邏輯運算的功能,完全能應用在任何需要邏輯運算的場合,包括設計電子邏輯電路時的應用,使用者可以在未接觸硬體前,先以執行軟體程式的方式來實現。但是這種邏輯運算,屬於『位元操作』應用方式的邏輯運算,並非『條件整合』應用方式的邏輯運算。因此,在ABC FORTH數學計算系統中,就必須使用整數體系內的六個函數式的邏輯算子來設計程式,有別於此處探討的邏輯算子。

邏輯運算是數學運算中的一門分支,本文僅只處理了六種慣用邏輯算子,如果另有新的邏輯算子產生,隨時可以迎合要求,將其加入這個完全按照自己的理念設計出來的ABC FORTH數學計算系統。

我可以不堅持自己的譯名就是最好的選擇,大家若有更高明的見解,也可以經過討論後,重新設計進系統,這就是不必受制於人的好處,我們隨時辦得到。

這樣子的研究,純粹衝著我們中國人自己的文化而來,打從幾十年前開始學習電腦程式語言起,我心中便對中國人想使用電腦設計程式時,始終受制於西方文化設計出來的規範,感到忿忿不平,如果自己完全沒有能力在這方面進行改善,那就不必空談,只能拈香跟拜(台語,表示只能忍受一切羞辱,任人擺佈的意思)。

整理出這樣的研究,它的好處在那裡?完全無利可圖,所以何必曰利?但是,如果大家都不願正視這樣的研究,那麼,只好一輩子永遠拈香跟拜。

現在不一樣了,我早已習慣於在自己的電腦上大肆使用中文,譬如打文章、寫信、作記錄、看資料、看新聞、看程式…等等,我也有能力設計出可以完全只使用中文來當指令的程式語言,那麼,為什麼不更進一步的發展?也許我的個人研究不太成熟、不夠完美、不算甚麼,但是,至少我已經能夠這樣做了,上述的中文程式語言功能,我確確實實的實現了!而且,我會繼續思考,繼續努力,繼續設計,在數學計算系統方面,別人能做甚麼,我也絕對能設計得出對等功能的系統,性能還可以中文為主,並且直接超越別人的設計!

與數學計算相關的大部份實際程式中,必須使用到『條件整合』式邏輯算子的情況非常簡單,幾乎只要準備AND與OR的功能就夠了。在進行專家系統方面的程式設計時,反而更需要全部邏輯運算的功能,尤其是如果想用中文來設計專家系統時,除了要讓執行結果絕對符合專家資格,不出差錯外,對於日後的程式維護,也要講求精簡明確,那麼,這一篇文章內所強調的要點,就會很有價值。

沒有留言: