我有一个功课,我们应该为任何通用数据类型实现功能数据类型。该类的规范以代数形式给出。我在解释它时遇到了问题,并希望得到一些帮助。
以下是我们以代数形式得到的规范:
T是任何通用数据类型
值 V = {nil}∪T
表达式 E = {(cons e1 e2)| e1,e2∈E}∪V 设L ^n⊂E只包含形式的表达式(cons e1(cons e2 ...(cons en nil)...) 对于某些n∈N,所有ei∈T。更进一步L ^ * =⋃n∈NL^ n。
功能
空?:E→{true,false},e↦{如果e = nil则为true,否则为false
首先:L ^ *→E,(cons e1 e2)↦e1
休息: L ^ *→E,(cons e1 e2)↦e2
前置:E×L ^ *→L ^ *,e,(cons e1 e2)↦(cons e(cons e1 e2))
ith :( L ^ *)×N→E,(cons e1 ...(cons ei ...(cons en nil)...),i↦ei为0< ;i≤n
长度:L ^ *→N,l∈L^n↦n
以下是我的解释:
值:值属于T类,为nil(null)
表达式:
不确定E是否是由常数e1,e2 ......组成的数组,并且L ^ n也是由e1,e2 ... en组成的数组?不理解(consn nil)部分...是否应该是nil的常量?
功能
空?函数为空应该检查E数组中的元素是否有值。
first:返回第一个元素
rest:返回没有第一个元素的新数组
prepend:将常数e放在数组中。
ith:不确定,可能会根据输入返回n个元素。
长度:给出列表L的长度
这些表达方式有点乱,但有人可以给我一些反馈意见吗?提前谢谢。
答案 0 :(得分:0)
让T
成为int
。然后V
是任何int或nul。现在,表达式可以是cons(x y)
,其中x,y
是int或nuls或其他表达式,例如:
1
cons(2 3)
cons(cons(4 5) cons(6 7))
L^n
是一种特殊的表达式,cons
的第一个参数限制为T
,最内层的原子必须为nul。所以这个
cons(1 cons(2 cons(3 nul)))
是有效的L^n
(具体为L^3
),而这不是
cons(cons(4 5) cons(6 7))
(作为旁注,L^n
是lisp中的list
,而E
是通用pair
。)
在您的一组功能中,只有empty?
(又名nil
),first
(= car)和rest
(= cdr)是原始的,其他的可以定义就他们而言(前提是你也有条件),例如:
length(E) = 0 if empty(E) else 1 + length(rest(E))