Day 77:合一
18年11月16日 · 北京理工大学-胡依梦 1016 人阅读
合一算法
这个合一的过程允许我写一点儿精神飘忽的函数,用过Prolog编程的小伙伴们,你们应该知道我要做什么吧。
首先,问题来了,什么是合一?它跟平等类似但是是一个更深层次的概念,我将会说得比较正式。
平等的意思是说若有两个对象X和Y是平等的,即X=Y,当且仅当它们均属于相同的类E。换个说法就是,相等是对象X的一种属性并且这意味着X属于类。
合一,从另一方面来说,是指有两个对象X和Y是统一的,X=Y,当且仅当它们都代表着相同的实体。
在此之前,合一带来了有界和无界变量的概念,无界变量总是可以被合一的(甚至是和它们自己),而有界变量只有在它的有界值能够被合一的时候才能被合一。
举个栗子吧,这样可以理解得更清楚。假设X与Y均为无界变量。
为了达到我的目的,我使用以下Python类型:
- 整型--表示基值。
- 字符型--表示变量。
- 元组--表示复合结构。
我也会用嵌套元组表示列表,例如:(1, (2, (3, tuple()))) 就是值[1,2,3]的一个列表。
相关
现在我能够实现一个函数功能就是用递归定义将两个列表串联起来。
conc(PREFIX, SUFFIX, RESULT)
- 如果PREFIX为空,那么SUFFIX是RESULT。
- 否则,SUFFIX位于PREFIX的头部,同时RESULT连在PREFIX的尾部。
让我们来试试看,要记住字符型代表的是无界变量。
所以说,我已经写了100多行代码,就为了把一个列表附加到另一个列表上?这可一点也不酷。
来看看下面这个:
我需要做什么让[1, 2]变成[1, 2, 3, 4]呢?并且相同的功能可以得到[3, 4]的结果?
有没有更酷的东西?
我仅仅知道结果是[1, 2, 3, 4],我连接了什么呢?而且它给了我所有可能的答案。
接下来是终结版。
如果我既不知道前缀后缀也不知道结果,那么答案就会非常吸引人,我会得到所有可能的列表,直到堆栈溢出,游戏结束。
算法实现
测试
Python3Turtle