append(X,[Y],Z)
找到最后一个元素是民间知识
列表Y
的{{1}}和剩余列表Z
。
但是有一个自定义谓词X
的优点,
即它可以在不留下选择点的情况下作出反应:
last/3
有没有办法实现不同的实现
?- last([1,2,3],X,Y).
X = 3,
Y = [1,2]
?- append(Y,[X],[1,2,3]).
Y = [1,2],
X = 3 ;
No
也不会留下选择点
上面的例子?
P.S。:我在比较:
append/3
和(àlaGertjan van Noord):
/**
* append(L1, L2, L3):
* The predicate succeeds whenever L3 unifies with the concatenation of L1 and L2.
*/
% append(+List, +List, -List)
:- public append/3.
append([], X, X).
append([X|Y], Z, [X|T]) :- append(Y, Z, T).
答案 0 :(得分:1)
一种方法是使用foldl/4
和相应的帮助谓词:
swap(A, B, B, A).
list_front_last([X|Xs], F, L) :-
is_list(Xs),
foldl(swap, Xs, F, X, L).
应该是这样:
?- list_front_last([a,b,c,d], F, L).
F = [a, b, c],
L = d.
?- list_front_last([], F, L).
false.
?- list_front_last([c], F, L).
F = [],
L = c.
?- Ys = [y|Ys], list_front_last(Ys, F, L).
false.
尝试查看是否可以省略定义中的is_list/1
。