FFF团

  •  主页
  •  门户
  •  团队
  •  成员列表
  •  积分
  •  搜索
  •  日历
  •  帮助
  •  查看新帖子
  • 登录 注册

    注册 忘记密码?

FFF团 / 综合版块 / 技术宅 / 非生命体能否实现自我复制?

1 2 下一页 »
  • 1票 - 平均星级:5
  • 1
  • 2
  • 3
  • 4
  • 5
苦文霸非生命体能否实现自我复制?
玻璃心
**
苦文霸  UID 178

帖子:
126

主题:
5

加入时间:
Apr 2020

声望:
43

积分:
3,462.2€
#1
回复
04-09-2020, 01:43 AM
今天在课本(1)看到一个有意思的问题。能否设计一个能自我复制的机器?这个问题看上去并不平凡,容易让人联想到哥德尔不完备定理。书中给出了一个构造,阐述了自我复制的机器是可能的。
(1)《计算理论导引》机械工业出版社.2019. pp.155-159
书中,这个构造可用来反驳以下论证:生命体是高于机械结构的,因为生命体能够自我复制、繁衍,而机器不能。

考虑一个理想的3D打印机(书中为图灵机),能用任何材料打印出任何输入的构造。那么,他能打印自己吗?单纯的自指是无意义的,必须在打印程序中说明要打印的构造。
如果预先知道打印机的构造,输入这个构造即可完成复制。
以C语言作简化的例子,以下是一个很简陋的打印任何长度1000字符以内的输入的程序:(当然这里只能打印出代码,不能打印出整个计算机。)

(代码*)
#include
char s[1000];
int main()
{
    char c;
    int ix=0;
    while((c=getchar())!=EOF) s[ix++]=c;
    for(int i=0;s[i]!=0;i++) printf("%c",s[i]);
    return 0;
}
编译运行这个程序,再把以上代码粘贴进输入框,然后在windows下按ctrl+z并回车即可。平凡地,我们看到输入的代码又被打印了一遍。
现在我们禁止任何输入(能量的供应除外,这里不讨论),一台机器能自动地复制自身吗?简单的想法是,把带有机器构造的输入预置进机器中,然后让机器自己打印。不过这时候机器的构造也随着程序的放入改变了,打印出来的只是原来的自己,不是现在的自己了。
把打印模块本身也写入打印模块,会怎样?
打印M,打印“打印M,”,打印“打印“打印M,”,”......
无穷无尽。

一个巧妙的想法是,把机器分为AB两部分。让A打印B,让B打印A(即机器M=AB的构造为,A:打印B;B:打印A),这样就没有上述的打印“昨日之我”的问题了。不过为了给出A的构造,需要知道B的构造,而B的构造又需要调用A的构造,循环往复,没法实现。
好在只需要一点微小的改动。仍然让A打印B,即A的构造是:打印B。为此,给出B的构造:读入构造信息s,计算出能打印出s的机器构造p,打印p。在这里,s就是B,p就是A。
考虑三个细节。一,B怎么“计算”出机器p。沿用A的模板,只需把A的“打印B”替换成“打印s”(s是输入)即可。(以c语言为例,p就是代码*)
二,B从何处获得输入。只要看看A的输出就行了。
三,A和B可能是不对易的。打印出的应该是AB而非BA,如何把它调过来。这个也简单,让B在打印A之后再打印一次B即可。
即B的构造变为:读入构造信息s,做出p的构造(p:打印s),打印ps。
A打印出的B似乎浪费了,也可以进行优化。实际上A无需打印B,只需要把B的构造呈现给B即可。
这样,A的构造变为,A:把B的构造呈现给B。B的构造相应变为,B:(从A)获取构造信息s,做出p的构造(p:打印s),把s接在p后面打印ps。
以上,一个自我复制的打印机就完成了。不过,如何把其他功能加进来?更实际地说,如何把“自我复制”功能添加进一台机器?
设其他功能模块为T。只要稍微改动B即可:
B:(从A)获取构造信息s,做出p的构造(p:打印s),打印psT。
为此,编写复制模块时,需要知道T的构造。

以下是一个打印自身(源代码)的C语言程序示例。据说(1)有的计算机病毒就是通过类似的方法自我复制的。

(代码**)
#include
char s[]={59,10,32,32,32,32,105,110,116,32,109,97,105,110,40,41,123,10,32,32,32,32,112,114,105,110,116,102,40,34,35,105,110,99,108,117,100,101,32,60,115,116,100,105,111,46,104,62,92,110,99,104,97,114,32,115,91,93,61,123,34,41,59,10,32,32,32,32,102,111,114,40,105,110,116,32,105,61,48,59,115,91,105,93,33,61,48,59,105,43,43,41,32,112,114,105,110,116,102,40,34,37,100,37,99,34,44,115,91,105,93,44,115,91,105,43,49,93,33,61,48,63,39,44,39,58,39,125,39,41,59,10,32,32,32,32,102,111,114,40,105,110,116,32,105,61,48,59,115,91,105,93,33,61,48,59,105,43,43,41,32,112,114,105,110,116,102,40,34,37,99,34,44,115,91,105,93,41,59,10,32,32,32,32,47,47,84,104,105,115,32,99,97,110,32,98,101,32,115,111,109,101,32,111,116,104,101,114,32,99,111,100,101,115,46,40,80,114,101,116,101,110,100,101,100,41,10,32,32,32,32,114,101,116,117,114,110,32,48,59,10,125,10};
    int main(){
    printf("#include \nchar s[]={");
    for(int i=0;s[i]!=0;i++) printf("%d%c",s[i],s[i+1]!=0?',':'}');
    for(int i=0;s[i]!=0;i++) printf("%c",s[i]);
    //This can be some other codes.(Pretended)
    return 0;
}

整个char s[]{...}数组相当于A,main函数相当于B,它可以通过指针s从A获得B的信息。在这里B的信息以ASCII码来表示,那一长串数组内容就是main函数对应的ASCII码(前面再加上一个分号和换行符)。本来想直接用字符串来表示,不过表示时出现引号嵌套的问题,不好解决。
此外,#include行和//注释行相当于上文的T部分,可以添加别的功能,添加完相应地更新B和A即可。
    
后记:感觉这个构造颇可以改造为一个推理作品的绝佳元素,不过我暂时想不出具体的实现。
如果回我了我没反应,可以私聊提醒我一下。
回复
B2
**
kkk  UID 21

帖子:
121

主题:
4

加入时间:
Feb 2020

声望:
13

积分:
3,097.2€
#2
回复
04-09-2020, 06:57 AM
膜拜
幸せになるには、失敗を繰り返さなければいけません。
回复
无 风 却 起 千 层 浪
*
kimo-XD  UID 63

帖子:
893

主题:
16

加入时间:
Feb 2020

声望:
105

积分:
4,164.2€
#3
回复
04-09-2020, 07:37 AM
吃瓜观众瑟瑟发抖 Confused
Are you the hunter... or the prey? 
回复
枪骑兵
**
三好学生  UID 20

帖子:
140

主题:
2

加入时间:
Feb 2020

声望:
11

积分:
3,074.7€
#4
回复
04-09-2020, 07:39 AM
看不懂
要坚强,要独当一面
回复
B2
**
超级玛丽  UID 18

帖子:
63

主题:
1

加入时间:
Feb 2020

声望:
10

积分:
3,094.7€
#5
回复
04-09-2020, 09:06 AM
我读书少,目测很高端 Huh
相信美好的事情终将到来
回复
玻璃心
**
苦文霸  UID 178

帖子:
126

主题:
5

加入时间:
Apr 2020

声望:
43

积分:
3,462.2€
#6
回复
04-09-2020, 01:41 PM
那...我回头试试看能不能写得直白一点
如果回我了我没反应,可以私聊提醒我一下。
回复
异界士
*
椰奶芒果冻  UID 95

帖子:
57

主题:
11

加入时间:
Mar 2020

声望:
34

积分:
3,453.2€
#7
回复
04-09-2020, 06:51 PM
我的愿望是我能再许三个愿望 Blush
回复
B1
*
Gekoo  UID 190

帖子:
2

主题:
0

加入时间:
Apr 2020

声望:
5

积分:
3,123.2€
#8
回复
04-10-2020, 09:54 PM
还在高中,没有系统学习计算机科学的前信息学竞赛选手说一下自己的思路。
我曾经在loj做过一道类似的题目,程序输出源代码本身,这是我的代码。
代码:
#include <cstdio>

int main() {
  FILE* out = std::fopen(__FILE__, "r");
  char ch;
  while ((ch = std::fgetc(out)) != EOF) {
    std::putchar(ch);
  }
  return 0;
}

它利用了编译器__FILE__这个宏定义,表示代码文件名。运行这个程序A,它会打印源代码本身。
那么如果我们再写一个程序B,来控制它,运行程序A,输出到新的代码文件并编译,每新建了新的可执行文件就运行它,并用新的线程来控制它,重复这个过程,如果算力是理想化的,是否可以达成无限自我复制?
回复
玻璃心
**
苦文霸  UID 178

帖子:
126

主题:
5

加入时间:
Apr 2020

声望:
43

积分:
3,462.2€
#9
回复
04-11-2020, 01:30 AM
(04-10-2020, 09:54 PM)Gekoo 提到: 还在高中,没有系统学习计算机科学的前信息学竞赛选手说一下自己的思路。
我曾经在loj做过一道类似的题目,程序输出源代码本身,这是我的代码。
代码:
#include <cstdio>

int main() {
  FILE* out = std::fopen(__FILE__, "r");
  char ch;
  while ((ch = std::fgetc(out)) != EOF) {
    std::putchar(ch);
  }
  return 0;
}

它利用了编译器__FILE__这个宏定义,表示代码文件名。运行这个程序A,它会打印源代码本身。
那么如果我们再写一个程序B,来控制它,运行程序A,输出到新的代码文件并编译,每新建了新的可执行文件就运行它,并用新的线程来控制它,重复这个过程,如果算力是理想化的,是否可以达成无限自我复制?

我是个半吊子,没研究过病毒,不太懂真实的程序是怎么复制的orz(我猜肯定不会复制源代码)。就复制源代码自身而言,你的程序是可行的,只是不能移植到自我复制机器上。(本质上是编译后的程序复制源代码,不是自己复制自己)
又,好像有人做出了自我复制的分子机器,参见Zykov et al., Self-reproducing Machines, 2005
程序方面还有个自我复制神经网络,因为看不懂,我就没看 
Oscar Chang, Hod Lipson, Neural Network Quine, 2018
如果回我了我没反应,可以私聊提醒我一下。
回复
玻璃心
**
苦文霸  UID 178

帖子:
126

主题:
5

加入时间:
Apr 2020

声望:
43

积分:
3,462.2€
#10
回复
04-11-2020, 01:33 AM
(04-09-2020, 06:51 PM)椰奶芒果冻 提到: 我的愿望是我能再许三个愿望 Blush

这个想法不错
如果回我了我没反应,可以私聊提醒我一下。
回复
B2
**
gakki  UID 16

帖子:
131

主题:
11

加入时间:
Feb 2020

声望:
18

积分:
3,115.2€
#11
回复
04-11-2020, 07:51 AM
现在的高中生都已经这么强了吗?膜拜
回复
B2
**
白石麻衣  UID 8

帖子:
102

主题:
3

加入时间:
Feb 2020

声望:
16

积分:
3,105.7€
#12
回复
04-11-2020, 08:00 AM
来学习
回复
成精的荔枝
***
yoyo06727  UID 80

帖子:
137

主题:
12

加入时间:
Feb 2020

声望:
62

积分:
3,760.2€
#13
回复
04-11-2020, 11:15 AM
膜拜orz
黑夜给了黑夜的人一道光
这星空三千丈扇一扇摘月亮
( ̄▽ ̄)"
回复
A3
***
水门lu  UID 128

帖子:
414

主题:
37

加入时间:
Mar 2020

声望:
67

积分:
3,610.7€
#14
回复
04-11-2020, 12:48 PM
答案是程序
回复
B1
*
克劳塞维茨  UID 432

帖子:
4

主题:
0

加入时间:
Jan 2021

声望:
2

积分:
1,514.4€
#15
回复
01-02-2021, 06:54 PM
ai模型gpt3已经可以做到生成另一个更有效的gpt模型。
回复
1 2 下一页 »


  • 查看可打印版本

    关于我们

    FFF团是一个完全基于兴趣驱动的ACG社区,欢迎小伙伴们来玩。我们的征途是星辰大海!

    声明

    本站不提供任何上传下载服务,所有内容均可以免费阅读。已知来源的图片均注明了出处,版权归原作者所有。不承担任何法律责任,如发现有侵权请联系删除。详细请查看服务条款

    社区致力于打造绿色健康的网络环境,积极践行社会主义核心价值观,如发现任何不良信息请及时举报。

    网上信息举报专区: 中国互联网违法和不良信息举报中心

    友情链接

    Akkariin

    宅日记

    御坂研究所

    云游君

    SSShooter

    喵呜噜

    非人类论坛

    (不再接受)

    价值观

    文明

    和谐

    爱国

    敬业

    诚信

    友善

    联系

    AKIBA

    [email protected]


    Powered by Sora © 2020-2023 All Rights Reserved. FFF团基于开源BBS深度定制开发 全网公测3.0
平板模式
树状模式