我从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
函数)列表时,将其反转然后将其附加到列表的头部。
你能帮帮我们吗?
答案 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).