打印列表元素,但最后一个元素的处理方式不同

问题描述 投票:1回答:2

我写了一个谓词,可以打印出列表中除最后一个元素之外的每个元素。最后一个元素应以不同的方式处理;它应该打印LAST!。这就是我所拥有的。

write_data([]).
write_data([X]) :-
    !, write('LAST!'), nl.
write_data([X | Rest]) :-
    write(x), nl,
    write_data(Rest).

有更好的方法吗?有没有办法做到这一点而无需削减?

prolog
2个回答
0
投票

您可以通过对包含至少两个元素的列表执行统一操作来避免割伤,例如:

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).

0
投票

提供访问列表最后一个元素的last/2谓词的通用定义是:

last([Head| Tail], Last) :-
    last(Tail, Head, Last).

last([], Last, Last).
last([Head| Tail], _, Last) :-
    last(Tail, Head, Last).

[当第一个参数绑定到封闭列表时进行调用时,辅助谓词last/3避免了将Prolog系统实现为常见的第一参数索引的虚假选择点。您可以修改此谓词以执行您想要的操作吗?

© www.soinside.com 2019 - 2024. All rights reserved.