我写了一个谓词,可以打印出列表中除最后一个元素之外的每个元素。最后一个元素应以不同的方式处理;它应该打印LAST!
。这就是我所拥有的。
write_data([]).
write_data([X]) :-
!, write('LAST!'), nl.
write_data([X | Rest]) :-
write(x), nl,
write_data(Rest).
有更好的方法吗?有没有办法做到这一点而无需削减?
您可以通过对包含至少两个元素的列表执行统一操作来避免割伤,例如:
write_data([]).
write_data([_]) :-
write('LAST!'),
nl.
write_data([X|Rest]) :-
Rest = [_|_],
write(X), nl,
write_data(Rest).
我们可以进一步避免使用辅助谓词进行双重拆包:
write_data([]).
write_data([H|T]) :-
write_data(T, H).
write_data([], _) :-
write('LAST!'), nl.
write_data([H|T], X) :-
write(X), nl,
write_data(T, H).
提供访问列表最后一个元素的last/2
谓词的通用定义是:
last([Head| Tail], Last) :-
last(Tail, Head, Last).
last([], Last, Last).
last([Head| Tail], _, Last) :-
last(Tail, Head, Last).
[当第一个参数绑定到封闭列表时进行调用时,辅助谓词last/3
避免了将Prolog系统实现为常见的第一参数索引的虚假选择点。您可以修改此谓词以执行您想要的操作吗?