算法与哲学
㈠ 哲学家就餐问题的算法实现
操作系统并发和互斥:哲学家进餐问题和理发师问题
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),即这门课对逻辑知识的了解和掌握方面的作用。作为知识上的修养,这当然也是一种素质的提高。特别地,对什么是逻辑的精神,通过普通逻辑课或逻辑导论课多少可以了解一些,这应该是一个人知识组成中的重要部分。但是,知识普及性的课不能提供真正实用的技术和理论,这一点应该没什么疑问。我们只要看看逻辑学今天的发展和这些课程所讲授的内容就不难得出这个结论。当然,不论怎样,最后总会对逻辑的精神有一定程度的了解,有一定的逻辑的知识素养,这是大概是这门课最后的收获。对此我想指出一点,从今天的角度看,这也是一种多少有点养尊处优的知识素养,因为它主要不解决实用问题,基本上是精神层面的东西。过去我国大学教育属于计划经济体系,毕业生是国家干部。什么是国家干部,就是国家的管理人员,当然不是人人最后都走上了管理岗位,但首先他们都属于干部体系,有干部级别。大学的一个主要功能是为国家提供干部储备。作为这样的教育,当然要使受教育者除了专门的知识、技能外,还要有一定的知识素养。比如,要知道一点逻辑,讲点逻辑。在这种情况下,逻辑知识普及课对我国干部队伍素质的总体提高,还是起到一定的作用的。从这个意义上说,这门课也还是有功绩的。但是,现在的情况已经有了根本的改变。一个受教育者不再是计划经济下教育生产线出产的一个产品,不再是一个干部或储备干部,国家的干部体制现在也转变成了公务员体制,这不仅仅是名称的改变。在现在的情况下,一个大学生首先是一个将来要参与社会竞争的主体。我们的教育体制已发生了根本的变化,教育也地具有了人本精神,教育者要地从受教育者的立场出发考虑问题。面对这样的教育形势和被教育者,我们应该教什么?他们所面对的将是严酷的竞争和挑战,已经没有时间和条件再去接受那种养尊处优式的知识素养教育。所以我认为,如果说普通逻辑或逻辑导论这种逻辑知识普及课在过去时代条件下还有一些积极作用,那么现在这些作用早已淡出,所以这样的课已经不合时代要求,应该淘汰。取而代之的也是两极分化:彻底讲实用性,学批判性思维;真正学逻辑,学现代逻辑。这也是一种“与时俱进”吧。有一种观点认为,一个大学毕业生,受过高等教育的人,不学普通逻辑或逻辑导论,不知道什么是逻辑,不懂一点逻辑怎么行。我认为这种观点没有建立在将逻辑学、逻辑课以及它们的历史和社会时代背景等因素加以综合和仔细分析的基础上,没有充分的根据。如果有我们这里的分析,那就不仅是“怎么不行”,而且是势在必行。至于哲学系开什么课,不同的哲学系当然只能根据自己的情况量力而行。北大哲学系是按专门人才培养的方向来开课的,也有这个条件,所以当然应该开现代逻辑课,取消普通逻辑或逻辑导论课。我们实际上也是这么做的。目前只是对外系或校公共课还开逻辑导论,这是因为某种历史的惯性吧,迟早也是要取消的。在我系,现代逻辑课是一系列课程。首先是一阶逻辑。这是现代逻辑的入门课,也是哲学学习和研究的一个基础课。如果将来研究哲学,可以到此为止,也可以再学模态逻辑等。如果要学逻辑,则必须在有这门课的基础后再去学其他的逻辑课程。至于批判性思维,我认为是一门很好的课,也主张应该开这门课,甚至应该是全校的公共课。这是一门素质教育课,谁都可以选。但是要清楚,这门课与学哲学和学逻辑都没有什么特别的关系。
㈩ 在计算教学中 如何处理好理解算理和掌握算法的关系
算理是算的一种道理和想法,而算法是算理的一种表达形式或书写格式,算理要通过算法来表现,算法又要体现算理。在新课程的教学中,特别突出对算理的理解,追求算法多样化,在处理算理和算法的关系时有偏向了算理,究竟如何把握两者之间的关系,使起和谐平衡发展谈几点看法。
一、让学生在自主探究中构建算理。学生在用已有经验解决问题时,教师应为学生提供探索的空间,交流的平台,在交流中明白一个个算理,从而发展学生的思考能力。
二、展示多种算理时要找到突破口。在交流多种想法时,教师要善于抓住恰当的一种作为切入口,大部分学生容易理解的进行突破。
三、注重算理和算法之间的沟通。算理是算法的基础,当学生明白了算理后,教师应及时落实两者之间的关系,有利于对算法的掌握。
四、基本算法要强化训练。在多种算法中有基本的算法,所以对基本的算法有必要进行强化,规范,示范,努力使每一个学生都会。
其实个人认为这两个关系如同哲学中主观与客观关系一样,两者都不可费,两者相辅相成,这两者关系是辨证的,关键在教学中要重视沟通。