2015-02-24 58 views
1

编写一个复制列表中每个元素的函数。例如: {Duplicate [1 2 3]}返回列表[1 1 2 2 3 3]。复制列表中的元素OZ

我该如何在OZ莫扎特做到这一点?我不知道盎司的sintaxis,在序言中会是这样的:

even(N) :- 
    N mod 2 =:= 0.  

doubleeven([],[]). 

doubleeven([H|T], [H,H|Z]) :- 
    even(H), 
    !, 
    doubleeven(T,Z). 

doubleeven([H|T], [H|Z]) :- 
    doubleeven(T,Z). 

回答

0

这是一个基于模式识别的解决方案。你检查输入的数据是否是一个列表(即它有一个Head和一个尾(H | T)),然后第一个元素绑定到变量标识符H.这样,你可以通过添加两个H在你继续与列表中的其他人做同样的事情之前。如果L为零,请记得返回nil - 空列表,以便您的最终答案也是一个列表。

declare 
fun {Duplicate L} 
    case L of H|T then 
     H|H|{Duplicate T} 
    else 
     nil 
    end 
end 

{Browse {Duplicate [1 2 3]}}