演算法與哲學
㈠ 哲學家就餐問題的演算法實現
操作系統並發和互斥:哲學家進餐問題和理發師問題
1. 哲學家進餐問題:
(1) 在什麼情況下5 個哲學家全部吃不上飯?
考慮兩種實現的方式,如下:
A.
演算法描述:
void philosopher(int i) /*i:哲學家編號,從0 到4*/
{
while (TRUE) {
think( ); /*哲學家正在思考*/
take_fork(i); /*取左側的筷子*/
take_fork((i+1) % N); /*取左側筷子;%為取模運算*/
eat( ); /*吃飯*/
put_fork(i); /*把左側筷子放回桌子*/
put_fork((i+1) % N); /*把右側筷子放回桌子*/
}
}
分析:假如所有的哲學家都同時拿起左側筷子,看到右側筷子不可用,又都放下左側筷子,
等一會兒,又同時拿起左側筷子,如此這般,永遠重復。對於這種情況,即所有的程序都在
無限期地運行,但是都無法取得任何進展,即出現飢餓,所有哲學家都吃不上飯。
B.
演算法描述:
規定在拿到左側的筷子後,先檢查右面的筷子是否可用。如果不可用,則先放下左側筷子,
等一段時間再重復整個過程。
分析:當出現以下情形,在某一個瞬間,所有的哲學家都同時啟動這個演算法,拿起左側的筷
子,而看到右側筷子不可用,又都放下左側筷子,等一會兒,又同時拿起左側筷子……如此
這樣永遠重復下去。對於這種情況,所有的程序都在運行,但卻無法取得進展,即出現飢餓,
所有的哲學家都吃不上飯。
(2) 描述一種沒有人餓死(永遠拿不到筷子)演算法。
考慮了四種實現的方式(A、B、C、D):
A.原理:至多隻允許四個哲學家同時進餐,以保證至少有一個哲學家能夠進餐,最終總會釋
放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。以下將room 作為信號量,只允
許4 個哲學家同時進入餐廳就餐,這樣就能保證至少有一個哲學家可以就餐,而申請進入
餐廳的哲學家進入room 的等待隊列,根據FIFO 的原則,總會進入到餐廳就餐,因此不會
出現餓死和死鎖的現象。
偽碼:
semaphore chopstick[5]={1,1,1,1,1};
semaphore room=4;
void philosopher(int i)
{
while(true)
{
think();
wait(room); //請求進入房間進餐
wait(chopstick[i]); //請求左手邊的筷子
wait(chopstick[(i+1)%5]); //請求右手邊的筷子
eat();
signal(chopstick[(i+1)%5]); //釋放右手邊的筷子
signal(chopstick[i]); //釋放左手邊的筷子
signal(room); //退出房間釋放信號量room
}
}
B.原理:僅當哲學家的左右兩支筷子都可用時,才允許他拿起筷子進餐。
方法1:利用AND 型信號量機制實現:根據課程講述,在一個原語中,將一段代碼同時需
要的多個臨界資源,要麼全部分配給它,要麼一個都不分配,因此不會出現死鎖的情形。當
某些資源不夠時阻塞調用進程;由於等待隊列的存在,使得對資源的請求滿足FIFO 的要求,
因此不會出現飢餓的情形。
偽碼:
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int I)
{
while(true)
{
think();
Swait(chopstick[(I+1)]%5,chopstick[I]);
eat();
Ssignal(chopstick[(I+1)]%5,chopstick[I]);
}
}
方法2:利用信號量的保護機制實現。通過信號量mutex對eat()之前的取左側和右側筷
子的操作進行保護,使之成為一個原子操作,這樣可以防止死鎖的出現。
偽碼:
semaphore mutex = 1 ;
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int I)
{
while(true)
{
think();
wait(mutex);
wait(chopstick[(I+1)]%5);
wait(chopstick[I]);
signal(mutex);
eat();
signal(chopstick[(I+1)]%5);
signal(chopstick[I]);
}
}
C. 原理:規定奇數號的哲學家先拿起他左邊的筷子,然後再去拿他右邊的筷子;而偶數號
的哲學家則相反.按此規定,將是1,2號哲學家競爭1號筷子,3,4號哲學家競爭3號筷子.即
五個哲學家都競爭奇數號筷子,獲得後,再去競爭偶數號筷子,最後總會有一個哲學家能獲
得兩支筷子而進餐。而申請不到的哲學家進入阻塞等待隊列,根FIFO原則,則先申請的哲
學家會較先可以吃飯,因此不會出現餓死的哲學家。
偽碼:
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{
while(true)
{
think();
if(i%2 == 0) //偶數哲學家,先右後左。
{
wait (chopstick[ i + 1 ] mod 5) ;
wait (chopstick[ i]) ;
eat();
signal (chopstick[ i + 1 ] mod 5) ;
signal (chopstick[ i]) ;
}
Else //奇數哲學家,先左後右。
{
wait (chopstick[ i]) ;
wait (chopstick[ i + 1 ] mod 5) ;
eat();
signal (chopstick[ i]) ;
signal (chopstick[ i + 1 ] mod 5) ;
}
}
D.利用管程機制實現(最終該實現是失敗的,見以下分析):
原理:不是對每隻筷子設置信號量,而是對每個哲學家設置信號量。test()函數有以下作
用:
a. 如果當前處理的哲學家處於飢餓狀態且兩側哲學家不在吃飯狀態,則當前哲學家通過
test()函數試圖進入吃飯狀態。
b. 如果通過test()進入吃飯狀態不成功,那麼當前哲學家就在該信號量阻塞等待,直到
其他的哲學家進程通過test()將該哲學家的狀態設置為EATING。
c. 當一個哲學家進程調用put_forks()放下筷子的時候,會通過test()測試它的鄰居,
如果鄰居處於飢餓狀態,且該鄰居的鄰居不在吃飯狀態,則該鄰居進入吃飯狀態。
由上所述,該演算法不會出現死鎖,因為一個哲學家只有在兩個鄰座都不在進餐時,才允
許轉換到進餐狀態。
該演算法會出現某個哲學家適終無法吃飯的情況,即當該哲學家的左右兩個哲學家交替
處在吃飯的狀態的時候,則該哲學家始終無法進入吃飯的狀態,因此不滿足題目的要求。
但是該演算法能夠實現對於任意多位哲學家的情況都能獲得最大的並行度,因此具有重要
的意義。
偽碼:
#define N 5 /* 哲學家人數*/
#define LEFT (i-1+N)%N /* i的左鄰號碼 */
#define RIGHT (i+1)%N /* i的右鄰號碼 */
typedef enum { THINKING, HUNGRY, EATING } phil_state; /*哲學家狀態*/
monitor dp /*管程*/
{
phil_state state[N];
semaphore mutex =1;
semaphore s[N]; /*每個哲學家一個信號量,初始值為0*/
void test(int i)
{
if ( state[i] == HUNGRY &&state[LEFT(i)] != EATING &&
state[RIGHT(i)] != EATING )
{
state[i] = EATING;
V(s[i]);
}
}
void get_forks(int i)
{
P(mutex);
state[i] = HUNGRY;
test(i); /*試圖得到兩支筷子*/
V(mutex);
P(s[i]); /*得不到筷子則阻塞*/
}
void put_forks(int i)
{
P(mutex);
state[i]= THINKING;
test(LEFT(i)); /*看左鄰是否進餐*/
test(RIGHT(i)); /*看右鄰是否進餐*/
V(mutex);
}
}
哲學家進程如下:
void philosopher(int process)
{
while(true)
{
think();
get_forks(process);
eat();
put_forks(process);
}
}
2.理發師問題:一個理發店有一個入口和一個出口。理發店內有一個可站5 位顧客的站席
區、4 個單人沙發、3 個理發師及其專用理發工具、一個收銀台。新來的顧客坐在沙發上等
待;沒有空沙發時,可在站席區等待;站席區滿時,只能在入口外等待。理發師可從事理
發、收銀和休息三種活動。理發店的活動滿足下列條件:
1)休息的理發師是坐地自己專用的理發椅上,不會佔用顧客的沙發;
2)處理休息狀態的理發師可為在沙發上等待時間最長的顧客理發;
3)理發時間長短由理發師決定;
4)在站席區等待時間最長的顧客可坐到空閑的理發上;
5)任何時刻最多隻能有一個理發師在收銀。
試用信號量機制或管程機制實現理發師進程和顧客進程。
原理:
(1)customer 進程:
首先檢查站席區是否已滿(stand_capacity),若滿選擇離開,否則進入站席區,即進入
理發店。在站席區等待沙發的空位(信號量sofa),如果沙發已滿,則進入阻塞等待隊列,
直到出現空位,在站席區中等待時間最長的顧客離開站席區(stand_capacity)。坐到沙
發上,等待理發椅(barber_chair),如果理發椅已滿,則進入阻塞等待隊列,直到出現
空位,在沙發上等待時間最長的顧客離開沙發(釋放信號量sofa)。坐到理發椅上,釋放
准備好的信號(customer_ready),獲得該理發師的編號(0~1 的數字)。等待理發師理
發結束(finished[barber_number])。在離開理發椅之前付款(payment),等待收據
(receipt),離開理發椅(leave_barberchair)。最後離開理發店。
這里需要注意幾點:
a) 首先是幾個需要進行互斥處理的地方,主要包括:進入站席區、進入沙發、進入理發椅
和付款幾個地方。
b) 通過barber_chair 保證一個理發椅上最多隻有一名顧客。但這也不夠,因為單憑
baber_chair 無法保證一名顧客離開理發椅之前,另一位顧客不會坐到該理發椅上,
因此增加信號量leave_barberchair,讓顧客離開理發椅後,釋放該信號,而理發
師接收到該信號後才釋放barber_chair 等待下一位顧客。
c) 在理發的過程中,需要保證是自己理發完畢,才能夠進行下面的付款、離開理發椅的活
動。這個機制是通過customer 進程獲得給他理發的理發師編號來實現的,這樣,當
該編號的理發師釋放對應的finished[i]信號的時候,該顧客才理發完畢。
d) 理發師是通過mutex 信號量保證他們每個人同時只進行一項操作(理發或者收款)。
e) 為了保證該顧客理發完畢後馬上可以付款離開,就應該保證給該顧客理發的理發師在理
發完畢後馬上到收銀台進入收款操作而不是給下一位顧客服務。在偽碼中由以下機制實
現:即顧客在釋放離開理發椅的信號前,發出付款的信號。這樣該理發師得不到顧客的
離開理發椅的信號,不能進入下一個循環為下一名顧客服務,而只能進入收款台的收款
操作。直到顧客接到收據後,才釋放離開理發椅的信號,離開理發椅,讓理發師釋放該
理發椅的信號,讓下一位等待的顧客坐到理發椅上。
(2)barber 進程
首先將該理發師的編號壓入隊列,供顧客提取。等待顧客坐到理發椅坐好(信號量
customer_ready),開始理發,理發結束後釋放結束信號(finished[i])。等待顧客
離開理發椅(leave_barberchair)(期間去收銀台進行收款活動),釋放理發椅空閑信
號(barber_chair),等待下一位顧客坐上來。
(3)cash(收銀台)進程
等待顧客付款(payment),執行收款操作,收款操作結束,給付收據(receipt)。
信號量總表:
信號量 wait signal
stand_capacity 顧客等待進入理發店 顧客離開站席區
sofa 顧客等待坐到沙發 顧客離開沙發
barber_chair 顧客等待空理發椅 理發師釋放空理發椅
customer_ready 理發師等待,直到一個顧客坐
到理發椅
顧客坐到理發椅上,給理發師
發出信號
mutex 等待理發師空閑,執行理發或
收款操作
理發師執行理發或收款結束,
進入空閑狀態
mutex1 執行入隊或出隊等待 入隊或出隊結束,釋放信號
finished[i] 顧客等待對應編號理發師理
發結束
理發師理發結束,釋放信號
leave_barberchair 理發師等待顧客離開理發椅 顧客付款完畢得到收據,離開
理發椅釋放信號
payment 收銀員等待顧客付款 顧客付款,發出信號
receipt 顧客等待收銀員收、開具收據收銀員收款結束、開具收據,
釋放信號
偽碼:
semaphore stand_capacity=5;
semaphore sofa=4;
semaphore barber_chair=3;
semaphore customer_ready=0;
semaphore mutex=3;
semaphore mutex1=1;
semaphore finished[3]={0,0,0};
semaphore leave_barberchair=0;
semaphore payment=0;
semaphore receipt=0;
void customer()
{
int barber_number;
wait(stand_capacity); //等待進入理發店
enter_room(); //進入理發店
wait(sofa); //等待沙發
leave_stand_section(); //離開站席區
signal(stand_capacity);
sit_on_sofa(); //坐在沙發上
wait(barber_chair); //等待理發椅
get_up_sofa(); //離開沙發
signal(sofa);
wait(mutex1);
sit_on_barberchair(); //坐到理發椅上
signal(customer_ready);
barber_number=dequeue(); //得到理發師編號
signal(mutex1);
wait(finished[barber_number]); //等待理發結束
pay(); //付款
signal(payment); //付款
wait(receipt); //等待收據
get_up_barberchair(); //離開理發椅
signal(leave_barberchair); //發出離開理發椅信號
exit_shop(); //了離開理發店
}
void barber(int i)
{
while(true)
{
wait(mutex1);
enqueue(i); //將該理發師的編號加入隊列
signal(mutex1);
wait(customer_ready); //等待顧客准備好
wait(mutex);
cut_hair(); //理發
signal(mutex);
signal(finished[i]); //理發結束
wait(leave_barberchair); //等待顧客離開理發椅信號
signal(barber_chair); //釋放barber_chair 信號
}
}
void cash() //收銀
{
while(true)
{
wait(payment); //等待顧客付款
wait(mutex); //原子操作
get_pay(); //接受付款
give_receipt(); //給顧客收據
signal(mutex);
signal(receipt); //收銀完畢,釋放信號
}
}
分析:
在分析該問題過程中,出現若干問題,是參閱相關資料後才認識到這些問題的隱蔽性和嚴重
性的,主要包括:
(1)在顧客進程,如果是在釋放leave_barberchair 信號之後進行付款動作的話,很
容易造成沒有收銀員為其收款的情形, 原因是: 為該顧客理發的理發師收到
leave_barberchair 信號後,釋放barber_chair 信號,另外一名顧客坐到理發椅上,
該理發師有可能為這另外一名顧客理發,而沒有為剛理完發的顧客收款。為解決這個問題,
就是採取在釋放leave_barberchair 信號之前,完成付款操作。這樣該理發師無法進入
下一輪循環為另外顧客服務,只能到收銀台收款。
(2)本演算法是通過給理發師編號的方式,當顧客坐到某理發椅上也同時獲得理發師的編號,
如此,當該理發師理發結束,釋放信號,顧客只有接收到為其理發的理發師的理發結束信號
才會進行付款等操作。這樣實現,是為避免這樣的錯誤,即:如果僅用一個finished 信
號量的話,很容易出現別的理發師理發完畢釋放了finished 信號,把正在理發的這位顧
客趕去付款,而已經理完發的顧客卻被阻塞在理發椅上的情形。當然也可以為顧客進行編
號,讓理發師獲取他理發的顧客的編號,但這樣就會限制顧客的數量,因為finished[]
數組不能是無限的。而為理發師編號,則只需要三個元素即可。
3.參考文獻:
左金平 計算機操作系統中哲學家進餐問題探究。
參考教材 操作系統—內核與設計原理
㈡ 現代計算機技術的二進制演算法和《周易》有什麼關系
二進制記數法是用0和1兩個數碼來表示數目的方法,它的基數為2,進位規則是「逢二進一」,例如十進制中的「2」,在二進制中表示為「10」,十進制中的「3」表示為「11」等等。現代的計算機技術就是以二進制演算法為基礎產生和發展起來的。
總結:據說,萊布尼茨對二進制與《周易》中卦象的相似之處非常吃驚,他也深信《周易》在數學上的意義,認為《周易》八卦可以用二進制來解釋。不過,我們不能因為由陰爻、陽爻組成的卦象與二進制有暗合之處,就說二進制起源於《周易》。
實際上,萊布尼茨也並非看到《周易》之後才發明了二進制,他在發明二進制的同時,還設計了一台可以完成二進制數碼計算的機器。
可以說,二進制進行加減乘除計算的用途以及與其他進制換算的特點,也是《周易》八卦所不具備的。因此,客觀說來,《周易》中的爻卦與二進制有暗合之處,很可能為數學家提供了某些靈感,而《周易》所代表的中國古代智慧與現代的科學哲學的確有著某些相通的地方,只不過並不一定體現為二進制罷了。
㈢ 如何加強學生對演算法和算理的理解
算理是算的一種道理和想法,而演算法是算理的一種表達形式或書寫格式,算理要通過演算法來表現,演算法又要體現算理。在新課程的教學中,特別突出對算理的理解,追求演算法多樣化,在處理算理和演算法的關系時有偏向了算理,究竟如何把握兩者之間的關系,使起和諧平衡發展談幾點看法。
一、讓學生在自主探究中構建算理。學生在用已有經驗解決問題時,教師應為學生提供探索的空間,交流的平台,在交流中明白一個個算理,從而發展學生的思考能力。
二、展示多種算理時要找到突破口。在交流多種想法時,教師要善於抓住恰當的一種作為切入口,大部分學生容易理解的進行突破。
三、注重算理和演算法之間的溝通。算理是演算法的基礎,當學生明白了算理後,教師應及時落實兩者之間的關系,有利於對演算法的掌握。
四、基本演算法要強化訓練。在多種演算法中有基本的演算法,所以對基本的演算法有必要進行強化,規范,示範,努力使每一個學生都會。
其實個人認為這兩個關系如同哲學中主觀與客觀關系一樣,兩者都不可費,兩者相輔相成,這兩者關系是辨證的,關鍵在教學中要重視溝通。
㈣ 哲學家進餐問題的演算法與實現
1.哲學家進餐問題:
(1) 在什麼情況下5 個哲學家全部吃不上飯考慮兩種實現的方式,如下:
A. 演算法描述: void philosopher(int i) /*i:哲學家編號,從0 到4*/ {while (TRUE) { think( ); /*哲學家正在思考*/ take_fork(i); /*取左側的筷子*/ take_fork((i+1) % N); /*取左側筷子;%為取模運算*/eat( ); /*吃飯*/put_fork(i); /*把左側筷子放回桌子*/ put_fork((i+1) % N); /*把右側筷子放回桌子*/ } } 分析:假如所有的哲學家都同時拿起左側筷子,看到右側筷子不可用,又都放下左側筷子,等一會兒,又同時拿起左側筷子,如此這般,永遠重復。對於這種情況,即所有的程序都在無限期地運行,但是都無法取得任何進展,即出現飢餓,所有哲學家都吃不上飯。
B.演算法描述:規定在拿到左側的筷子後,先檢查右面的筷子是否可用。如果不可用,則先放下左側筷子,等一段時間再重復整個過程。分析:當出現以下情形,在某一個瞬間,所有的哲學家都同時啟動這個演算法,拿起左側的筷子,而看到右側筷子不可用,又都放下左側筷子,等一會兒,又同時拿起左側筷子……如此這樣永遠重復下去。對於這種情況,所有的程序都在運行,但卻無法取得進展,即出現飢餓,所有的哲學家都吃不上飯。
(2) 描述一種沒有人餓死(永遠拿不到筷子)演算法。考慮了四種實現的方式(A、B、C、D):
A.原理:至多隻允許四個哲學家同時進餐,以保證至少有一個哲學家能夠進餐,最終總會釋放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。以下將room 作為信號量,只允許4 個哲學家同時進入餐廳就餐,這樣就能保證至少有一個哲學家可以就餐,而申請進入餐廳的哲學家進入room 的等待隊列,根據FIFO 的原則,總會進入到餐廳就餐,因此不會出現餓死和死鎖的現象。
偽碼: semaphore chopstick[5]={1,1,1,1,1}; semaphore room=4; void philosopher(int i) { while(true) {think(); wait(room); //請求進入房間進餐 wait(chopstick[i]); //請求左手邊的筷子 wait(chopstick[(i+1)%5]); //請求右手邊的筷子 eat(); signal(chopstick[(i+1)%5]); //釋放右手邊的筷子 signal(chopstick[i]); //釋放左手邊的筷子 signal(room); //退出房間釋放信號量room } }
B.原理:僅當哲學家的左右兩支筷子都可用時,才允許他拿起筷子進餐。
方法1:利用AND 型信號量機制實現:根據課程講述,在一個原語中,將一段代碼同時需要的多個臨界資源,要麼全部分配給它,要麼一個都不分配,因此不會出現死鎖的情形。當某些資源不夠時阻塞調用進程;由於等待隊列的存在,使得對資源的請求滿足FIFO 的要求,因此不會出現飢餓的情形。
偽碼: semaphore chopstick[5]={1,1,1,1,1}; void philosopher(int I) { while(true) { think();Swait(chopstick[(I+1)]%5,chopstick[I]); eat(); Ssignal(chopstick[(I+1)]%5,chopstick[I]);} } 方法2:利用信號量的保護機制實現。通過信號量mutex對eat()之前的取左側和右側筷子的操作進行保護,使之成為一個原子操作,這樣可以防止死鎖的出現。偽碼: semaphore mutex = 1 ; semaphorechopstick[5]={1,1,1,1,1};void philosopher(int I) { while(true) { think(); wait(mutex);wait(chopstick[(I+1)]%5); wait(chopstick[I]); signal(mutex); eat();signal(chopstick[(I+1)]%5); signal(chopstick[I]); } }
C.原理:規定奇數號的哲學家先拿起他左邊的筷子,然後再去拿他右邊的筷子;而偶數號的哲學家則相反.按此規定,將是1,2號哲學家競爭1號筷子,3,4號哲學家競爭3號筷子.即五個哲學家都競爭奇數號筷子,獲得後,再去競爭偶數號筷子,最後總會有一個哲學家能獲得兩支筷子而進餐。而申請不到的哲學家進入阻塞等待隊列,根FIFO原則,則先申請的哲學家會較先可以吃飯,因此不會出現餓死的哲學家。
偽碼: semaphore chopstick[5]={1,1,1,1,1}; void philosopher(int i) { while(true) { think(); if(i%2== 0) //偶數哲學家,先右後左。 { wait (chopstick[ i + 1 ] mod 5) ; wait (chopstick[ i]) ;eat(); signal (chopstick[ i + 1 ] mod 5) ; signal (chopstick[ i]) ; } Else //奇數哲學家,先左後右。 { wait (chopstick[ i]) ; wait (chopstick[ i +1 ] mod 5) ; eat(); signal (chopstick[ i]) ; signal (chopstick[ i + 1 ] mod 5); } }
D.利用管程機制實現(最終該實現是失敗的,見以下分析):原理:不是對每隻筷子設置信號量,而是對每個哲學家設置信號量。test()函數有以下作用:
a. 如果當前處理的哲學家處於飢餓狀態且兩側哲學家不在吃飯狀態,則當前哲學家通過 test()函數試圖進入吃飯狀態。
b. 如果通過test()進入吃飯狀態不成功,那麼當前哲學家就在該信號量阻塞等待,直到其他的哲學家進程通過test()將該哲學家的狀態設置為EATING。
c. 當一個哲學家進程調用put_forks()放下筷子的時候,會通過test()測試它的鄰居,如果鄰居處於飢餓狀態,且該鄰居的鄰居不在吃飯狀態,則該鄰居進入吃飯狀態。由上所述,該演算法不會出現死鎖,因為一個哲學家只有在兩個鄰座都不在進餐時,才允許轉換到進餐狀態。該演算法會出現某個哲學家適終無法吃飯的情況,即當該哲學家的左右兩個哲學家交替處在吃飯的狀態的時候,則該哲學家始終無法進入吃飯的狀態,因此不滿足題目的要求。但是該演算法能夠實現對於任意多位哲學家的情況都能獲得最大的並行度,因此具有重要的意義。
偽碼:#define N 5 /* 哲學家人數*/#define LEFT (i-1+N)%N /* i的左鄰號碼 */ #define RIGHT (i+1)%N /* i的右鄰號碼 */ typedef enum { THINKING, HUNGRY, EATING } phil_state; /*哲學家狀態*/ monitor dp /*管程*/ { phil_state state[N]; semaphore mutex =1; semaphore s[N];/*每個哲學家一個信號量,初始值為0*/void test(int i) { if ( state[i] == HUNGRY &&state[LEFT(i)] != EATING&& state[RIGHT(i)] != EATING ) { state[i] = EATING; V(s[i]); } } void get_forks(inti) { P(mutex); state[i] = HUNGRY; test(i); /*試圖得到兩支筷子*/ V(mutex); P(s[i]); /*得不到筷子則阻塞*/ } void put_forks(int i) { P(mutex); state[i]= THINKING;test(LEFT(i)); /*看左鄰是否進餐*/ test(RIGHT(i)); /*看右鄰是否進餐*/ V(mutex); } } 哲學家進程如下: void philosopher(int process) { while(true) { think();get_forks(process); eat(); put_forks(process); } }
2.理發師問題:一個理發店有一個入口和一個出口。理發店內有一個可站5 位顧客的站席區、4 個單人沙發、3 個理發師及其專用理發工具、一個收銀台。新來的顧客坐在沙發上等待;沒有空沙發時,可在站席區等待;站席區滿時,只能在入口外等待。理發師可從事理發、收銀和休息三種活動。
理發店的活動滿足下列條件:
1)休息的理發師是坐地自己專用的理發椅上,不會佔用顧客的沙發;
2)處理休息狀態的理發師可為在沙發上等待時間最長的顧客理發;
3)理發時間長短由理發師決定;
4)在站席區等待時間最長的顧客可坐到空閑的理發上;
5)任何時刻最多隻能有一個理發師在收銀。試用信號量機制或管程機制實現理發師進程和顧客進程。
原理:
(1) customer 進程:首先檢查站席區是否已滿(stand_capacity),若滿選擇離開,否則進入站席區,即進入理發店。在站席區等待沙發的空位(信號量sofa),如果沙發已滿,則進入阻塞等待隊列,直到出現空位,在站席區中等待時間最長的顧客離開站席區(stand_capacity)。坐到沙發上,等待理發椅(barber_chair),如果理發椅已滿,則進入阻塞等待隊列,直到出現空位,在沙發上等待時間最長的顧客離開沙發(釋放信號量sofa)。坐到理發椅上,釋放准備好的信號(customer_ready),獲得該理發師的編號(0~1 的數字)。等待理發師理發結束(finished[barber_number])。在離開理發椅之前付款(payment),等待收據 (receipt),離開理發椅(leave_barberchair)。最後離開理發店。
這里需要注意幾點:
a) 首先是幾個需要進行互斥處理的地方,主要包括:進入站席區、進入沙發、進入理發椅和付款幾個地方。
b) 通過barber_chair保證一個理發椅上最多隻有一名顧客。但這也不夠,因為單憑 baber_chair 無法保證一名顧客離開理發椅之前,另一位顧客不會坐到該理發椅上,因此增加信號量leave_barberchair,讓顧客離開理發椅後,釋放該信號,而理發師接收到該信號後才釋放barber_chair 等待下一位顧客。
c) 在理發的過程中,需要保證是自己理發完畢,才能夠進行下面的付款、離開理發椅的活動。這個機制是通過customer 進程獲得給他理發的理發師編號來實現的,這樣,當該編號的理發師釋放對應的finished[i]信號的時候,該顧客才理發完畢。
d) 理發師是通過mutex 信號量保證他們每個人同時只進行一項操作(理發或者收款)。
e) 為了保證該顧客理發完畢後馬上可以付款離開,就應該保證給該顧客理發的理發師在理發完畢後馬上到收銀台進入收款操作而不是給下一位顧客服務。在偽碼中由以下機制實現:即顧客在釋放離開理發椅的信號前,發出付款的信號。這樣該理發師得不到顧客的離開理發椅的信號,不能進入下一個循環為下一名顧客服務,而只能進入收款台的收款操作。直到顧客接到收據後,才釋放離開理發椅的信號,離開理發椅,讓理發師釋放該理發椅的信號,讓下一位等待的顧客坐到理發椅上。
(2)barber 進程首先將該理發師的編號壓入隊列,供顧客提取。等待顧客坐到理發椅坐好(信號量 customer_ready),開始理發,理發結束後釋放結束信號(finished[i])。等待顧客離開理發椅(leave_barberchair)(期間去收銀台進行收款活動),釋放理發椅空閑信號(barber_chair),等待下一位顧客坐上來。
(3)cash(收銀台)進程等待顧客付款(payment),執行收款操作,收款操作結束,給付收據(receipt)。信號量總表:信號量 waitsignal stand_capacity 顧客等待進入理發店顧客離開站席區 sofa 顧客等待坐到沙發顧客離開沙發 barber_chair 顧客等待空理發椅理發師釋放空理發椅 customer_ready 理發師等待,直到一個顧客坐到理發椅顧客坐到理發椅上,給理發師發出信號 mutex 等待理發師空閑,執行理發或收款操作理發師執行理發或收款結束,進入空閑狀態 mutex1執行入隊或出隊等待入隊或出隊結束,釋放信號 finished[i] 顧客等待對應編號理發師理發結束理發師理發結束,釋放信號 leave_barberchair 理發師等待顧客離開理發椅顧客付款完畢得到收據,離開理發椅釋放信號 payment 收銀員等待顧客付款顧客付款,發出信號 receipt 顧客等待收銀員收、開具收據收銀員收款結束、開具收據,釋放信號
偽碼: semaphore stand_capacity=5; semaphore sofa=4; semaphorebarber_chair=3; semaphore customer_ready=0; semaphore mutex=3; semaphoremutex1=1; semaphore finished[3]={0,0,0}; semaphore leave_barberchair=0;semaphore payment=0; semaphore receipt=0; void customer() { int barber_number;wait(stand_capacity); //等待進入理發店 enter_room(); //進入理發店 wait(sofa); //等待沙發 leave_stand_section(); //離開站席區 signal(stand_capacity); sit_on_sofa(); //坐在沙發上 wait(barber_chair); //等待理發椅 get_up_sofa(); //離開沙發 signal(sofa); wait(mutex1);sit_on_barberchair(); //坐到理發椅上 signal(customer_ready); barber_number=dequeue(); //得到理發師編號 signal(mutex1); wait(finished[barber_number]);//等待理發結束 pay(); //付款 signal(payment); //付款 wait(receipt); //等待收據 get_up_barberchair(); //離開理發椅 signal(leave_barberchair); //發出離開理發椅信號 exit_shop(); //了離開理發店 } void barber(int i) { while(true) { wait(mutex1);enqueue(i); //將該理發師的編號加入隊列 signal(mutex1); wait(customer_ready); //等待顧客准備好 wait(mutex); cut_hair(); //理發 signal(mutex); signal(finished[i]); //理發結束 wait(leave_barberchair); //等待顧客離開理發椅信號 signal(barber_chair); //釋放barber_chair 信號 } } void cash() //收銀 { while(true) { wait(payment); //等待顧客付款 wait(mutex); //原子操作 get_pay(); //接受付款 give_receipt(); //給顧客收據 signal(mutex); signal(receipt); //收銀完畢,釋放信號 } }
分析:在分析該問題過程中,出現若干問題,是參閱相關資料後才認識到這些問題的隱蔽性和嚴重性的,主要包括:
(1)在顧客進程,如果是在釋放leave_barberchair 信號之後進行付款動作的話,很容易造成沒有收銀員為其收款的情形,原因是:為該顧客理發的理發師收到 leave_barberchair 信號後,釋放barber_chair 信號,另外一名顧客坐到理發椅上,該理發師有可能為這另外一名顧客理發,而沒有為剛理完發的顧客收款。為解決這個問題,就是採取在釋放leave_barberchair 信號之前,完成付款操作。這樣該理發師無法進入下一輪循環為另外顧客服務,只能到收銀台收款。
(2)本演算法是通過給理發師編號的方式,當顧客坐到某理發椅上也同時獲得理發師的編號,如此,當該理發師理發結束,釋放信號,顧客只有接收到為其理發的理發師的理發結束信號才會進行付款等操作。這樣實現,是為避免這樣的錯誤,即:如果僅用一個finished 信號量的話,很容易出現別的理發師理發完畢釋放了finished 信號,把正在理發的這位顧客趕去付款,而已經理完發的顧客卻被阻塞在理發椅上的情形。當然也可以為顧客進行編號,讓理發師獲取他理發的顧客的編號,但這樣就會限制顧客的數量,因為finished[] 數組不能是無限的。而為理發師編號,則只需要三個元素即可。
㈤ 為什麼中國古代數學會形成演算法思想它對後世的影響如何
數學的發展包括了兩大主要活動:證明定理和創造演算法。定理證明是希臘人首倡,後構成數學發展中演繹傾向的脊樑;演算法創造昌盛於古代和中世紀的中國、印度,形成了數學發展中強烈的演算法傾向。統觀數學的歷史將會發現,數學的發展並非總是演繹傾向獨占鰲頭。在數學史上,演算法傾向與演繹傾向總是交替地取得主導地位。古代巴比倫和埃及式的原始演算法時期,被希臘式的演繹幾何所接替,而在中世紀,希臘數學衰落下去,演算法傾向在中國、印度等東方國度繁榮起來;東方數學在文藝復興前夕通過阿拉伯傳播到歐洲,對近代數學興起產生了深刻影響。事實上,作為近代數學誕生標志的解析幾何與微積分,從思想方法的淵源看都不能說是演繹傾向而是演算法傾向的產物。
從微積分的歷史可以知道,微積分的產生是尋找解決一系列實際問題的普遍演算法的結果6。這些問題包括:決定物體的瞬時速度、求極大值與極小值、求曲線的切線、求物體的重心及引力、面積與體積計算等。從16世紀中開始的100多年間,許多大數學家都致力於獲得解決這些問題的特殊演算法。牛頓與萊布尼茲的功績是在於將這些特殊的演算法統一成兩類基本運算——微分與積分,並進一步指出了它們的互逆關系。無論是牛頓的先驅者還是牛頓本人,他們所使用的演算法都是不嚴格的,都沒有完整的演繹推導。牛頓的流數術在邏輯上的瑕疵更是眾所周知。對當時的學者來說,首要的是找到行之有效的演算法,而不是演算法的證明。這種傾向一直延續到18世紀。18世紀的數學家也往往不管微積分基礎的困難而大膽前進。如泰勒公式,歐拉、伯努利甚至19世紀初傅里葉所發現的三角展開等,都是在很長時期內缺乏嚴格的證明。正如馮·諾伊曼指出的那樣:沒有一個數學家會把這一時期的發展看作是異端邪道;這個時期產生的數學成果被公認為第一流的。並且反過來,如果當時的數學家一定要在有了嚴密的演繹證明之後才承認新演算法的合理性,那就不會有今天的微積分和整個分析大廈了。
現在再來看一看更早的解析幾何的誕生。通常認為,笛卡兒發明解析幾何的基本思想,是用代數方法來解幾何問題。這同歐氏演繹方法已經大相徑庭了。而事實上如果我們去閱讀笛卡兒的原著,就會發現貫穿於其中的徹底的演算法精神。《幾何學》開宗明義就宣稱:「我將毫不猶豫地在幾何學中引進算術的術語,以便使自己變得更加聰明」。眾所周知,笛卡兒的《幾何學》是他的哲學著作《方法論》的附錄。笛卡兒在他另一部生前未正式發表的哲學著作《指導思維的法則》(簡稱《法則》)中曾強烈批判了傳統的主要是希臘的研究方法,認為古希臘人的演繹推理只能用來證明已經知道的事物,「卻不能幫助我們發現未知的事情」。因此他提出「需要一種發現真理的方法」,並稱之為「通用數學」(mathesis universakis)。笛卡兒在《法則》中描述了這種通用數學的藍圖,他提出的大膽計劃,概而言之就是要將一切科學問題轉化為求解代數方程的數學問題:
任何問題→數學問題→代數問題→方程求解而笛卡兒的《幾何學》,正是他上述方案的一個具體實施和示範,解析幾何在整個方案中扮演著重要的工具作用,它將一切幾何問題化為代數問題,這些代數問題則可以用一種簡單的、幾乎自動的或者毋寧說是機械的方法去解決。這與上面介紹的古代中國數學家解決問題的路線可以說是一脈相承。
因此我們完全有理由說,在從文藝復興到17世紀近代數學興起的大潮中,回響著東方數學特別是中國數學的韻律。整個17—18世紀應該看成是尋求無窮小演算法的英雄年代,盡管這一時期的無窮小演算法與中世紀演算法相比有質的飛躍。而從19世紀特別是70年代直到20世紀中,演繹傾向又重新在比希臘幾何高得多的水準上占據了優勢。因此,數學的發展呈現出演算法創造與演繹證明兩大主流交替繁榮、螺旋式上升過程:
演繹傳統——定理證明活動
演算法傳統——演算法創造活動
中國古代數學家對演算法傳統的形成與發展做出了毋容置疑的巨大貢獻。
我們強調中國古代數學的演算法傳統,並不意味中國古代數學中沒有演繹傾向。事實上,在魏晉南北朝時期一些數學家的工作中,已出現具有相當深度的論證思想。如趙爽勾股定理證明、劉徽「陽馬」一種長方錐體體積證明、祖沖之父子對球體積公式的推導等等,均可與古希臘數學家相應的工作媲美。趙爽勾股定理證明示意圖「弦圖」原型,已被採用作2002年國際數學家大會會標。令人迷惑的是,這種論證傾向隨著南北朝的結束,可以說是戛然而止。囿於篇幅和本文重點,對這方面的內容這里不能詳述,有興趣的讀者可參閱參考文獻3。
3 古為今用,創新發展
到了20世紀,至少從中葉開始,電子計算機的出現對數學的發展帶來了深遠影響,並孕育出孤立子理論、混沌動力學、四色定理證明等一系列令人矚目的成就。藉助計算機及有效的演算法猜測發現新事實、歸納證明新定理乃至進行更一般的自動推理……,這一切可以說已揭開了數學史上一個新的演算法繁榮時代的偉大序幕。科學界敏銳的有識之士紛紛預見到數學發展的這一趨勢。在我國,早在上世紀50年代,華羅庚教授就親自領導建立了計算機研製組,為我國計算機科學和數學的發展奠定了基礎。吳文俊教授更是從70年代中開始,毅然由原先從事的拓撲學領域轉向定理機器證明的研究,並開創了現代數學的嶄新領域——數學機械化。被國際上譽為「吳方法」的數學機械化方法已使中國在數學機械化領域處於國際領先地位,而正如吳文俊教授本人所說:「幾何定理證明的機械化問題,從思維到方法,至少在宋元時代就有蛛絲馬跡可尋,」他的工作「主要是受中國古代數學的啟發」。「吳方法」,是中國古代數學演算法化、機械化精髓的發揚光大。
計算機影響下演算法傾向的增長,自然也引起一些外國學者對中國古代數學中演算法傳統的興趣。早在上世紀70年代初,著名的計算機科學家D.E.Knuth就呼籲人們關注古代中國和印度的演算法5。多年來這方面的研究取得了一定進展,但總的來說還亟待加強。眾所周知,中國古代文化包括數學是通過著名的絲綢之路向西方傳播的,而阿拉伯地區是這種文化傳播的重要中轉站。現存有些阿拉伯數學與天文著作中包含有一定的中國數學與天文學知識,如著名的阿爾·卡西《算術之鑰》一書中有相當數量的數學問題顯示出直接或間接的中國來源,而根據阿爾·卡西本人記述,他所工作的天文台中就有不少來自中國的學者。
然而長期以來由於「西方中心論」特別是「希臘中心論」的影響以及語言文字方面的障礙,有關資料還遠遠沒有得到發掘。正是為了充分揭示東方數學與歐洲數學復興的關系,吳文俊教授特意從他榮獲的國家最高科學獎中撥出專款成立了「吳文俊數學與天文絲路基金」,鼓勵支持年輕學者深入開展這方面的研究,這是具有深遠意義之舉。
㈥ 非人類思維的演算法
近50年來,人工智慧走的是一條曲折發展的道路。1990年代初,研究者深感人工智慧理論及技術的局限性,從而從不同角度和層次進行反思。同時,人工智慧有待於人類對人腦工作機理的深入了解,需要神經生理學、神經解剖學給出更加詳細的信息和證據。
人工智慧交融了諸多學科,與哲學更是密不可分。盡管事實上,新近的哲學進展基本上沒給科學帶來任何沖擊,並且哲學的討論對象往往是懸而未決的(Russell S,Norvig P. Artificial Intelligence: Amodern Approach. NJ:Prentice Hall,1995. 817),但科學卻在繼續改變著我們對自己的認識。
正如恩格斯所說(恩格斯. 自然辯證法. 北京: 人民出版社, 1972. 187):「不管自然科學家採取什麼樣的態度,他們還是得受哲學的支配。問題只在於:他們是願意受某種壞的時髦的哲學的支配,還是願意受一種建立在通曉思維的歷史和成就的基礎上的理論思維的支配。」
著眼於更寬泛的視野和更遠大的目標,要求從哲學角度尋求更加有效的人工智慧研究方法。堅持物質決定意識的觀點,辯證地看待已有的認識和方法,融合與集成各相關學科的成就和意見,是正確的出發點。
人工智慧的哲學意義
人工智慧是對人類智能的一種模擬和擴展,其核心是思維模擬。
思維
思維科學是研究思維的規律和方法的科學,錢學森將它劃分為基礎科學、技術科學和工程技術三部分,人工智慧屬於工程技術范疇(錢學森. 關於思維科學. 上海:上海人民出版社,1986.20)。人工智慧研究中邏輯學派和心理學派之爭,有時似使人感到迷惘而莫知所從,但從思維科學的角度來看,無非是形象思維和邏輯思維的關系問題,兩者都屬於思維科學的基礎科學。抽象思維的不足在於缺乏結構的綜合能力。只有形象思維才能綜合出新的結構。這也許就是創造和學習最終必須具有形象思維的原因(潘雲鶴. 模式識別與人工智慧, 1991, 4(4): 7)。
不同的劃分觀點認為,思維科學體系的基礎科學包括兩大類:一類是總結人類思維經驗、揭示思維對象的普遍規律和思維本身普遍規律的各種思維科學,包括哲學世界觀、哲學史、認識論和邏輯學,是理論的思維科學。另一類思維科學包括研究思維主體——人腦的生理結構和功能,揭示思維過程生理機制的神經生理學和神經解剖學等。這種觀點將認識論歸在思維科學的基礎科學范圍內。其實兩種觀點,
都不否認人工智慧和哲學通過認識論相聯系。
認識論
認識論研究認識的源泉、發展、過程、能力、作用等一般規律問題。換言之,認識論研究的是知識及其形式和局限性。哲學家強調通過最大機會的觀察和計算,明確什麼是潛在可知的;而人工智慧注重通過現有的觀察和計算途徑,弄清什麼是可知的。而在實際情況中,人工智慧和認識論在本質上是互相交融和兼備的。
認識論對人工智慧的研究方向和方法具有指導意義,但並不意味它能替代具體的研究,也不表示任何人工智慧的研究都要顯式地考慮到認識論。由於對諸如世界的一般表達等問題還未真正達成一致,如果僅依賴從哲學中獲得具體的豐富信息來編寫計算機程序,人工智慧將會處於非常無望的狀態。
心智哲學和認知科學
心智是指人們的記憶、思想、意識、感情、意向、願望、思維、智能等多種心理行為(章士嶸,王炳文. 當代西方著名哲學家評傳(2).心智哲學.濟南:山東人民出版社,1996)。普特南(H.Putnam)根據計算機科學對軟體與硬體的劃分,將心智與大腦的關系理解為功能狀態和物理狀態。西蒙(H.Simon)根據信息加工理論,認為人類思維本質上是信息加工過程,計算機也是信息加工系統,所以,計算機能思維而且能模擬人的思維。人們的心靈、精神世界歷來是哲學家反思的對象,這一研究領域構成了心智哲學的主題。心智哲學在人工智慧、腦科學、認知心理學、控制論、語言學等的推動下,呈現出生機勃勃的景象。
胡塞爾(E.Husserl)是第一位把心智表達的指向性作為其哲學中心的哲學家,他在心智哲學中第一次提出了關於心智表達作用的一般理論。他認為,智能是一種由語境規定的和由目標導引的活動,是一種對預期事實的搜素。
與心智哲學互相滲透的認知科學是1970年代末正式宣告誕生的交叉學科。它是人工智慧、認知心理學、語言學、哲學、人類學、神經生理學等學科的綜合,研究智能系統的工作原理。其核心思想是稱為認知主義的思想,其中一個中心命題是智能行為可以由內在的「認知過程」即理性的思維過程來解釋。因而,一個很自然的假設就是從與計算機相類比的心智模型出發來研究心智的工作原理,把認知過程理解為信息加工過程,把一切智能系統理解為物理符號系統。
心智哲學是較認知科學高一層次的理論,但兩者的相互作用和影響是毋庸置疑的。心智哲學不應超越認知科學的研究成果而作任意的理論假設,認知科學也不應排斥心智哲學的理論成果去作盲目的探索。
認知心理學
認知心理學和人工智慧,是認知科學的兩個組成部分。人工智慧使用了心理學的理論,心理學又借用了人工智慧的成果。將人腦和計算機相類比,是發展認知心理學的一條主要途徑。
認知心理學旨在認識人類的認知心理,將這種認識通過計算機程序語言表達出來;人工智慧致力於用計算機語言描述人的智能,並用計算機加以實現。兩者的共同點在於用計算機程序語言刻劃人類智能。然而,它們也存在一個重要的區別。人工智慧試圖且已經給計算機施加了一個模擬人類智能的程序,該程序包括知道這個系統本身的過程,然後給系統以一定任務,它就會產生行為。這說明人工智慧是確
實的、得到證實的。而認知心理學,還不能肯定信息加工過程是人類智能的唯一心理原因,就連此信息加工過程本身也沒有直接的明確證據。認知心理學只能從行為去推斷心智用什麼程序來造成行為,帶有很大假說性。
德雷福斯(L.Dreyfus)把胡塞爾看成當代認知心理學和人工智慧的先驅。他認為超驗現象學在兩個方面與人工智慧有關系:第一,胡塞爾十分自覺地把探索心裡結構作為他的哲學研究的中心。第二,胡塞爾具體地說明了在意向活動中人們所期望的對象世界的構成,及其所包含的復雜的形式結構。德雷福斯指出,人的認知能力是通過實踐而發展的。這種獨特的認知能力為人類存在於世界的方式提供了無
限的豐富性,構成了人類所有智能行為的基礎。認知心理學企圖通過純認識結構來把握一切智能而根本不考慮頭腦的非認知方面,這種想法註定不會成功。一切智能和智能行為都必須追溯到人類對自身是什麼的理解上,而這一點由於會陷入無窮的遞歸,所以人類永遠不能完全弄清。人類智能的基礎既不可能被分離出來,也不可能被清晰地理解。他還指出,胡塞爾的意識與明斯基(M.Minsky)的框架理論十分類似。人工智慧在發展過程中最終不得不面對日常知識的表達問題,它們是困難的、關鍵的、在哲學上引人入勝的,人工智慧至今仍在為之奮斗。
人工智慧的物質基礎
早在1950年代,就出現了兩種爭論激烈的觀點:一種認為計算機是處理思維符號的系統,另一種認為是對大腦建模的媒介;一種致力於用計算機示例世界的形式化表達,另一種則模擬神經元的交互;一種把問題解決當作智能的范型;另一種強調學習;一種使用邏輯,另一種基於統計;一種是哲學上理性主義和還原主義的繼承者,另一種將自己視作神經科學。事實上,它們分別代表了符號主義學派和連接
主義學派。
心理學中,定位於復雜思維與神經元之間的符號層次的理論很重要。符號是思維的材料,但也是物質的樣式。「觀念」與大腦可觸知的生物物質之間有明顯、根本的不同,這無疑對人工神經網路的建模具有意義。但很遺憾,目前人類對真實神經系統的了解非常有限,對自身腦結構及其活動機理的認識還十分膚淺,眾多神經網路的模型實際上是極為簡略粗糙並且帶有某種「先驗」。譬如,波爾茨曼機引入隨機擾動來避免局部最小雖具有獨特之處,然而卻缺乏必要的神經生理學基礎 (董軍,潘雲鶴. 人工智慧與認識論問題的思考提綱.見:中國人工智慧進展. 北京:北京郵電大學出版社,2001. 22)。
有觀點認為,對神經信息處理機制的深入分析可能會引起計算科學革命性的變化。語言能力是人腦特有的高級功能,但對語言的中樞表象目前仍只有很模糊的認識,甚至連研究這類信息處理過程所採用的合適研究方法還至今闕如。為此,迫切需要方法論的指導,因為它對神經網路的研究及其作用是毋庸置疑的。
1980年代中後期,人們發現腦中存在混沌現象,由於它可能揭示腦活動的深層機制而受到廣泛重視。從生理本質出發是研究神經網路的根本手段。混沌神經網路研究探索非穩狀態下網路的動態行為和信息處理能力。混沌動力學為研究人工神經網路和人工智慧提供了新的契機。這里並不是單純提倡純粹意義上的生理模擬,因為人類把握自然和社會的規律並非是一種「照搬照抄」的過程,人工神經網路的初衷也非「逼真」地描寫真實神經系統,而只是根據物質基礎和客觀依據進行簡化、抽象和模擬。
神經網路的基礎結構更類似於腦,而不是標准計算機的結構。它們的單元並沒有真實神經元那樣復雜,它們的結構與新皮層的迴路相比也過於簡單。盡管神經網路具有這些局限性,但仍然顯示出驚人的完成任務的能力。人腦對信息的處理採用的基於符號的串列邏輯推理過程,一開始就被現代數字計算機所採用。
有趣的是,彷彿有這樣一條人工智慧的「定理」:一旦某種思維的功能被編成程序,人們就不再認為它是「實際思維」的基本組成部分了。而人工智慧的核心總是指那些還未能編製成程序的部分。
人工神經網路還有很多根本性、基礎性的問題需要解決。在某種程度上,它僅僅作為一種演算法,但這不能掩蓋神經網路是在思維是物質世界的產物、是人腦的機能這樣的前提下的嘗試和產物。無論是對史前文明的探索,還是「天」外智能的好奇,都沒有理由否認物質決定意識這個基本觀點。
人類智慧與人工智慧
對人的特質作出解釋的模型很多是來自宗教、藝術等。例如,原始藝術的象徵語言把人類的原始本能和超自然世界的各種意象以特有的符號手段結構化,它們被賦予特有的形式,從而組合成各種表現形態的形象系統。這讓我們不僅了解到人類智能有著不同的具體表達,也明白智能是依賴於社會生活和客觀現實的。
然而,道途艱辛。把人類原始的、潛意識的思想加以分解,有如分解佛教禪宗大師為迷惑心智以達到絕對虛無所下的玄秘功夫那樣,十分困難。況且,要到達人類級的人工智慧已被證明是困難的,而且進展緩慢。
辯證唯物主義不同意那種機器能夠獨立地思維、機器可以比人更聰明的觀點,很重要的理由在於思維是生物長期進化、特別是社會活動的產物。哥德爾贊同人類的心智超過所有的機器的結論。計算機中能不斷繁殖和復制自己的人工生命如病毒,最初也是由人類製造的。計算機的世界完全是由科學家們設計創造的,是人腦的結晶。
莊子與惠子有如下的對話。莊子與惠子游於濠梁之上,莊子曰:「倏魚出遊從容,是魚之樂也。」惠子曰:「子非魚,安知魚之樂?」莊子曰:「子非我,安知我不知魚之樂。」惠子曰:「我非子,固不知子矣,子固非魚矣,子之不知魚之樂全矣。」莊子曰:「請循其本,子曰『汝安知魚樂』雲者,既已知吾知之而問我,我知之濠上也。」(莊子·秋水)
人類智慧與人工智慧孰高孰底、熟勝孰負,智能的復雜和神秘,如同這段文字本身的內涵和後代的種種解析那樣,引人入勝,令人悠然神往。
探尋人工智慧的發展途徑
人工智慧研究者願意用精神術語描述機器有兩個原因。第一,希望給機器提供知識和信念的理論以使它們能對其用戶知道的、不知道的和所想要的進行推理;第二,用戶對機器的了解常常能用精神術語最好地表達。在人工智慧的發展過程中,心理學和哲學自然而然與它互相影響。而人工智慧與哲學的關系,最初是通過心理學這個橋梁的。
人工智慧一開始是自上而下和自下而上相結合的。自上而下或「內涵式」的表述往往給人帶來一種恍然大悟的感覺,自下而上或「外延式」的表述卻像一份說明書。其實,的確需要兩種途徑:一種是自上而下的、把思想映射於神經元群上;另一種是自下而上的、用來解釋思想如何由那些看起來是雜亂無章的神經元集群產生的。
認知科學發展中存在一個值得思考的奇怪現象,對諸如下棋、解密碼之類的可以相對跟環境隔離的看似很困難的任務而言,計算機系統可以超過專門訓練的人;然而對一些最通常的通過由長期進化形成的認知功能,比如視覺和聽覺,經過幾十年努力發展的人工智慧系統還不如嬰兒的能力。大腦的智力活動必須從進化的角度、從社會和歷史發展的約束的角度來研究才能得到充分正確的理解。
雖然我們必須經常遵循有統整作用和簡化作用的大原則,但也必須承認在科學里存在著不可還原的復雜性。討論人工智慧與認識論的關系,當然不能替代人工智慧的研究,但它可使人工智慧研究者不致如入沼澤而迷失方向。然而,遺憾的是,人工智慧研究者往往會忽略人工智慧與哲學的聯系和基本的辯證思維方法——歸納和演繹,分析和綜合等。事實上,每個人在自己的思維體驗中都能感到分析與綜合
的頻繁與重要。但是,人類對這樣一對基本思維機理的研究卻如此薄弱。歷史地看,人工智慧的發展不時地陷入沒有預想到的深層困境,這提醒我們不僅應當從人工智慧發展的技術問題,而且應當從人工智慧的最根本概念和理論上去尋找原因,人工智慧需要更為寬廣的眼界
和宏觀的方法論指導。
㈦ 哲學學者許煜:演算法時代,為什麼美育越來越重要
我們今天怎麼來理解美育?在自動化時代,美育是否還能繼續起到這樣的作用?我認為美育的問題是根本的,而且很多時候都是被忽略的,並非沒有人談,而是忽略了它的轉變性的力量。
㈧ 人工智慧是否突破了我們對哲學原理中物質和意識的突破
這個問題簡而言之應該是哲學視角下的人工智慧,或者人工智慧發展的哲學方法論。不知道我有沒有理解對題主的意思。人工智慧作為下一代互聯網的主要特徵,將會聚集大數據,物聯網,互聯網等相關技術,並在演算法的基礎上不斷向人類神經認知網路學習,並最終製造出高度類人的智能。作為類人智能,它和人類智能,智慧的差異將會越來越小。最終取代人類的大部分工作的能力特別是復雜工作的能力將會超過人類的預期。不管對這一觀點持有悲觀的還是樂觀的看法,不可置疑的是,人工智慧取代人類智能似乎會在某一個時候成為可能。
哲學,歸根結底是方法論和思想論。哲學的存在是為人類精神尋求安寧。人工智慧帶來的一系列技術革新如對人類社會結構的改變,進而改變階層結構,生活方式,生存方式,思維方式等,都將產生極大的倫理風暴。人類思想上的接受與改進,是人類能夠進步的重要原因。在人工智慧發展方面,哲學自然也不能缺位。
這個問題是一個很大的問題,寥寥數語很難完整表達終極意義。希望可以啟發更多思考。同時接受批評指正。
㈨ 演算法與邏輯這2個重要概念究竟是哪一門學科領域專門學習的內容
1.問:做哲學為什麼需要學習邏輯?答:簡單地說,哲學是一門學科,它提供的是理論,它要通過說理、通過論證使人接受或者反駁某種觀點、理論,這就需要有正確的論證。邏輯研究有效推理,就是提供正確論證的基礎。實際上,凡是理論,用推理,講論證,都離不開邏輯。從這點看,哲學與其他「學」相同,所以邏輯是基礎學科。但是哲學與其他學科相比,有兩個特點,這使得這哲學中論證更為重要,因而邏輯的作用也更為重要。第一個特點,哲學不是經驗科學。盡管經驗可以給我們提供某些啟示,來自於經驗的知識可以作為哲學思考的某種根據,但是哲學命題不能通過經驗來驗證,不能做實驗,所以,一個哲學理論的「正確性」(是否可接受),幾乎只能靠論證來顯示。歷史上,一些哲學理論後來不被接受了,以另外的形式出現了,是因為發現原來論證有問題,對原來的理論有修正,有新的論證;也有一些理論一開始人們不喜歡,如休謨的經驗論,後來卻不得不接受(當然不是所有人都接受),因為它的論證沒法反駁,有人甚至是樂於接受,因為認為它的論證好。第二個特點,哲學與其他學科不同,它要思考「終極」問題,即各門具體學科都不研究或無法研究的問題,比如什麼是物質,什麼是實在,什麼是精神等本體論和認識論的問題。對這類問題的思考,會使論證更加困難。學過亞里斯多德邏輯,我們知道,有屬加種差的定義。例如,人是某種動物,動物是某種生物,這就是屬加種差的定義對什麼是人和動物的回答。如果繼續追問,什麼是生物,大概還可以說,生物是某種物質,但是如果再問什麼是物質?至少按這種方式已不能回答,需要有上一層的概念體系。一般來說,探求這樣的終極問題,概念體系不容易建立,而且容易出現某種循環,比如康德二律背反那樣的東西。在對這樣的問題進行思考時,在對這些問題的觀點論證、提出相應理論時,我們應該遵從什麼法則?有什麼規律?這些都對論證,也是對邏輯,提出了更高的要求。我們知道,現在我們所說的邏輯學產生於古希臘,始於亞里斯多德。為什麼邏輯學產生於古希臘,有幾個原因。一是民主政治,導致論辯風盛行。要辯論,要說理,就要講邏輯。二是歐幾里得幾何學,提供了一個理論應該如何應用邏輯的典範。還有一個非常重要的原因,就是哲學研究。我認為是亞里斯多德主要是在其哲學研究中,也是為了更好地研究哲學,建立了邏輯學。他對於(事物)本質問題的思考等,使他提出上面提到的定義理論,建立了三段論邏輯。從這段歷史來看,可以說,因為哲學和論證的關系,對邏輯提出了更高的要求,所以邏輯學才如此這般地產生了。所以,邏輯從一開始,就和哲學有密不可分的關系。以上所說的中心意思是,哲學的生命力在於論證,我們的哲學觀點和理論可以不同,但是論證方法必須是相同的,不論自己思考問題還是與人交流,都需要有公共的論證平台,而這個平台應該、也只能由邏輯來搭建。在今天,哲學已經大大發展,但是哲學和邏輯的基本關系沒有改變。只是今天的哲學需要什麼樣的邏輯?這是個有意思的問題,亞里斯多德邏輯顯然完全不夠了,需要今天的哲學家和邏輯學家共同關注。關於邏輯和哲學的關系,當年王浩來北大講學時還提出一種觀點。大意是,關於哲學問題的基本觀點,大家很難統一。對此我們可以採取公理化的方法,各自從自己的基本觀點出發,建立相應的理論系統,類似於古典數學和直覺主義數學。我認為這當然不是哲學研究的全部,但應該也是哲學研究的一個重要方面。如何使自己的理論更嚴密,需要有公理化的思想和方法。歷史上斯賓諾莎曾經做過倫理學的公理化研究,大概不是很成功。今天邏輯學的發展是否對此提供了新的基礎?這就需要學習現代邏輯。2.問:中國哲學也需要邏輯嗎?答:回答這個問題,首先要對「邏輯」這個概念作點說明。我們現在所說的邏輯,指的是上面提到的產生於古希臘的邏輯。就連「邏輯」一詞都是從古希臘語到英語、再到漢語譯音而來。為什麼要這樣,因為中國自己的文化中沒有產生出西方邏輯學意義上的邏輯學。中國古代有名辨學等一些在今天被人們作為中國邏輯史研究對象的理論或學說。從哲學和邏輯的關系看,如果說古希臘哲學有亞里斯多德邏輯與之對應,那麼中國哲學是否也可以說有名辨學這樣的學說與之對應?有這個背景,再看我們的問題,「中國哲學也需要邏輯嗎」,應該是,研究中國哲學或中國哲學研究需要西方的邏輯學嗎?這里有兩個問題。如果是研究中國哲學,即以中國哲學為研究的對象,提出自己的研究成果,提出相應的理論和觀點,那麼,與其他研究類似,也要分析、推理、論證,當然也離不開西方的邏輯學。因為只有西方傳統的邏輯學才在今天成為各學科的基礎。但是,如果是做中國哲學研究,或中國哲學式的研究,即用中國哲學的方法研究中國哲學的問題,比如類似於老子,孔子的研究,是否要用西方的邏輯學,我還看不出有這個必要。從西方邏輯學的觀點看,今天仍然難以完全說清中國的古代哲人究竟是用什麼邏輯思考問題的。這個說法需要作點解釋。中國哲學和西方哲學有很大的區別。這一點,從各自關心的問題和研究問題的方式可以看出來。西方哲學開始關心的問題是世界的本源是什麼,這個關心的目的是要把面對的萬事萬物拆開,找基本的組成部分,或面對復雜紛呈的世界找出基本的性質,再將它們的組合起來,希望從這里說明一切現象,同時也獲得了改造自然的手段。從簡單的、基本的部分或性質開始,通過組合,到說明各種復雜現象,解決復雜問題,這就是西方哲學的精神,也是西方邏輯的精神,他們在這個探討過程中建立了邏輯學,而且也是在這個過程中建立了西方科學。西方的哲學、邏輯學、科學屬於同一個文化體系。中國哲學也有關心世界本源的部分,但地是從社會的角度考慮問題,探討社會的秩序、和諧,講究天人合一,同時也是為個人的自我修養和人生指導提供依據。從世界和社會的宏觀出發到個人的修養,從個人的修養再到社會的和諧和秩序,這裡面有許多非組合的東西,與西方邏輯的精神從文化淵源上看有根本的區別。所以,在這個問題上,我倒是不覺得中國哲學式的研究要用到西方的邏輯學。說到這里,插一句,我想中國哲學的邏輯是什麼,這也許是個更有趣的問題。顯然這需要中國哲學和邏輯學兩方面的結合才有可能研究。當然,今天也很難有人還會按古人的方式去思考他們的哲學問題。不論從學習階段就受到的訓練,還是到後來的學術規范和科研體制,都決定了不會再出老子和孔子那樣的思想家。現在作為學術的最基本要求是要說理,要論證,要交流,還是上面說到的,要有公共的論證平台。從這個意義上說,中國哲學大概也需要西方的邏輯學。3.問:傳統邏輯和現代邏輯的區別是什麼?答:我注意到你們的幾個類似問法或問題,因為你們的采訪在我們中心(北京大學邏輯、語言與認知研究中心)的網上登了出來,而且有了一段時間。這些問題是:(1)普通邏輯和現代邏輯的區別是什麼?(2)數理邏輯和普通邏輯有什麼區別?(3)邏輯學導論和一階邏輯的區別是什麼?還有現在的問題,(4)傳統邏輯和現代邏輯的區別是什麼?我想先做一點說明,也是澄清。這里涉及到關於邏輯的一些名詞。首先,邏輯是一種客觀對象,邏輯學是關於這個對象的科學,就像力是一種客觀對象,力學是關於力這種對象的科學一樣。「邏輯」有時也指邏輯學。邏輯本身沒有現代和傳統之分,也沒有普通和不普通之分,只是邏輯學,作為人們對邏輯這個對象研究的成果,受到歷史條件的限制,才有傳統和現代之分,有不同的歷史形態。「現代邏輯」和「傳統邏輯」指的就是這種意義上的邏輯學。關於「普通邏輯」。首先,從對象的層次看,剛才說了,沒有普通和不普通之分,也就是說沒有普通邏輯這種邏輯,其次,從研究的角度看,也沒有對邏輯這種對象的「普通」的研究,所以,是既沒有普通邏輯(這種邏輯),也沒有普通邏輯學。「普通邏輯」只能是課程的名稱,類似於「普通物理」。這一點也是王憲鈞先生當年一再強調的。拿「普通邏輯」和「普通物理」相比,也是王先生舉的例子。為什麼要強調這一點,因為「普通邏輯」叫得多了,有一種誤解,把普通邏輯也當成了一種邏輯或一種邏輯學,其實,這只是一門課。關於「一階邏輯」,從對象的層次看,有這樣一種邏輯。關於這種邏輯的理論等是一階邏輯學,通常也稱為「一階邏輯」。此外,還有專門的課程講授一階邏輯學,所以它還可以是課程的名稱。「數理邏輯」與此類似。在上面提到的這些名稱中,「傳統邏輯」,「現代邏輯」,指的是某種邏輯學,在一些情況下,「現代邏輯」也可以是某類課程的名稱;「普通邏輯」,「邏輯導論」或「邏輯學導論」只能是課程的名稱;「一階邏輯」,「數理邏輯」指的可以是一個或一種邏輯,也可以是這個或這種邏輯的學,還可以指講授這個或這種邏輯的課程。這里我們涉及到三種名稱:邏輯,邏輯學和邏輯課。有這個說明後再來看這些問題。在這些問題中,問題(4)是一個合理的問題,也沒有什麼歧義,因為在這個問題中,「傳統邏輯」和「現代邏輯」只能做邏輯學的理解,問的是兩種邏輯學之間的區別,現代的邏輯學究竟比過去的邏輯學有那些發展等。問題(3)的意思應該是比較兩門課程,因為「邏輯學導論」是課程的名稱,我們也有一階邏輯的課。如果這么看,這也合理。問題(2)的初衷大概類似於問題(3),但是問題(2)容易引起誤解。因為「數理邏輯」可以指一種邏輯,將它與普通邏輯相比,容易使人誤解,把普通邏輯也當成了一種邏輯。最不合理的是問題(1)。「普通邏輯」只能是某門課程的名稱,現代邏輯是一種邏輯學,這兩個「邏輯」不可比。如果把「現代邏輯」理解為課程的名稱,那麼,它指的不是一門課,凡講授現代邏輯學知識的課都可以稱為現代邏輯課,而普通邏輯只能是一門課。將一門課與一類課相比,這應該也不可比。所以怎麼都說不通。現在可以回答你們的問題,即問題(4)。一般認為,從亞里士多德到弗雷格以前的是傳統邏輯,從弗雷格開始,產生了現代邏輯。當然在弗雷格之前,也有萊布尼茨、布爾這些現代邏輯的先驅。現代邏輯與傳統邏輯的不同首先是產生的原因或動因不同。傳統邏輯產生的原因主要是哲學上論證,也包括日常生活中的一些論辯。現代邏輯產生於數學研究,主要為了找出數學中的邏輯。其次是方法的不同,這是主要的不同。學過一點現代邏輯都知道,現代邏輯的基本方法是形式化方法。從根本上說,形式化方法就是數學的方法。因為是一些數學家研究數學中的推理,找數學中的邏輯,所以很自然地引用了數學的方法。從萊布尼茨開始就提出了把推理當作數學演算的想法。這個想法到弗雷格才在一定范圍里得以實現。可以實現的原因之一,是弗雷格研究的是數學中的推理,這是我們各種推理中最嚴格的推理,但同時也是最簡單的一種推理。可以實現的原因之二,就是他用到了數學的方法,把數學用到推理的研究中。現在數學(古典數學)中推理的規律已經都找出來了,這就是一階邏輯。在這個過程中,產生了很多新的思想,建立了許多新的技術,邏輯學的內容大大豐富。如果說過去我們只能靠肉眼觀察,那麼,現在因為有了新的方法,我們已經知道如何去造顯微鏡,而且是電子顯微鏡。與傳統邏輯相比,因為有了觀察邏輯關系的「電子顯微鏡」,現代邏輯打開了一個全新的天地,范圍大大拓寬。這個天地是傳統邏輯用「肉眼」所不可能看見的。因為方法和動因的不同,導致了傳統邏輯和現代邏輯其他的一些不同。比如,同是研究日常推理,傳統邏輯總結一些方法,教我們這些方法,現代邏輯則要把其中的規律用數學的方法精確地刻畫出來,其目的不是教我們人如何正確地進行日常思維,而是「教」計算機去做這樣的的推理。現代邏輯的這種發展,使得邏輯學真正成為其他一些學科的基礎,比如計算機科學,語言學等,包括哲學方面的分析哲學,語言哲學等。這里所謂的基礎,意思是,如果沒有現代邏輯的知識,要進行這方面的有關研究是不可能的。這個基礎的作用是傳統邏輯做不到也不可能做到的。人們一般認為學習邏輯會使人邏輯性強,提高思維能力,表現在頭腦清楚,說話有條理,能言善辯等。這被稱為邏輯的教導作用。應該說這是邏輯學產生的初衷之一。但在今天看來,如果說,傳統邏輯還有一定的教導作用,那麼現代邏輯則基本沒有這個作用。現代邏輯使得邏輯學越來越像數學,成為專門的基礎知識。如果說現代邏輯也有一些教導作用,那麼它並也不比數學強。換言之,要想從學習現代邏輯中得到思維能力的提高,更好的法是去學數學。總之,邏輯學的這種教導作用,至少從現代邏輯的內容上看,已經不是今天邏輯學的主要功能。4.問:您認為哲學系本科生應該學普通邏輯課還是現代邏輯的課程?答:關於這個問題,我可能會說得多一些。因為即使在我們北大哲學系,這個問題也是從我的上一代老師、我的前輩們開始就一直在討論、爭論、甚至激烈爭論的問題。我認為,應該學什麼課,普通邏輯課還是現代邏輯課,取決於兩個因素:一個是課程的內容、性質;一個是學習的目的。這是從學生選課的角度說的。換一角度,可以問,哲學系應該對本科生開普通邏輯課還是現代邏輯課?也有兩個類似的因素,前一個因素沒變,後一個因素是,開什麼課取決於培養學生的目標。這是受教育者和教育者都關心的同一個問題,但角度不同。我想我還是從教育者的角度來談這個問題。現在本科生教育可以說有兩個目標,一個是素質教育,一個是專門人才培養。說白了,前者就是畢業後找工作,後者是讀研究生,准備走學術的道路。從社會需求的角度看,大部分人是要從事實際工作的,學者總是少數。因此現在比較強調素質教育,淡化專業,所以本科生階段取消了一些專業,比如我們系的本科生邏輯學專業就取消了。專門人才培養一般要到研究生階段才真正開始。盡管學生自己可以早早為自己定位,但是從教育者的角度說,並不一開始就把誰定在什麼方向。這增加了學生的自主性、能動性,同時也增加了學生自己的責任,學生也要為自己的將來負責。這是社會的進步。與強調素質教育相對應,另一方面,對准備走學術路的人也提出了更高的要求,要求有扎實的基礎,有出色的科研能力。這是一種兩極分化。一個本科生,剛進大學,很難說將來畢業後的去向,是做實際工作,還是讀研究生,最終走學術研究的路。從教育者的角度看,也只能是同時提供各種條件、環境,讓受教育者能走更適合自己發展的道路。一個好的大學,就是能提供好的這樣的條件和環境,比如開出各種課程和提供好的指導等。現在可以談談普通邏輯課和現代邏輯課的問題。簡單地說,現代邏輯的課程是為專門人才培養開設的。一個學生如果畢業後從事實際工作,在這方面他所需要的主要是素質教育,我認為不用學現代邏輯,但同時也不用學普通邏輯,倒是可以學學批判性思維這樣的課。為什麼這么說,我們可以先看看普通邏輯的性質和內容。普通邏輯是我國大學的邏輯知識普及課,內容大體上是亞里斯多德邏輯,即亞里斯多德的三段論、定義理論等,一些簡單的命題邏輯知識,再加一些歸納推理的內容,關於論證的常識等,從知識的組成看,基本上是傳統邏輯的東西。普通邏輯有一個基本考慮,就是圍繞思維來講。根據這個考慮,它把內容又分為概念,判斷,推理,論證幾個部分。近二十多年來,隨著現代邏輯影響不斷增加,普通邏輯課中也逐漸增加了一些現代邏輯的內容,課程的名稱也改成邏輯導論,內容和重點有了很大甚至是重要的改變,但普及邏輯知識的課程性質沒有變。這樣的一門課程,我認為有一些缺點。首先我們可以看一下經過這樣的普及課學習,會有什麼收獲,有什麼效果。從課程設置的角度說,不外是希望學生有這幾個方面的收獲:(1)獲得一定的邏輯學知識;(2)掌握一些方法,受到一定的訓練,思維能力有某些提高;(3)有了一定的基礎,便於繼續學習邏輯;(4)以邏輯為基礎去進行其他的課程的學習或研究。其中(1)和(2)合起來可以在素質教育方面起到一定的作用。(3)和(4)看起來是可以起到專門人才培養方面的作用。但實際情況究竟怎樣,是否可以達到這樣的效果,我們可以做一些分析。先看後兩條,即人才培養方面的(3)和(4)。首先,傳統邏輯和現代邏輯是邏輯學發展的兩個階段。現代邏輯不是從傳統邏輯的基礎上發展而來的,上面也談到,完全是新的問題,新的起點,新的方法。現代邏輯對傳統邏輯有種跳躍性,而沒有什麼繼承性。從我們的教學實踐看,學習傳統邏輯對學現代邏輯沒有什麼幫助,反而可能會有某些誤導。如果是為了要繼續學習邏輯,這個繼續被學的,只能是現代邏輯,所以不如一開始就學現代邏輯。(3)說的是普通邏輯課或邏輯導論課可以作為現代邏輯課的基礎,但從這個分析看,情況並非如此。不說有可能誤導,至少學習的效率不高。再看(4)。現代邏輯是像數學這樣的專門的基礎知識,需要按學數學那樣方式才能真正掌握,才可能成為用來學習和研究如計算機科學、語言學甚至哲學的知識基礎,不能只是停留在普及知識的層次上,淺顯地講講,象徵性地做些習題,而需要詳細地講解,嚴格地證明,嚴格地做習題,有些甚至是比較難的習題。這些即使在邏輯導論課上,也不可能做到。所以,希望達到(4)的效果,只能是一個願望,實際上根本達不到。這兩個方面說明,普通邏輯或邏輯導論在邏輯學研究或應用邏輯的專門人才培養方面起不到什麼作用。事實上,我們這些年的教學實踐上也證明了這一點。就我校來說,這二十多年來上過普通邏輯或邏輯導論課的學生應該達到數以萬計,但沒有一個學生由此而成為研究邏輯或者應用邏輯去研究其他領域問題的專門人才。這說明什麼問題?當然是我們作為教育者一方應該深刻反省的。說到底,主要是課程的性質,普及邏輯知識,這決定了這門課只能是作為文化素養提高的一個方面來教和學,而不是也不能作為其他知識和課程的基礎來教和學。說到這里,涉及到這門課的素質教育方面的意義。上面說了它在專門人才培養方面起不到什麼作用,現在我們可以就此再看它素質教育的作用方面。前面說到邏輯有教導作用,在這里對應到所希望達到的效果(2)。看起來普通邏輯所講的問題簡單、常見,與實際生活更接近,所以它更具有教導作用,但其實這里有些誤解。普通邏輯或邏輯導論都是傳統邏輯和現代邏輯的某種結合。關於現代邏輯,前面已經說了,它完全遠離了邏輯的教導作用,不是為日常思維服務的,而是一種基礎知識。再看傳統邏輯部分。這部分中確實有些內容是講思維方法,講有關的一些道理。但是在這方面,它有兩個不足:一是先天不足,一是後天不足。一般都不否認亞里斯多德邏輯是傳統邏輯的核心部分。亞里斯多德邏輯中的核心部分又是三段論。我們可以看看三段論在講什麼。它在講我們幾乎天生就會的三段論推理,比如「所有的A是B,所有的B是C,所以,所有的A是C」,講這樣的的推理為什麼是正確的,這樣的推理多少種格與式,哪些格式是正確的推理形式,可以如何變形,道理何在等等。這些細致的甚至顯得繁瑣的分析和證明主要不是為了日常思維的需要,而是為了哲學研究。我想說的是,邏輯學從一開始,就是一種學院派式的理論,這是它的精神實質,而且這種精神一直在延續。應該說,這是真正的邏輯學的精神。所以,亞里斯多德是邏輯學之父,他不僅從問題、對象,而且從方式和精神,都奠定了這門學科的基礎。關於日常思維的思維方法等只是這種理論的一些延伸,不是本質的部分。有了理論,可以在思維方法的方面做很多推廣。只是方法方面談多了,談泛了,實際上就出了這種學的圈。這就是傳統邏輯對日常思維方面作用的「先天不足」。作為一門課程,當然可以按照需要設計它的內容,沒有必要一定按某種學理精神來講授。但是,在思維能力提高和訓練方面,普通邏輯並沒有給我們提供的內容和訓練的手段。這是它的「後天不足」。如果要講思維方法,注重日常思維能力提高,有比普通邏輯更合適的課程,這就是批判性思維。實際上,批判性思維並不是一門邏輯課,但是它的問題更集中,目的也更明確,所以更專業。總體上看,對普通邏輯課,包括邏輯導論,在思想方法和思維能力訓練方面,如果是講思維的嚴格性,精確性,那不如去學數學。如果是講思維的敏捷、機智,善抓問題實質的准確性、尖銳性等,不如去學批判性思維。最後,再看希望達到的效果(1),即這門課對邏輯知識的了解和掌握方面的作用。作為知識上的修養,這當然也是一種素質的提高。特別地,對什麼是邏輯的精神,通過普通邏輯課或邏輯導論課多少可以了解一些,這應該是一個人知識組成中的重要部分。但是,知識普及性的課不能提供真正實用的技術和理論,這一點應該沒什麼疑問。我們只要看看邏輯學今天的發展和這些課程所講授的內容就不難得出這個結論。當然,不論怎樣,最後總會對邏輯的精神有一定程度的了解,有一定的邏輯的知識素養,這是大概是這門課最後的收獲。對此我想指出一點,從今天的角度看,這也是一種多少有點養尊處優的知識素養,因為它主要不解決實用問題,基本上是精神層面的東西。過去我國大學教育屬於計劃經濟體系,畢業生是國家幹部。什麼是國家幹部,就是國家的管理人員,當然不是人人最後都走上了管理崗位,但首先他們都屬於幹部體系,有幹部級別。大學的一個主要功能是為國家提供幹部儲備。作為這樣的教育,當然要使受教育者除了專門的知識、技能外,還要有一定的知識素養。比如,要知道一點邏輯,講點邏輯。在這種情況下,邏輯知識普及課對我國幹部隊伍素質的總體提高,還是起到一定的作用的。從這個意義上說,這門課也還是有功績的。但是,現在的情況已經有了根本的改變。一個受教育者不再是計劃經濟下教育生產線出產的一個產品,不再是一個幹部或儲備幹部,國家的幹部體制現在也轉變成了公務員體制,這不僅僅是名稱的改變。在現在的情況下,一個大學生首先是一個將來要參與社會競爭的主體。我們的教育體制已發生了根本的變化,教育也地具有了人本精神,教育者要地從受教育者的立場出發考慮問題。面對這樣的教育形勢和被教育者,我們應該教什麼?他們所面對的將是嚴酷的競爭和挑戰,已經沒有時間和條件再去接受那種養尊處優式的知識素養教育。所以我認為,如果說普通邏輯或邏輯導論這種邏輯知識普及課在過去時代條件下還有一些積極作用,那麼現在這些作用早已淡出,所以這樣的課已經不合時代要求,應該淘汰。取而代之的也是兩極分化:徹底講實用性,學批判性思維;真正學邏輯,學現代邏輯。這也是一種「與時俱進」吧。有一種觀點認為,一個大學畢業生,受過高等教育的人,不學普通邏輯或邏輯導論,不知道什麼是邏輯,不懂一點邏輯怎麼行。我認為這種觀點沒有建立在將邏輯學、邏輯課以及它們的歷史和社會時代背景等因素加以綜合和仔細分析的基礎上,沒有充分的根據。如果有我們這里的分析,那就不僅是「怎麼不行」,而且是勢在必行。至於哲學系開什麼課,不同的哲學系當然只能根據自己的情況量力而行。北大哲學系是按專門人才培養的方向來開課的,也有這個條件,所以當然應該開現代邏輯課,取消普通邏輯或邏輯導論課。我們實際上也是這么做的。目前只是對外系或校公共課還開邏輯導論,這是因為某種歷史的慣性吧,遲早也是要取消的。在我系,現代邏輯課是一系列課程。首先是一階邏輯。這是現代邏輯的入門課,也是哲學學習和研究的一個基礎課。如果將來研究哲學,可以到此為止,也可以再學模態邏輯等。如果要學邏輯,則必須在有這門課的基礎後再去學其他的邏輯課程。至於批判性思維,我認為是一門很好的課,也主張應該開這門課,甚至應該是全校的公共課。這是一門素質教育課,誰都可以選。但是要清楚,這門課與學哲學和學邏輯都沒有什麼特別的關系。
㈩ 在計算教學中 如何處理好理解算理和掌握演算法的關系
算理是算的一種道理和想法,而演算法是算理的一種表達形式或書寫格式,算理要通過演算法來表現,演算法又要體現算理。在新課程的教學中,特別突出對算理的理解,追求演算法多樣化,在處理算理和演算法的關系時有偏向了算理,究竟如何把握兩者之間的關系,使起和諧平衡發展談幾點看法。
一、讓學生在自主探究中構建算理。學生在用已有經驗解決問題時,教師應為學生提供探索的空間,交流的平台,在交流中明白一個個算理,從而發展學生的思考能力。
二、展示多種算理時要找到突破口。在交流多種想法時,教師要善於抓住恰當的一種作為切入口,大部分學生容易理解的進行突破。
三、注重算理和演算法之間的溝通。算理是演算法的基礎,當學生明白了算理後,教師應及時落實兩者之間的關系,有利於對演算法的掌握。
四、基本演算法要強化訓練。在多種演算法中有基本的演算法,所以對基本的演算法有必要進行強化,規范,示範,努力使每一個學生都會。
其實個人認為這兩個關系如同哲學中主觀與客觀關系一樣,兩者都不可費,兩者相輔相成,這兩者關系是辨證的,關鍵在教學中要重視溝通。