我有一个复制整个列表的Prolog代码,但我想要的只是复制一个单词(例如'a')。例如;
(0, fn)();
我的代码重复列表dups([],[]).
dups([H|T],[H,H|Y]) :-
dups(T,Y).
,如=> [a,b]
。
但我想要的是,重复列表[a, a ,b ,b]
喜欢=> [a, b]
。
答案 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]