使用prolog列出操作

时间:2016-09-24 06:09:46

标签: prolog

我正在尝试创建一个回复以下内容的查询:

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([],[]).

有人可以解释为什么它不会工作以及它背后的过程,就像视觉指南一样。谢谢!

1 个答案:

答案 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}}