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



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

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系统实现了常见的第一个自变量索引。你能把这个谓词修改成你想要的吗?

剪切删除的一般经验法则是注意包含剪切的子句中的true是什么,然后确保其他子句中的是false

因此:

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

相关内容

最新更新