Prolog复制列表中的单词

时间:2017-07-07 18:12:33

标签: list prolog duplicates

我有一个复制整个列表的Prolog代码,但我想要的只是复制一个单词(例如'a')。例如;

(0, fn)();

我的代码重复列表dups([],[]). dups([H|T],[H,H|Y]) :- dups(T,Y). ,如=> [a,b]

但我想要的是,重复列表[a, a ,b ,b]喜欢=> [a, b]

1 个答案:

答案 0 :(得分:2)

由于您正在描述列表,因此您可以选择使用DCG。请考虑以下规则:

x_dup(_X,[]) -->       % if the input list is empty
   [].                 % the output list is empty
x_dup(X,[X|Ys]) -->    % if X and the head of the list are equal
   [X,X],              % X is twice in the output list
   x_dup(X,Ys).        % the same holds for X and the tail
x_dup(X,[Y|Ys]) -->    % if X and the head of the input list
   {dif(X,Y)},         % are different
   [Y],                % the head is once in the output list
   x_dup(X,Ys).        % the same holds for X and the tail

如果您只想复制列表的头部,可以像这样定义调用谓词:

dups([],[]).                    % <- only for empty list
dups([X|Xs],L) :-
   phrase(x_dup(X,[X|Xs]),L).

第一条规则仅用于处理空列表。如果您不想让您的谓词涵盖该案例,则只需省略第一条规则。使用您的示例查询此结果会产生所需的结果:

   ?- dups([a,b,a,a,c,c,c],L).
L = [a,a,b,a,a,a,a,c,c,c] ? ;
no

或者,您可以定义调用谓词,以便可以复制任意元素。在这种情况下,您需要一个额外的参数来指定要复制的元素:

dups(X,L1,L2) :-
   phrase(x_dup(X,L1),L2).

一些示例查询:

   ?- dups(a,[a,b,a,a,c,c,c],L).
L = [a,a,b,a,a,a,a,c,c,c] ? ;
no
   ?- dups(b,[a,b,a,a,c,c,c],L).
L = [a,b,b,a,a,c,c,c] ? ;
no
   ?- dups(c,[a,b,a,a,c,c,c],L).
L = [a,b,a,a,c,c,c,c,c,c] ? ;
no
   ?- dups(d,[a,b,a,a,c,c,c],L).
L = [a,b,a,a,c,c,c]