Prolog - 将两个谓词简化为一个

时间:2016-05-01 23:12:42

标签: list split prolog predicate inverse

我有两个prolog谓词执行非常相似的功能,我想将它们合二为一,以简化操作。 这些是谓词:

join(DELIM, [X|XS], RESULT) :-
    join(DELIM, XS, RXS),
    append([X, DELIM, RXS], RESULT).
join(DELIM, [END], END).

split(DELIM, [X|XS], RESULT) :-
    append([X, DELIM, RXS], RESULT),
    split(DELIM, XS, RXS).
split(DELIM, [END], END).

第一个采用分隔符和列表列表,并使用分隔符将它们连接在一起。另一个则相反,将一个列表拆分为基于分隔符的其他列表的列表。即使他们的论点在同一个地方,如果我试图交换它们,它们也行不通。 如果有的话,我怎样才能将这两个谓词合而为一?

1 个答案:

答案 0 :(得分:1)

append/2似乎可行:

delim(D, Xs, [Ls|Ys]) :-
    append([Ls, D, Rs], Xs),
    delim(D, Rs, Ys).
delim(_, Xs, [Xs]).

?- delim([x],[1,x,2,3,x,4],R).
R = [[1], [2, 3], [4]] ;
...

?- delim([x],Xs,[[1], [2, 3], [4]]).
Xs = [1, x, 2, 3, x, 4] 
.

要注意:可能不是universally terminating: - )