Prolog追加/ 3实现更多的决定论?

时间:2015-02-28 11:50:47

标签: prolog

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

1 个答案:

答案 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