Prolog中的反向列表

时间:2017-10-21 00:18:03

标签: list prolog reverse

我从prolog开始,作为练习,我试图扭转一个列表。

例如,inv([1,2,3], S)应该S = [3,2,1]. 以下是合作伙伴和我已经完成的事情:

conc([], L, L).
conc([X|L1], L2, [X|L3]) :- conc(L1, L2, L3).

tail([X|Y], S) :- conc([], Y, S).

inv([X|Y], S) :- tail([X|Y], TAIL), inv(TAIL, R_TAIL), conc(R_TAIL, X, S).
inv([], []).

前三行效果很好。但是真的不明白最后两个是怎么回事,因此如何解决它。 我只是想找到尾部(这是有效的,当我只使用tail函数)列表时,将其反转然后将其附加到列表的头部。 你能帮帮我们吗?

2 个答案:

答案 0 :(得分:2)

替代基于foldl / 4的解决方案:

prepend_element(E, L, [E|L]).

inv(List, Reversed) :-
    foldl(prepend_element, List, [], Reversed).

答案 1 :(得分:1)

您的代码对我不起作用。

请尝试这种方式:

?- reverse([1,2,3],Xs), write(Xs).

reverse(Xs,Ys) :- reverse(Xs,[],Ys).

reverse([],A,A).
reverse([H|T],R,A) :- reverse(T,[H|R],A).