扯淡之——世界上先有鸡还是先有鸡蛋
“世界上先有鸡还是先有蛋”是一个非常著名的思辨难题,至今为止也没有标准的答案,甚至还有科学研究。
蛋白质方面的研究
一只小鸡正在从蛋壳里孵化出来。
英国华威大学的马克·罗杰教授与大卫教授在帮助谢菲尔德大学进行试验研究时,发现形成鸡蛋方解石晶体硬壳的关键鸡肉蛋白“OC-17蛋白”(ovocleidin-17)的存在贯彻了整个蛋壳的形成过程并起到了催化的作用,这使得他们认为在“先有鸡还是先有蛋”的问题里首先存在的是鸡,或者确切的说是OC-17这种鸡肉蛋白。不过马克·罗杰在报告中的附加引述中说到:“这个发现难道就能证明先有鸡再有蛋吗?我们想强调的‘先有鸡还是先有蛋’这个问题虽然很有趣但是事实上却毫无意义。不过这个研究倒是使得学界对高效快速的结晶方法有了新的见解,这项研究也能够在骨头的形成以及二氧化碳是如何被贮存在石灰石等问题上提供帮助。”[9]
不过,他们的研究却与早先时候的研究结论有些出入。约翰·布鲁克菲尔德(John Brookfield)与大卫·帕皮诺(David Papineau)教授认为,在世界上第一只鸡出现后,在它之前也必定需要并有一颗能够孵出它来的蛋[10]。生物学家迈尔斯进一步的指出了前者在研究中的瑕疵,称其他的鸟类会使用与OC-17不同的蛋白质来制造鸟蛋,而且OC蛋白的演变并不能够与鸟蛋的演变向吻合;OC蛋白是从一种古老的蛋白质演变而来,这种蛋白在鸟类分支从爬行动物分离之前便开始参与制造动物的蛋[11]。
摘自维基百科《先有鸡还是先有蛋》
研究者说先有突变的鸡基因,可是对于“世界上先有鸡还是有鸡蛋”问题没有切确的答案,或者说非常有说服力的证据。
宗教观点与神话故事
主条目:创造论
犹太教及基督教的神话传说中都表明是上帝创造了世间的种种,其中也当然包括鸟。犹太教及基督教的神话中提到上帝创造了鸟类并让它们繁衍后代,但是神话中并没有提到蛋的事。例如创世纪第一章:
19有晚上,有早晨,是第四日。20神说,水要多多滋生有生命的物,要有雀鸟飞在地面以上,天空之中。21神就造出大鱼和水中所滋生各样有生命的动物,各从其类。又造出各样飞鸟,各从其类。神看着是好的。22神就赐福给这一切,说,滋生繁多,充满海中的水。雀鸟也要多生在地上。
飞鸟为统称,并没有明确说明是否事先有鸟还是先有蛋?
在印度的经书中记载,神创造了鸟及其他一切生命形式。不过,印度的传说中所谈到的蛋被扩大到了非鸡蛋的蛋的范围,印度的神话也提到了“宇宙蛋”(即梵天诞生的金卵,金卵的其他部分扩张为整个宇宙)这个概念。
而在中国神话中,认为天地是由盘古“开天辟地”所致,而当时混沌的世界就如同一个蛋一样。
摘自维基百科《先有鸡还是先有蛋》
神话中也是如此,没有明确提及到底神先创造了鸡蛋还是先创造了鸡,只说了创造了飞禽走兽。
“世界上先有鸡还是先有鸡蛋”存在辩证歧义的原因在于,如果先有鸡,那么孵出鸡的蛋是不是鸡蛋;如果先有鸡蛋,那么是不是只有鸡生的蛋才算是鸡蛋。从概念定义上分析,无论是先有鸡还是先有鸡蛋,两种答案都无法避开对方,任何一方的概念定义都需要另一方支撑。从生物学上分析,卵生动物的基因突变可以在母体形成蛋的时候进行突变,也可以在蛋离开母体的时候受到辐射或者化学物质导致的突变,假如在母体内形成蛋的过程中突变(离开母体之前)成鸡的基因,那么下蛋后这颗蛋就是鸡蛋,因为它孵出来100%是小鸡,所以先有鸡蛋;假如蛋离开母体之后受到周围环境影响才基因突变为鸡的基因,那么这颗蛋在生成时不是鸡蛋,但是出生的就是鸡,所以先有鸡,或者说这颗蛋是从别的蛋突变为鸡蛋,可是生物学没有这样的定义。
本人也不懂生物学。在概念和常识上鸡和鸡蛋是相互依赖的——鸡蛋是鸡生的以及鸡是从鸡蛋中孵出来的;联系到编程中的概念——整体与部分,鸡和鸡蛋是一个整体,鸡出生依赖于鸡蛋,鸡蛋创造依赖于鸡,部分无法独立于整体而存在,鸡无法与“鸡和鸡蛋”撇开关系,同样鸡蛋也无法与“鸡和鸡蛋”撇开关系,两个无法完全独立的部分组成了一个整体。在UML中跟“世界上先有鸡还是鸡蛋”关系最为相似就是组合关系和依赖关系
依赖关系(Dependence):假设A类的变化引起了B类的变化,则说名B类依赖于A类。
大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
依赖关系是一种“使用”关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。
组合关系(Composition):也是整体与部分的关系,但是整体与部分不可以分开.
• 组合关系(Composition)也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之 间具有同生共死的关系。
• 在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周期,即成员类的存在依赖于整体类。在UML中,组合关系用带实心菱形的直线表示。
从生命周期上,鸡和鸡蛋相互依赖——依赖关系;从概念定义上,鸡和鸡蛋达成组合关系,相互配合完成了各自的定义。
在C++中对于先有鸡还是鸡蛋也有类似现象。例如以下定义
A.h
===================
class A {
public:
B memberB;
};
B.h
=======================
class B {
public:
A memberA;
};
如果编译的时候直接链接A.h和B.h(假设A.h放在B.h之前),那么编译器会报错找不到类B。这种情况对于新手非常棘手,大学时候在写毕业设计时候就遇到这样问题,当初卡了大半天,后来才明白C和C++编译器允许先声明后定义,类型只要声明后就可以直接使用。所以可以改为
A.h
===================
class B;
class A {
public:
B memberB;
};
B.h
========================
class A;
class B {
public:
A memberA;
};
编译就不会报错。
另外一种特殊情况就是链表节点声明定义
Node.h
=====================
template<class T> class Node {
public:
T data;
Node<T> *next;
};
对于编译器来讲也是先声明后定义,先声明了Node类,然后再定义Node结构体的内容。并且千万记住,Node类的定义中只允许Node的声明引用,不允许有Node的实例。以下代码编译器会报错
Node.h
=====================
template<class T> class Node {
public:
T data;
Node<T> next;// 因为找不到Node的实体,必须用指针引用定义,不支持直接实例化,因为定义不全,如果支持就是引起编译器循环递归,变成了先有鸡还是先有鸡蛋的问题了。
};
以上两种情况我们可以把声明看做鸡蛋,定义看做鸡,先有鸡蛋,然后才能有鸡。如果鸡蛋不完整,那么是不能存在鸡的(Node例子)。