2016-05-01 4 views
2

J'ai deux prolog prédicats qui remplissent des fonctions très similaires, et je voudrais en faire un pour simplifier les choses. Ce sont les prédicats:Prolog - simplification de deux prédicats en un seul

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

Le premier prend un séparateur et une liste de listes, et les réunit en utilisant le séparateur. L'autre fait le contraire, en divisant une liste en une liste d'autres listes basée sur un délimiteur. Même si leurs arguments sont aux mêmes endroits, si j'essaie de les échanger, ils ne fonctionneront pas. Si du tout, comment puis-je faire ces deux prédicats en un?

+2

Ils ne sont pas des fonctions * * Prolog. Ce sont des * prédicats *. – lurker

Répondre

1

append/2 semble viable:

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

méfiez-vous: Peut-être pas universally terminating :-)