在prolog的列表中的每个原子之前添加一个字符

时间:2014-10-12 03:45:06

标签: prolog

我正在努力学习Prolog。我想写一个谓词,它会放置气泡'在列表中的每个原子之前。空列表不变。

?-addbubbles([a,b,8,c],X).

X=[bubbles,a,bubbles,b,8,bubbles,c]

我写了以下代码:

Addbubbles([],[]).

addbubbles([H|T],[A|B]) :-append([bubbles],[H],A),addbubbles(T,B).

但输出并不像预期的那样:

?- addbubbles([a,v,2,4,f],M).

M = [[bubbles,a], [bubbles,v], [bubbles,2], [bubbles,4], [bubbles,f]] ;

如何删除额外的括号,以便输出为:

M = [bubbles,a, bubbles,v,bubbles,2,bubbles,4,bubbles,f];

1 个答案:

答案 0 :(得分:1)

您不需要在此处使用append/3。只需逐字记下规范:

% The empty list is left alone:
addbubbles([], []).

% Add 'bubbles' before each element in the list (recursively):
addbubbles([Element|OldTail], [bubbles,Element|NewTail]) :-
    addbubbles(OldTail, NewTail).

列表的格式为[Element1, Element2, Element3… | Tail]。因此,您可以使用[bubbles,Element|NewTail]添加两个元素。

它有效:

?- addbubbles([a,b,8,c],X).
X = [bubbles, a, bubbles, b, bubbles, 8, bubbles, c].

?- addbubbles(X, [bubbles, a, bubbles, b, bubbles, 8, bubbles, c]).
X = [a, b, 8, c].

如果您想使用append/3,则需要展平列表。 C.F. " Flatten a list in Prolog"

但请注意代码中的拼写错误。在Prolog中,你用一个点来完成子句,大写是很重要的。