我编写了一个谓词,它打印出列表中除最后一个元素外的每个元素。最后一个要素应该以不同的方式处理;它应该打印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).