公元1世纪的时候普鲁塔克提出一个问题:如果忒修斯的船上的木头被逐渐替换,直到所有的木头都不是原来的木头,那这艘船还是原来的那艘船吗?
![](https://img.haomeiwen.com/i11398717/f2a1e42c0c77cafe.jpg)
很多哲学家都回答论证过这个问题,其中就包括著名哲学家思想家亚里士多德,苏格拉底,柏拉图。我们来看一看亚里士多德的论证方法和他的结论:
![](https://img.haomeiwen.com/i11398717/f51fa1334caa3fb3.jpg)
亚里士多德认为可以用描述物体的四因说解决这个问题。构成材料是质料因,物质的设计和形式是形式因,形式因决定了物体是什么。基于形式因,忒修斯之船还是原来的船,因为虽然材料变了,但船的设计——形式因——没有变。从这个角度看赫拉克利特的河流问题,则两次踏入的是同一条河流,因为河流的形式因没有变。事物的目的决定了其目的因。忒修斯之船的目的在神话中是装载和运输,在现实中的目的是证明和纪念忒修斯,虽然材料变了,但目的没有变。
那么,作为一个程序员,我们该如何看待这个问题呢?这里我们不妨先来为忒修斯之船定义一个对象:
/**
* 忒修斯之船
*/
public class TheseusShip {
private Object hull; //船壳
private Object deck;//甲板
public void transport(){
//运输功能
}
// getter setter
}
接下来,我们来创建一个对象分别代表初始的船和改变之后的船:
TheseusShip theseusShip = new TheseusShip(); //初始之船
theseusShip.setHull("船壳1");
theseusShip.setDeck("甲板1");
接下来对船的零件进行替换:
TheseusShip theseusShip2 = theseusShip;
theseusShip2.setHull("船壳2");
theseusShip2.setDeck("甲板2");
进行到这里想必大家已经明白了,无论我对初始的船做出任何改变,它都还是原来的船,因为下面的结果始终为True:
System.out.println("Is the ship of Theseus change: " + (theseusShip2 == theseusShip));
![](https://img.haomeiwen.com/i11398717/fb4cd32ad4893ae9.jpg)
所以,以一个程序员的眼光来看忒修斯之船这个问题,答案是还是原来的船。在程序员的眼中,只有对或者错。并不存在什么哲学问题,毕竟一旦哲学了,程序运行可能就要抛异常了。
网友评论