我正在尝试创建一个回复以下内容的查询:
sky([1,2,3,4,5,6],X).
X = [1,3,5,2,6,4]
也就是说,它会取出列表中的所有其他元素,并在剩余列表中执行相同操作并将所有内容放在一起。
到目前为止,这是我的代码。
sky([X|Y], Skied):-
split([X|Y],Z1),
split(X,Z2),
sky(Z2,Z3),
append(Z1,Z3,Skied).
sky([],[]).
split([X,_|T], [X|R]):-
split(T,R).
split([X|[]], [X]).
split([],[]).
有人可以解释为什么它不会工作以及它背后的过程,就像视觉指南一样。谢谢!
答案 0 :(得分:1)
您的代码几乎是正确的,而不是split(Y,Z2)
您需要编写split(X,Z2)
。这是因为X是单个元素而[X]
将返回split(Y,Z2)
,如果我理解正确的话,那就不是你想要的。您需要编写sky(Y,Z3)
来获取偶数元素(或在您的描述中每隔一个元素)并调用sky([X|Y], Skied):-
split([X|Y],Z1),
split(Y,Z2),
sky(Z2,Z3),
append(Z1,Z3,Skied).
sky([],[]).
split([X,_|T], [X|R]):-
split(T,R).
split([X|[]], [X]).
split([],[]).
以递归方式执行相同操作。所以新版本是:
?- sky([1,2,3,4,5,6],X).
X = [1, 3, 5, 2, 6, 4] ;
false.
?- sky([1,2,3,4,5,6,7,8,9],X).
X = [1, 3, 5, 7, 9, 2, 6, 4, 8] ;
false.
一些例子和输出:
{{1}}